VM웨어로 3-tier 구성하기
1. 3-tier란 무엇인가
3-tier란 일반적으로 클라이언트, 웹/어플리케이션 서버, 데이터베이스 서버로 이루어진 3계층 구조를 가르킨다.
각각의 계층에 대해서 살펴보자
1.1. 클라이언트
클라이언트 계층이란 사용자가 직접 상호작용을 하게 되는 부분을 칭한다.
컴퓨터, 혹은 핸드폰을 사용할 때를 생각 해 보자. 이러한 기기를 통해 웹페이지나 어플에 접근할 때 우리는 만들어진 화면을 보게 된다.
이처럼 만들어진 화면들은 User Interface(i.e. UI)라 부르며, 우리는 이러한 UI를 통해 애플리케이션과 상호작용을 할 수 있다.
클라이언트 계층은 주로 WEB Server를 통해 구현되며, 정적인 컨텐츠(e.g. HTML, CSS, 이미지)들을 요청받아 처리한다.
1.2. 웹/애플리케이션 서버
Web•Application Server(i.e.WAS)는 웹 서버와 DBMS 사이에서 동작하는 미들웨어이다.
쇼핑몰에서 상품을 장바구니에 담거나 결제를 진행하는 상황을 생각 해 보자.
WEB에서 볼 수 있는 UI를 통해 버튼을 클릭하면 WEB은 WAS에 사용자가 결제 요청을 보냈다는 메시지를 전달한다.
이런 메시지를 받은 WAS는 요청을 처리하기 위해 필요한 비즈니스 로직-상품 가격 계산, 재고 관리, 결제 처리 등-을 수행한다.
다시 말해, WAS란 클라이언트 계층의 요청을 처리하는 부분이다.
WAS는 다음과 같은 특징을 가진다.
- WEB으로부터 동적인 컨텐츠(e.g. JSP, ASP, PHP)를 요청받아 처리한다.
- 컨테이너 기반으로 동작한다.
- 백엔드 서버라 부르기도 한다.
- WEB+웹 컨테이너 로 이해해도 무방하다.
1.3. 데이터베이스 서버
데이터베이스 서버는 주로 데이터 계층에 위치하며, 3-tier 구조에서 정보를 저장, 관리, 검색, 제공하는 역할을 수행한다.
주로 DBMS(Database Management System) 기반으로 구축된다.
다음은 데이터베이스가 수행하는 역할이다.
- 데이터 저장: 서비스의 목적에 따라 다양한 종류의 데이터(e.g. 사용자 정보, 상품 정보, 주문 정보, 고객 행동 데이터)를 포함
- 데이터 관리: 데이터의 생성, 읽기, 업데이트, 삭제(i.e. CRUD) 관리
- 데이터 검색: 이를 통해 사용자가 필요한 정보를 찾거나 분석할 수 있다.
- 데이터 보안: 데이터의 안전성 및 보안을 유지
1.4. 3-tier를 사용하는 이유
클라이언트, 웹애플리케이션, 데이터 계층 중 가장 중요한 계층은 DB이다.
만약 서비스가 2-tier로 구성되어 있다면 DB에 접근하기 위해서 단 하나의 계층만을 해킹하면 된다.
하지만 3-tier로 서비스를 구성하게 되면 클라이언트 단을 뚫더라도 웹 애플리케이션 계층을 또 뚫어야 하기 때문에 보안성이 증대된다.
위에 든 예시 외에도 실제 다양한 웹/앱에서 3-tier구조를 사용한다. 이제부터 실제 3-tier를 구성하며 그 동작 원리를 이해 해 보자.
2. 3-tier 구성하기
클라이언트, 서버, 데이터베이스로 구성된 3계층을 구현하기 위해서는 3개의 서버가 필요하다. 실제로 세 대의 컴퓨터를 돌리는 것은 어려우니 가상머신을 활용해 실습을 진행 해 보자.
각각의 서버를 생성한 후 Nginx, Tomcat, MySQL을 설치 및 구동하고, 연결하여 동작을 확인하자.
1. WEB 서버 생성
리눅스-시작하기를 참고하여 웹서버를 돌릴 우분투 서버를 생성하라.
이후 다음의 과정을 통해 Nginx를 설치하라.
- 패키지 업데이트
$ sudo apt-get update
- Nginx 설치
$ sudo apt-get install nginx
- Nginx 실행
$ sudo systemctl start nginx
- Nginx 실행 확인
$ sudo systemctl status nginx
위 과정을 거쳐 실행되는 nginx 프로세스를 확인하면 다음과 같은 화면을 볼 수 있다.
State가 Running으로 나온다면 nginx가 성공적으로 실행된 것이다.
nginx는 80포트를 사용한다.http://localhost:80
을 통해 서버에 접속하면 다음과 같은 화면을 확인할 수 있다.
2. WAS 서버 생성
위에서 생성한 서버에 대해 스냅샷을 찍고, 이를 clone하여 서버를 생성하라.
-
snapshot 찍기
-
촬영한 스냅샷 클론하여 서버 생성
이후 생성된 서버에서 톰캣을 설치하자.
- tomcat 설치
$ sudo apt-get install tomcat10
- tomcat 실행
$ sudo systemctl tomcat10 start
- tomcat 실행 확인
$ sudo systemctl status tomcat10
위 과정을 거쳐 실행되는 톰캣 프로세스를 확인하면 다음과 같은 화면을 볼 수 있다.
State가 Running으로 나온다면 Tomcat이 성공적으로 실행된 것이다.
올라간 웹서버는 브라우저를 통해 접속 가능하다. 톰캣은 8080 포트를 사용하며,http://localhost:8080
을 입력해 톰캣에 접속할 수 있다.
+) 사용하는 우분투 버전에 따라 설치할 수 있는 톰캣의 버전이 달라진다.
3. DBMS 서버 생성
RDBMS 중 가장 가벼운 MariaDB를 설치하자. 앞의 WAS 서버 생성 과정을 참고하여 DBMS 서버를 생성 후 MariaDB를 설치하라.
- MariaDB 설치
$ sudo apt install mariadb-server
- MariaDB 실행
$ sudo systemctl start mariadb
- netstat 명령어 사용하여 mariadb 실행 여부 및 점유 포트확인
$ netstat -anp | grep 3306
MariaDB의 기본 통신 포트는 3306이다.위 명령어를 실행하면 127.0.0.1의 3306 포트가 열려 있는 것을 확인할 수 있다.
+) netstat는 활성 상태의 네트워크 관련 데이터들을 보여준다. 즉, 어느 프로그램 혹은 프로세스가 네트워크와 연결되어 살아 있는지 알려준다. 이를 사용하기 위해서는 net-tools가 설치되어야 한다. 만약 설치되지 않았다면sudo apt-get install net-tools
명령어를 사용해 설치하자. - Mariadb 서버 변경
3의 과정에서 3306포트가 127.0.0.1에 연결된 것을 확인할 수 있다. 해당 IP주소를 0.0.0.1로 바꾸자.
4.1. Mariadb 설정파일 위치로 이동$ sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf
4.2. bind-address 설정
bind-address = 0.0.0.0
4.3. Mariadb 서버 재시작$ sudo systemctl restart mariadb
+)127.0.0.1 vs 0.0.0.0 두 개의 IP 주소 모두 컴퓨터가 스스로를 가리킬 때 쓰이나, 차이점이 존재한다.
- 127.0.0.1: 이 주소는 루프백 인터페이스(더미 인터페이스)라 부른다. TCP/IP가 컴퓨터에 부여한 예약된 주소로, 로컬에서만 접근이 가능하다.
- 0.0.0.1: Wi-Fi, Bluetooth, Ethernet 등 모든 네트워크 인터페이스의 주소를 포함하는 IP 주소이다. localhost와 달리 외부의 접근이 가능하다.
- 계정 생성
5.1. mysql 접속
$ sudo su # mysql
5.2. mysql이라는 데이터베이스 선택
> use mysql
5.3. 모든 ip에서 접속 가능한 사용자 생성
create user '{사용자 이름}'@'%' identified by '{비밀번호}';
5.4. 생성한 사용자에게 모든 권한 허용
grant all privileges on *.* to {사용자이름}@'%';
5.5. 생성한 규칙 적용
flush privileges;
+) 만약 호스트ip를 제한하고 싶다면 위 ‘%’를 원하는 ip로 수정하면 된다
4. Nginx-tomcat 연동
Nginx에 tomcat 서버를 성공적으로 연결하면 이전에 보았던 Welcome to Nginx 화면 대신 tomcat을 실행했을 때 나오는 화면이 나타날 것이다.
이를 위해서는 Nginx의 설정 파일을 수정 후 Nginx를 재시작해야 한다.
- Tomcat 서버의 IP 주소 보기
$ ip addr
Nginx와 Tomcat 서버를 연동하기 위해서는 Nginx 서버가 Tomcat 서버의 IP주소를 받아와야 한다.
이를 위해ip addr
명령어를 사용해 생성한 Tomcat 서버의 IP 주소를 확인하자.
다음과 같은 화면에서ens
로 시작하는 단락의 inet 주소가 해당 서버의 ip주소이다. -
Nginx 설정파일 찾기 Nginx의 설정파일은 각 버전에 따라 다르다.
따라서 nginx가 설치된 위치로 이동하여 설정파일을 수정해야 한다.
nginx는/etc/nginx
에 설치되며, 설정파일은nginx.conf, conf, conf.d/, sites-available/default, default
등의 이름을 가진다. -
Nginx 설정파일 수정 Nginx가 Tomcat 서버를 전달받기 위해서는 프록시 패스를 설정하여 두 서버를 이어 주어야 한다. 해당 파일을 수정하여 거칠 프록시 패스를 설정 해 주자.
프록시 패스 부분에 넣는 주소는0.Tomcat 서버의 IP 주소 보기
단계에서 찾은 주소를 넣어주면 된다. - Nginx 재시작
$ sudo systemctl restart nginx
위처럼 프록시 패스를 설정해준 후 nginx를 재시작하면 Welcome to Nginx 대신 tomcat의 브라우저 화면이 나올 것이다.
5. WAS-DB 연동
이제부터 수행할 동작은 WAS서버에서 이루어질 것이다. 이전까지 사용한 WAS서버는 톰캣이므로 DB서버 연동도 톰캣에서 이루어 질 예정이다.
- 외부 서버와의 연결을 위한 클라이언트 및 커넥터 수동 설치
$ wget https://dlm.mariadb.com/1965742/Connectors/java/connector-java-2.7.5/mariadb-java-client-2.7.5.jar $ cp mariadb-java-client-2.7.5.jar /usr/lib/jvm/java-1.8.0-openjdk-amd64/lib/ $ cp mariadb-java-client-2.7.5.jar /usr/local/tomcat/lib/ $ wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-5.1.40.tar.gz $ wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-5.1.40.tar.gz $ tar xvf mysql-connector-java-5.1.40.tar.gz $ cp mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar /usr/local/tomcat/lib/
- 환경변수 설정
환경변수는
/etc/profile
에 위치한다. 해당 파일을 열어 아래 내용을 입력하라.export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64/ export CATALINA_HOME=/usr/local/tomcat PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/mariadb-java-client2.7.5.jar:$CATALINA_HOME/lib/mariadb-java-client-2.7.5.jar
- WAS 홈페이지에 DB와 통신하는 소스코드 올리기
/usr/local/tomcat/webapps/ROOT/
에 DB와 통신할 수 있는 코드를 가진 JSP 파일을 만들어 저장하라.
위 과정을 모두 무사히 거쳤다면 WEB의 IP주소로 접속했을 때 WAS 서버에서 연동한 DB에 접속할 수 있다.