본문으로 바로가기

3티어 아키텍처 구성하기 (apache-tomcat-mysql)

category 리눅스 2021. 9. 22. 01:32
반응형

본 글은 아파치Apache - 톰캣 Tomcat 연동하는 이유? AJP란? (tistory.com)  

참고하여 작성 되었습니다.

 

apache? 

아파치 소프트웨어 재단에서 관리하는 HTTP 웹 서버이다. 구축이 쉽고, 무료버전으로 사용할 수 있어서 많이들 사용한다.

 

tomcat?

톰캣은 웹 어플리케이션 서버 (WAS) 이며, 자바 서블릿을 실행 시키고, JSP코드가 포함되어 있는 웹 페이지를 만들어 준다.

* 서블릿 컨테이너 : 클라이언트의 요청을 받아 요청을 처리하고, 다시 클라이언트에게 응답해주는 역할

톰캣은 웹 서버에서 넘어온 동적인 페이지를 읽어 들여 프로그램을 실행하고, 그 결과를 다시 html로 재구성하여 아파치에게 되돌려준다. 아파치가 없이 톰캣 스스로 독립적으로도 사용될 수도 있지만, 아파치와 같은 다른 웹 서버랑도 함께 사용될 수 있다.

 

apache 와 tomcat을 연동하는 이유 : 톰캣의 웹 서버기능은 아파치 웹 서버보다 느린 기능을 보였고, 웹의 모든 정적/동적 데이터를 모두 WAS서버인 톰캣이 처리한다면, 결과적으로 사용자의 요청의 응답이 느려진다.

때문에 정적 데이터는 웹서버인 Apache에서, 동적 데이터는 WAS인 톰캣에서 처리함으로써 서버의 전체적인 부하를 분산하고 속도를 빠르게 하기 위해서 사용한다.

 

아파치 톰캣 연결 순서

1. apache 설정파일인 httpd.conf에 tomcat 연동을 위한 설정을 추가하고, 톰캣에서 처리할 요청을 지정한다.

2. 사용자는 아파치 웹 서버에 접속한다 (port:80)

3. apache 웹 서버는 사용자의 요청이 들어왔을때, 이 요청이 톰캣에서 처리되도록 지정된 요청인지 확인한다.

4. 톰캣에서 처리해야 하는 경우, 아파치 웹 서버는 톰캣의 AJP 포트(8009 port)에 접속해 요청을 톰캣에게 전달한다.

5. 톰캣은 아파치 웹 서버로부터 요청을 받아 처리 후, 처리 결과를 다시 아파치 웹 서버에게 돌려준다.

6. 아파치 웹 서버는 톰캣으로 전달받은 처리 결과를 클라이언트에게 전달한다.


 

실습(aws_ec2 instance 3대 준비)

구성도 : 

1. apache 설치 (2.4 version)

1) 설치에 필요한 패키지 다운 

yum -y install gcc make gcc-c++ apr apr-utils expat-devel

2) PCRE 다운로드 (pcre = perl 호환 정규표현식, 정규식 패턴일치를 구현하는 함수의 집합)

wget https://sourceforge.net/projects/pcre/files/pcre/8.36/pcre-8.36.tar.gz/download
tar xvfz download 
cd pcre-8.36

./configure --prefix=/usr/local

make && make install

3) apache. apr, apr-utils 다운로드

wget http://archive.apache.org/dist/httpd/httpd-2.4.33.tar.gz
tar xvfz httpd-2.4.33.tar.gz

wget http://mirror.apache-kr.org/apr/apr-1.6.5.tar.gz
tar xvfz apr-1.6.5.tar.gz 

wget http://apache.mirror.cdnetworks.com/apr/apr-util-1.6.1.tar.gz
tar xvfz apr-util-1.6.1.tar.gz

mv apr-1.6.5 httpd-2.4.33/srclib/apr
mv apr-util-1.6.1 httpd-2.4.33/srclib/apr-util
cd httpd-2.4.33

4) apche, apr, apr-util 설치 파일을 다운 받은 후 압축 해제

apache 디렉토리내에 apr과 apr-util을 옯겨준다 이후 설치된 프로그램들을 관리해주기 위해 따로 디렉토리를 만든 후

환경설정을 하고 아파치를 설치해 준다(해당 디렉토리에)

mkdir /usr/local/apache

./configure --prefix=/usr/local/apache \
--with-included-apr \
--with-pcre=/usr/local/bin/pcre-config

make && make install
cd /usr/local/apache

위의 작업까지 완료 하였다면 apache 는 설치 완료. ( 내 경로 /usr/local/apache)

 

2. JK connector 설치(위치 : /usr/local/apache/modules)

- httpd.conf 파일 의 mod_jk.so의 위치와 일치하게끔 설정

* mod_jk 모듈 : AJP 프로토콜을 사용해 톰캣과 연동하기 위해 만들어진 모듈

* AJP 프로토콜 : AJP(Apache JServ Protocol)은 Web Server에서 받은 요청을 WAS로 전달해주는 프로토콜이다.

 AJP HTTP의 내용을 포워드 용도에만 있다. HTTP 프로토콜 보다 더 빠르다.

 

mod_jk 다운로드
wget https://mirror.navercorp.com/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz

tomcatconnectors/native/ 디렉터리로 이동

./configure --with-apxs=/usr/bin/apxs

apxs를 못찾을 경우
yum -y install httpd-devel

make


컴파일이 완료된다면 
tomcat-connectors/native/apache-2.0 폴더에 컴파일 완료된 mod_jk.so 파일 존재할 텐데 그것을 
/usr/local/apache/modules 디렉토리에 복사

3. apache 설정

1) workers.properties 파일 생성

- workers.properties 파일에 apache와 연동할 톰캣 서비스의 정보를 입력한다.

 

vi /usr/local/apache/conf/workers.properties

worker.list=worker1   // 이름은 내 임의로 설정

worker.worker1.type=ajp13
worker.worker1.host=[톰캣 ip]
worker.worker1.port=8009 // 포트번호 톰캣에서 설정한 포트와 일치해야 한다.
worker.worker1.lbfactor=1 // 서버밸런스 비율

 

2) 설정파일에서 모듈 적용 설정(conf/httpd.conf 파일)

LoadModule jk_module /usr/local/apache/modules/mod_jk.so
	
		<IfModule jk_module>
			JkWorkersFile /usr/local/apache/conf/workers.properties
			JkLogFile /var/log/httpd/mod_jk.log
			JkLogLevel info
			JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
			JkMount /*.jsp worker1
		</IfModule>

 

* JkMount: 이 부분에서 어떤 URL로 오는 경우, 어떤 worker(톰캣)가 처리할 지 결정할지 설정한다.

JkMount 뒤에 오는 /* 는 모든 url의 요청을 의미한다.

즉, 모든 url의 요청에서 서블릿 관련처리가 필요하다면, workers.properties파일에 명시된 worker(WAS)에게로 넘기겠다.

라는 의미가 된다. 

톰캣이 여러대인경우  workers.list의 각 worker이름(webmail,sysman,mobile)에 따라서 설정한다. 

나는 .jsp 확장자 파일에 관해선 전부 worker1에서 처리하도록 설정 하였다.

 

4. 톰캣 서버 설정 - server.xml (tomcat 설치 과정은 생략)

1) 기본 참조 디렉토리 수정(tomcat/conf/server.xml 파일)

- <Context path="" docBase="web" reloadable="true" /> // 추가 . 기본 경로 설정하는 라인 이다.

주의 사항: Host 태그 안에다 지정 해야한다.
톰캣의 ip로 접속할 경우 기본 webapps/ 디렉토리에 web 디렉토리 부터 시작한다는 것을 의미한다.

 

2) 기존의 HTTP 커넥터 (8080port) 제거

- 아파치를 통해 :80 포트로 접속하기 때문에, 톰캣으로 직접 접속하는 :8080 포트는 사용을 막는다.

(주석처리)

 

3) AJP 커넥터 설정

- 아파치 서버의 workers.properties의 정보가 일치해야 통신이 가능하다.

 

중간확인

apache 서버 인스턴스의 공인 ip로 접속후 tomcat 서버에 존재하는 index.jsp를 요청했을때 jsp 파일을 잘 불러오는 것을 확인 할 수 있었다.

 

5) mysql-connector 다운로드(5.1.49 ver)

wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-5.1.49.tar.gz

압축해제
tar zxvf mysql-connector....

6) tomcat의 lib 디렉토리로 이동(/data/tomcat/lib/)

mv /mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar /data/tomcat/lib/

 

5. mysql 서버 mysql 설치 및 설정

1) mysql 설치

wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
sudo rpm -ivh mysql57-community-release-el7-11.noarch.rpm
yum install mysql-community-server mysql mysql-libs mysql-devel mysql-server

2) mysql 초기 비밀번호 확인 (mysql 실행 후) 및 설정

cat /var/log/mysqld.log | grep 'password'

mysql_secure_installation 으로 비밀번호 설정.

3) 테스트 할 DB, USER 생성(모든대역에서 접속할수 있도록)

CREATE DATABASE [DB명]; CREATE USER '[아이디]'@'%' IDENTIFIED BY '[PASSWORD]';
GRANT ALL PRIVILEGES ON *.* TO '[아이디]'@'%' identified by '[PASSWORD]';
FLUSH PRIVILEGES;  // 설정 적용

4) Tomcat 서버에서 클라이언트로 접속 테스트

Tomcat 서버와 DB 서버는 같은 사설대역에 존재하기 때문에 사설ip로 접속을 시도하였고 접속이 잘 이루어 졌다.

 

 

6. 최종 확인 

웹서버(apache)에  WAS 서버에 존재하는 jsp 파일을 요청하였을 때 그 요청을 잘 받아오면 성공.요청할 jsp 파일은 DB 파일과 연동이 제대로 돼면 나오는 jsp 파일이므로 DB 연동까지 한번에 확인이 가능하다.

 

1) db.jsp 파일 생성(테스트용도)

 <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.sql.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>DB Connection Test</title>
</head>
<body>
<%
String DB_URL = "jdbc:mysql://20.0.0.192:3306/mysql?autoReconnect=true&serverTimezone=UTC";
String DB_USER = "[DB 계정]";
String DB_PASSWORD= "[DB 암호]";

Connection conn;
Statement stmt;

try {
 Class.forName("com.mysql.jdbc.Driver");
 conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
 stmt = conn.createStatement();
 conn.close();
 out.println("MySql jdbc test: connect ok!!");
} catch(Exception e) {
 out.println(e.getMessage());
}
%>
</body>
</html>

 

2) 접속테스트

was 서버의 파일을 불러오고, db와도 연결이 잘 된것을 확인 하였다. ( 테스트 도중 apache 서버 인스턴스에 문제가 생겨 재생성 하였더니 공인 ip가 바뀌었다. 어쩄든 요청한 IP는 apache 서버가 맞다)

다음은 이 구성 그대로 사용하여 하나의 톰캣 서버에 여러개의 서비스를 올리는것을 해보도록 하겠다.

반응형

'리눅스' 카테고리의 다른 글

CentOS 7 Apache 서비스 등록, 관리  (0) 2021.12.29
셸 스크립트 조건문 비교연산  (0) 2021.07.22
Shell Script 변수  (0) 2021.07.19
쉘 스크립트 첫줄 !/bin/bash  (0) 2021.07.19
CentOS7 Python 설치 및 버전 변경  (0) 2021.06.28