[클라우드] 웹, 앱, db 확장

최동혁·2023년 2월 14일
0

클라우드

목록 보기
2/18

아파치 2대 설정 (Web Servers)

  • 이전 게시글 아파치 설정하는 방법으로 총 2대 만들기.

워커 파일 설정 변경

  • 만들어 놓은 것에서 워커 파일의 설정을 변경해줘야 한다.
LoadModule jk_module /usr/lib64/httpd/modules/mod_jk.so
	
		<IfModule jk_module>
			JkWorkersFile /etc/httpd/conf/workers.properties
			JkLogFile /var/log/httpd/mod_jk.log
			JkLogLevel info
			JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
			JkMount /*.jsp loadbalance		<----- 이 부분
		</IfModule>
  • vi /etc/httpd/conf/httpd.conf 파일에서 저 부분을 worker1에서 loadbalance로 변경

  • vi /etc/httpd/conf/workers.properties 에 가서 위의 그림처럼 설정
worker.list=tomcat1,tomcat2,loadbalance

worker.tomcat1.type=ajp13
worker.tomcat1.host=[톰캣1의 IP]
worker.tomcat1.port=8009
worker.tomcat1.lbfactor=1
		
worker.tomcat2.type=ajp13
worker.tomcat2.host=[톰캣2의 IP]
worker.tomcat2.port=8009
worker.tomcat2.lbfactor=1

worker.loadbalance.type=lb
worker.loadbalance.balance_workers=tomcat1,tomcat2
  • 여기서 lbfactor는 각자 톰캣의 어떤 비율로 분배해줄거냐이다.

  • 위에서는 1, 1로 설정해서 1:1로 분배해준다는 뜻이다.

  • 위의 설정들을 다 했다면 웹 서버를 재시작하자.

  • systemctl restart httpd

톰캣 2대 설정 (Web Application Servers)

  • 이것도 이전 게시글에서 설정했던 톰캣 설정대로 2대를 만들어야 한다.
  • /usr/local/tomcat9/webapps/cdh 경로에 test.jsp 파일 하나 생성
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<%@ page import="java.net.InetAddress" %>


클라이언트 IP <%=request.getRemoteAddr()%><br>
요청URI <%=request.getRequestURI()%><br>
요청URL: <%=request.getRequestURL()%><br>
서버이름 <%=request.getServerName()%><br>
<%
InetAddress inet= InetAddress.getLocalHost();
%>
동작 서버 IP <%=inet.getHostAddress()%><br>
서버포트 <%=request.getServerPort()%><br>
  • 위의 코드를 집어넣자.
  • 웹 어플리케이션 서버인 톰캣 1과 톰캣 2로 분산이 잘 되는지 확인하기 위해서이다.

톰캣 실행

  • 물론 위의 설정대로 2대 다 설정이 되어있어야 한다.
  • /usr/local/tomcat9/bin/shutdown.sh
  • /usr/local/tomcat9/bin/startup.sh

  • 그 후, 웹 서버인 아파치 서버로 브라우저 접속을 해보면 새로고침을 할 때마다 동작 서버 ip가 바뀌는 것을 볼 수 있다.
  • 접속할 때마다 아파치 내부에서 톰캣1, 톰캣2로 분산시켜서 보내주는 것이다.

haproxy 설정 (Client Delivery Network)

  • 30번으로 설정

방화벽 해제

  • systemctl stop firewalld
  • systemctl disable firewalld
  • setenforce 0

haproxy 설치

  • yum install -y haproxy

설정

  • vi /etc/haproxy/haproxy.cfg 들어가서 가장 하단으로 내려서 위의 그림과 같이 설정
  • 아마 다른식으로 설정되어 있을텐데 backend app에 써있는 것 제외하고 listen stats부터 싹 다 바꾸기
listen stats
	    bind :9000
	    stats enable
	    stats realm Haproxy\ Statistics
	    stats uri /haproxy_stats
	
listen web-lb
	    bind 0.0.0.0:80
	    mode http
	    balance roundrobin
	    option httpchk GET /test.html
	
	    server web1 [아파치1 IP]:80 check
	    server web2 [아파치2 IP]:80 check
  • httpchk GET /test.html 이건 해당 파일로 접근했을 때 서버가 죽었는지 살았는지 해당 경로에 존재하는 파일을 확인해서 알려준다.
  • 그래서 존재하는 파일을 써줘야 한다!
  • haproxy는 아파치 서버에 있는 test.html을 확인한다.
  • 그렇기 때문에 아파치 서버의 /var/www/ 디렉토리에 test.html을 만들어서 넣어준다. 내용은 상관없다.
    • 2대 모두 해놔야 haproxy_stats에 들어갔을때 연결된 것을 확인할 수 있다.
  • 마지막으로 systemctl restart haproxy로 재시작을 해준다.

  • haproxy 서버의 ip:9000/haproxy_stats 에 들어가면 아파치1(web1)과 아파치2(web2)가 연결된 것을 확인할 수 있다.

결론

  • haproxy가 웹 서버인 아파치를 roundrobbin 알고리즘을 이용해 분산해준다.
  • 우리는 haproxy 서버로 접속을 한 후에, 아파치 서버 2개 중 1개로 이동 후, jsp 파일을 요청하면 톰캣 서버 1이나 2로 또 다시 분산이 된다.
  • 톰캣으로 분산은 아파치 내부의 load balancer가 해준다.
  • 아까 아파치 서버 1개에 톰캣 2개로 분산했을때는 새로고침을 할 때마다 ip가 바뀌었다.
  • 그런데 이제 아파치 서버 2개로 해놓고 haproxy로 분산 처리를 하면 새로 고침 할 때마다 바뀌지는 않는다.
  • 왜냐면 2개의 톰캣 서버 위에 2개의 아파치 서버가 있어서 이기 때문이다.

  • 지금까지 한 내용이 위의 그림과 같다.
  1. client가 haproxy 서버에 접속
  2. haproxy가 아파치 Web Server로 분산 처리
  3. jsp 파일 요청이 들어오면, 아파치 Web Server의 load balancer가 톰캣 Application Server로 분산 처리
  4. 마지막으로 DB를 master와 slave로 나누어서 master에 쓰고 slave에서 읽기까지
  • 이것이 흔한 웹의 아키텍처이다!

추가로 실제 웹 구현해보기

html 및 js 다운로드

다운로드

  • 위의 파일을 wget을 이용해 위에서 설정한 아파치 서버의 /var/www 경로에 다운받고, 압축을 해제하자.

  • 그러면 html 디렉토리 안에 여러 파일들이 있을 것이다.

  • 위에서 설정한 아파치 서버는 두 개이다. 나머지 아파치 서버도 똑같이 다운 받고 압축을 해제하자.

  • 그리고 haproxy 서버/index.html 에 접근을 해본다면?

  • 여기어때 페이지로 이동이 된다.

  • 하지만 위의 그림처럼 메인 페이지에 호텔 데이터들이 나오지 않는다.
  • 이것은 프론트만 연결이 되었을 뿐, jsp 파일을 요청했을 때 톰캣으로 이동이 되는데, 톰캣에 특정 jsp 파일이 없고, 데이터 베이스도 연동이 되어있지 않아서 그렇다.
  • F12를 눌러서 네트워크쪽을 간 후, 새로고침을 눌러보면

  • 위의 사진처럼 나오게 된다.
  • 새로고침을 할 때마다 hotel.jsp와 통신을 하는 것을 볼 수 있다.
  • 하지만 우리는 톰캣 서버에 hotel.jsp 파일이 없다..
  • 그렇기 때문에 톰캣 서버에 hotel.jsp 파일을 만들어주도록 하자.
<%@page import="java.sql.*"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
        <%
                Connection conn = null;
                ResultSet rs = null;

                String url = "jdbc:mysql://(db 서버):3306/good?serverTimezone=UTC";
                String id = "(db 서버 원격 관리자 id)";
                String pwd = "(db 서버 원격 관리자 비번)";


                try {
                        Class.forName("com.mysql.jdbc.Driver");
                        conn = DriverManager.getConnection(url, id, pwd);
                        Statement stmt = conn.createStatement();


                        String sql = "SELECT * FROM product";
                        rs = stmt.executeQuery(sql);

                        String result = "[";


                        while(rs.next()) {
                                result += "{";
                                result += "\"name\":\""+rs.getString("name")+"\"";
                                result += ", \"img_url\":\""+rs.getString("img_url") +"\"";
                                result += ", \"price\":\""+rs.getString("price")+"\"";
                                result += "},";
                        }
                        result = result.substring(0, result.length() - 1);
                        result += "]";
                        out.println(result);

                        conn.close();
                } catch (Exception e) {

                        e.printStackTrace();
                }
        %>
  • 위의 코드를 톰캣 서버 2곳에 전부 집어넣자.
  • 그리고 나서 db 서버와 연동시켜야 한다.
  • 일단 연동하기 전에 톰캣 서버에서 설정을 해야 한다.

톰캣 설정

  • wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.19.tar.gz 다운로드 (꼭 톰캣 서버에서 다운)

  • tar xvf mysql-connector-java-8.0.19.tar.gz 로 아카이브 해제

  • 아카이브 해제한 파일로 이동

  • cp mysql-connector-java-8.0.19.jar /usr/local/tomcat9/lib/ 해당 경로에 복사

  • 톰캣 재시작

  • /usr/local/tomcat9/bin/shutdown.sh

  • /usr/local/tomcat9/bin/startup.sh

  • 위의 과정을 톰캣 2 서버에도 똑같이 해준다.

db 설정

방화벽 해제

  • systemctl stop firewalld
  • systemctl disable firewalld
  • setenforce 0
  • db 서버 열기(vm 다른거)

mysql 설치 및 초기 설정

  • yum -y install mysql-server
  • systemctl restart mysqld 로 실행
  • mysql_secure_installation 로 비밀번호 설정
  • y 0 qwer1234 qwer1234 y y y y
  • good.sql 파일 생성
CREATE DATABASE  IF NOT EXISTS `good` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE `good`;
-- MySQL dump 10.13  Distrib 8.0.32, for Win64 (x86_64)
--
-- Host: 192.168.214.50    Database: good
-- ------------------------------------------------------
-- Server version	8.0.26

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `product`
--

DROP TABLE IF EXISTS `product`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `product` (
  `name` varchar(10) DEFAULT NULL,
  `img_url` varchar(100) DEFAULT NULL,
  `price` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `product`
--

LOCK TABLES `product` WRITE;
/*!40000 ALTER TABLE `product` DISABLE KEYS */;
INSERT INTO `product` VALUES ('서울 콘래드호텔','5a8bda503a8f6.jpg',490000),('서울 신라호텔','5e994464f3d0d.jpg',300000),('더 디자이너스','5743fc51c9d2b.jpg',987654321);
/*!40000 ALTER TABLE `product` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2023-02-14 17:13:36
  • 위의 내용을 입력
  • 파일을 적용
    • mysql -u root -p < good.sql
    • sql에 우리가 설정한 good.sql을 백업하자.

원격 접속 허용 계정 생성

  • CREATE USER '[DB 계정]'@'%' identified by '[DB 비번]';

  • GRANT ALL PRIVILEGES ON [DB이름].* TO '[DB 계정]'@'%';

  • FLUSH PRIVILEGES;

  • DB 계정은 본인이 쓸 계정, DB 비번도 마찬가지

  • DB 이름은 good이다.

  • 이렇게 설정을 한 후, ifconfig를 켜서 ip를 기억해두자.

톰캣 다시 설정

  • 아까 hotel.jsp 파일 안에 db의 ip 주소와 관리자 id, 비번을 입력하는 란이 있었다.
  • 위에 원격 접속 허용 계정 생성한 것을 바탕으로 ip 주소와 나머지 정보를 입력해주자.
  • 톰캣 서버는 2개이기 때문에 2개 다 설정해줘야 한다.

결과

  • 우리가 맨 위에서 실습했을때의 아키텍처를 따라가면서 웹 서버에 index.html이 구동되고, 데이터베이스를 불러오는 jsp 파일이 톰캣에서 구동된다.
  • 톰캣에서는 db에 저장되어 있는 정보들을 http 통신으로 얻은 후, 아파치를 통해 다시 haproxy로 나가서 client에게 보여준다.
  • 새로고침 할 때마다 분산 처리되는 것은 당연!
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글