2019/12/03

페어라인 테니스 실 서비스 개발 서버 환경 구축

아파치와 톰켓 연동.

아파치 : 웹서버.
톰켓 : WAS(Web Application Server)

1. 웹 서버와 WAS
웹 서버는 정적인 컨텐츠(html, css, js)를 제공하는 서버이다.
ex) Apache, Nginx

WAS는 DB 조회나, 어떤 로직을 처리해야 하는 동적인 컨텐츠를 제공하는 서버이다.
ex) Tomcat, Jeus

즉, 웹 서버와 WAS의 차이는 어떤 타이의 컨텐츠를 제고하느냐의 차이다.
웹 서버와 WAS는 각각 독립적으로 존재할 수 없다.
대부분의 WAS는 정적인 컨텐츠를 제공해주고 있기 때문에, 웹 서버 없이 WAS만 존재할 수 있다.
그래서 WAS는 웹 서버를 포함하는 개념이라고 할 수 있다.

WAS 자체로 웹 서버의 역할을 수행하기 때문에 무조건적으로 웹 서버를 앞단에 두어야 할 이유는 없다.
그런데 일반적으로 웹 서버를 WAS 앞 단에 배치하게 되는데, WAS만 사용하면 될 것이지 왜 웹서버를 앞단에 배치하는는 구조를 사용할까?

2. 웹 서버 사용이유
1) WAS가 해야 할 일의 부담을 줄이기 위해서이다.
WAS 앞에 웹 서버를 둬서 웹 서버에서는 정적인 문서만 처리하도록 하고, WAS는 애플리케이션의 로직만 수행핟록 기능을 분배하여 서버의 부담을 줄이기 위해서이다.
웹 서버에서 플러그인 형태로 WAS로 연결하면 일 처리를 나눌 수 있다.

1) WAS의 환경설정 파일을 외부에 노출시키지 않도록 하기 위해서이다.
클라이언트와 연결하는 포트가 직접 WAS에 연결이 되어 있다면 중요한 설정 파일들을 노출될 수 있기 때 WAS 설정 파일을 외부에 노출 시키지 않도록 하기 위해서 웹 서버를 앞단에 배치 시킨다.
웹 서버와 WAS에 접근하는 포트가 다르기 때문에, WAS에 들어오는 포트에는 방화벽을 쳐서 보안을 강화할 수 있다.

3. 아파치(apache)와 CGI, 그리고 톰켓(tomcat)
자바 웹 애플리케이션을 개발 할 때 주로 사용하는 조합이 아파치와 톰캣이 된다.
그러면 다른 언어들은 톰캣 WAS가 없을까?

아파치에는 CGI(common gateway interface)라는 것을 제공한다.
CGI는 이름 그대로 인터페이스로서, 웹 서버 상에서 프로그램을 동작시키기 위한 방법을 정의한 프로그램(또는 스크립트)이다.
즉, php,perl,python,c 등의 언어들은 CGI를 구현해놓았기 때문에, 아파치에서 다양한 언어로 짜여진 각 프로그램을 실행 할 수 있다.

예를 들어 아파치에서 PHP 모듈을 설치했을 경우, 요청이 왔을 때 아파치는 HTTP 헤더를 분석하고 파싱하여 PHP로 파라미터를 넘겨준다.
그러면 PHP에서는 파라미터를 받아 응답 할 HTML 문서를 만들어 아파치에 전달한다.
HTML 문서를 잔달 받은 아파치는 CSS, JS, img 등 정적인 자원들과 함께 브라우저로 반환한다.

그런데 자바는 CGI로 구현되어 있지 않다.
자바 자체가 무겁고, Common 라이브러리와 JEE라는 플랫폼이 존재하기 때문에 아파치에는 굳이 CGI를 제공하지 않은 것 같습니다.
그렇기 때문에 톸켓은 Default Servlet을 통해 정적인 파일을 제공해주기 때문에 웹 서버의 역할을 할 수 있다.

================
2. 아파치와 톰켓
================
일반적으로 아파치는 정적 파일(img, css, js)등을 응답 및 보안 역할을 할 목적으로 앞단에 배치하고,
톰캣에 실제 애플리케이션이 존재하여 아파치와 다른 port를 열어서 아파치와 연결한다.

1. mld_jk 모듈설치
아파치와 톰캣을 연동하기 위해서는 mod-jk 모듈이 필요하다.
mod-jk 모듈은 AJP 프로토콜(Apache Jserv Protocol)을 사용하여 아파치와 톰캣을 연동하는 플러그인이다.
AJP 프로토콜은 웹 서버 뒤에 있는 애플리캐이션 서버로부터 웹 서버로 들어오는 요청을 위임할 수 있는 바이너리 프로토콜이며, 주로 로드벨런싱에 사용된다.

mld_jk 모듈을 다운로드 받을수 있다.
 wget http://apache.tt.co.kr/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.43-src.tar.gz
# tar xvfz tomcat-connectors-1.2.43-src.tar.gz
# cd tomcat-connectors-1.2.43-src/native

# ./configure --with-apxs=/usr/local/victolee/apache2.0.64/bin/apxs

# make

# make install
# ls -l /usr/local/victolee/apache2.0.64/modules

need to check for Perl first, ... You must specify a valid --with-apxs path 에러가 발생하면, perl을 찾을 수 없다는 뜻입니다.
이를 해결하기 위해서는 /usr/local/victolee/apache2.4.33/bin/apxs 파일을 열어서 맨 첫 줄을 수정해야 한다.
#!/usr/bin/perl -w

설치가 되었다면 modules 디렉토리에 mod_jk.so 파일이 생성된다.

2. tomcat에서 8009 포트 확인
아파치에서 AJP 프로토콜로 톰캣에 접근하는 포트는 8009이므로, 톰캣의 server.xml 파일에서 이를 확인 할 수 있다.

3. 아파치 worker 설정
worker란 간단하게, 토켓의 포트와 연결하는 역할을 한다고 생각하면 된다.
톰캣에는 여러 애플리케이션이 존재할 수 있고, 이를 가상 호스트로 관리할 수가 있는데 그 때 worker를 사용한다.

worker의 설정은 아파치 conf 디렉토리 안에 workers.properties 파일을 생성하고 아래와 같이 작성한다.
# vi /usr/local/victolee/apache2.0.64/conf/workers.properties

worker.list=worker1

worker.worker1.type=ajp13 # AJP1.3 프로토콜을 사용
worker.worker1.host=localhost # 톰캣은 local에서 돌고 있습니다.
worker.worker1.port=8009         # 연결할 톰캣의 포트 번호

4. 아파치와 톰켓 연동
아파치 환결 설정 파일인 httpd.conf 또는 apache2.conf 내용을 추가한다.
# vi /usr/local/victolee/apache2.0.64/conf/httpd.conf

( LoadMoudle를 검색하여 맨 마지막에 모듈을 추가 ( line : 268 ) )
LoadModule jk_module            modules/mod_jk.so

( 파일 맨 아래에 추가 ( shift + g ) )
# tomcat connection
<IfModule mod_jk.c>
        JkWorkersFile /usr/local/victolee/apache2.0.64/conf/workers.properties
        JkLogFile /usr/local/victolee/apache2.0.64/logs/mod_jk.log
        JkLogLevel info
        JkLogStampFormat "[%a %b %d %H:%M:%S %Y]
        JkShmFile /usr/local/victolee/apache2.0.64/logs/mod_jk.shm
JkMount /*.jsp worker1
</IfModule>

톰캣과 연결히기 위한 설정의 내용의 의미는 다음과 같다.

<IfModule mod_jk.c >  : 아파치에 mod_jk 모듈이 올라와 있으면 아래 내용을 실행하라는 의미

JkLogFile          : 로그 파일

JkLogLevel          : 로그 남길 레벨

JkLogStampFormat   : 로그를 남기는 포맷

JkShmFile          : 공유 파일

JkMount          : /*.jsp 파일은 worker1에게 넘기겠다.

5. 테스트
아파치 웹 서버 재시작

이제 브라우저에서 IP:8080 으로 접속하면 토캣 페이지가 출력이 된다.
이 요청은 톰켓에 직접 용청을 한 것이다.

이번에는 index.jsp 파일을 요청하기 위해 80포트로 접속해본다.
http://ip/index.jsp

톰캣 페이지가응답이 되지만, CSS, image 등이 제외된 상태로 HTML 문서만 응답한다.
그 이유는 아파치 환결 설정에서 tomcat connection 에서 설정 JkMount 옵션 때문이다.
.jsp 파일만 worker가 처리하도록 보냈기 때문에, 정적 파일들은 아파치에서 응답해야 한다.
하지만 아파치에는 톰캣 페이지에서 제공해야 하는 정적 파일들이 없기 때문에 톰캣에서 받아온 HTML 문서만 응당할 수 밖에없다.

work를 수정해 ip포트로 접근했을 때 애플리케이션을 응답할 수 있도록 설정할 수도 있다.
Tocat Manager에서 웹 애플리케이션을 deploy 했을 때, 그 이름을 example이라고 설정 했을대 설정 방법이다.

# vi /usr/local/victolee/apache2.0.64/conf/httpd.conf
( Tomcat connection 부분의 JkMount를 아래와 같이 수정합니다. )

JkMount /example/* worker1

아파치 서버 재 시작.
웹 접근
http://ip/example/~~

================
3. 우분투 아파치 톰캣연동
================
1. 연동 커넥터 mod_jk 설치
sudo apt-get install libapache2-mod-jk

2. workers.properties 파일 생성
vi /etc/apache2/workers.properties

20191124 gist 게이트웨이에 설정된 내용이다. 주석처리 한다.
# Define 1 real worker using ajp13
#worker.list=worker1
# Set properties for worker (ajp13)
#worker.worker1.type=ajp13
#worker.worker1.host=localhost
#worker.worker1.port=8009

참고.
workers.tomcat_home=톰캣 설치경로
workers.java_home=jdk 설치경로

# Define 1 real worker ajp13
worker.list=임의의 이름

# Set properties for tomcat1 (ajp13)
worker.임의의 이름.port = 포트      # tomat server.xml 파일 AJP/1.3 Connector의 Port 입력
worker.임의의 이름.host = 톰캣서버 아이피 주소
worker.임의의 이름.type = ajp13     # apache + tomcat 통신 프로토콜
worker.임의의 이름.lbfactor = 1

실제 적용.
현제 설치 경로
#export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
#export CATALINA_HOME=/srv/www/league.fairlineai.com

workers.tomcat_home=/srv/www/league.fairlineai.com
workers.java_home=/usr/lib/jvm/java-1.8.0-openjdk-amd64
# oracle jdk 사용시
# workers.java_home=/usr/lib/jvm//java-8-oracle/

# Define 1 real worker ajp13
worker.list=gfltomcat1

# Set properties for tomcat1 (ajp13)
worker.tomcat1.port = 8009
worker.tomcat1.host = 172.16.1.1
# 로컬일 경우
# worker.tomcat1.host = localhost
worker.tomcat1.type = ajp13
worker.tomcat1.lbfactor = 20

--- 실제 적용 끝

입력 내용을 보면 톰캣과 jdk 설치 경로를 입력하는 tomcat_home과 java_home 부분이 있다.
별도로 경로를 변경하지 않아다면 위의 경로를 그대로 사용하면 된다.

만약 자바 설치시 openjdk 아니라 oracle jdk를 설치했다면 #으로 된 주석 부분을 사용하면된다.


------------ 톰켓 2개 사용시.(사용자 모드, 관리자 모드)
다음으로 worker.list 부분에는 연동할 톰캣의 이름을 임의로 지정하면된다.
여기에서는 tomcat1로 지정했다. 만약 1개의 아파치에 여러개의 톰캣을 연동하려면 아래와 같이 입력하면 된다.

worker.list= tomcat1, tomcat2 # 이름은 임의로 설정

worker.tomcat1.type=ajp13
worker.tomcat1.host=톰캣서버 IP
worker.tomcat1.port=8009
worker.tomcat1.lbfactor=1

worker.tomcat2.type=ajp13
worker.tomcat2.host=톰캣서버 IP
# 포트를 변경해준다. 두번째 톰캣의 server.xml 의 AJP/1.3 Connector의 Port 수정한다.
worker.tomcat2.port=8010 
worker.tomcat2.lbfactor=2

3. jk.conf 파일 수정
sudo vi /etc/apache2/mods-available/jk.conf

추석 처리 해준다.
# JkWorkersFile /etc/libapache2-mod-jk/workers.propetties

그리고 새롭개 작성해준다.
JkWorkersFile /etc/apache2/workers.properties

이렇게 하는 이유는 /etct/apache2/ 경로에 생성한 workers.porperties로 부터 설정 정보를 가져오기 위한 것이다.

[AJP] extension_fix::jk_uri_worker_map.c (564): Could not find worker with name 'jk-manager' in uri map post processing.
에러 발생. 주석처리.
vi /etc/apache2/workers.properties
    <Location /jk-status>
        # Inside Location we can omit the URL in JkMount
        #JkMount jk-status
        #Order deny,allow
        #Deny from all
        #Allow from 127.0.0.1
    </Location>
    <Location /jk-manager>
        # Inside Location we can omit the URL in JkMount
        #JkMount jk-manager
        #Order deny,allow
        #Deny from all
        #Allow from 127.0.0.1
    </Location>

4. 000-default.conf 파일 수정
sudo vi /etc/apache2/sites-available/000-default.conf

이 부분을 보안장비에다 포팅 해준다. 보안장비의 경우 자체 파일 관리를 하기 때문에 수정을 해도 재 부팅시 파일이 리셋된다.
DocumentRoot /var/lib/tomcat8/webapps/ROOT/
JkMount /* tomcat1

DocumentRoot 경로 설정을 다시 해준다.
위의 경로는 webapps 아래에 기본적으로 ROOT 폴더가 웹프로젝트가 있는 경로이기 때문이다.

만약 webapps 아래에 project라는 폴더에 프로젝트를 배포한다면
DocumentRoot /var/lib/tomcat8/webapps/project 라고 입력해주면 된다.

JkMount /* tomcat1 부분은 모든 URL (/*)을 톰캣에게 바인딩 하는 부분이다.
tomcat1은 workers.properties에 입력한 연동할 톰캣의 이름이다.

현재 보안장비에서는 DocumentRoot /srv/www/league.fairlineai.com/webapps/fairline-mobile-0.0.1

만약 톰캣에 배포된 프로젝트가 여러 개이고 특정 프로젝트만 URL 바인딩 해야 한다면 /* 부분을 수정해 주면된다.
예를 들어 배포된 프로젝트가 project1, project2 이렇게 있는데 project1만 바인 하려면 JkMount /project1/* tomcat1 이렇게 수정하면 된다.

***
특정 유형의 파일만 아파치에서 처리할 경우
SetEnvIf Request_URI "/*.js$" no-jk
JkMount /* tomcat1

위의 모든 유형(JkMount /*)은 톰캣에서 처리하지만 .js 파일만 아파치에서 처리하겠다는 설정이다.
위 설정에서 .js 뒤에 $가 없을 경우 .jsp도 아파치에서 처리하게 되므로 $를 붙여 문자의 끝을 지정한 것이다.

5. 톰캣의 server.xml 파일 수정
다음으로 톰켓의 server.xml 파일을 수정해야 한다.
아래 명령어를 실행하여 server.xml 파일을 연다.

sudo vi /etc/tomcat8/server.xml

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

주척 처리 되었다면 해제한다.

6. 아파치와 톰캣 재시작
sudo /etc/init.d/apache2 restart
sudo /srv/www/league.fairlineai.com/bin/startup.sh

7. 브라우저 확인
http://ip:8080
http://ip


===================================
보안장비 연동
===================================
sudo apt-get install libapache2-mod-jk

ajp 아파치와 통신을 위해 설정.
vi /etc/apache2/workers.properties
workers.tomcat_home=/srv/www/league.fairlineai.com
workers.java_home=/usr/lib/jvm/java-1.8.0-openjdk-amd64

worker.list=gfltomcat1
worker.tomcat1.port=8009
worker.tomcat1.host=14.48.92.155
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=20

jk 모듈 설정파일 설정.
vi /etc/apache2/mods-available/jk.conf

    #JkWorkersFile /etc/libapache2-mod-jk/workers.properties
    JkWorkersFile /etc/apache2/workers.properties
   
    <Location /jk-status>
        # Inside Location we can omit the URL in JkMount
        #JkMount jk-status
        #Order deny,allow
        #Deny from all
        #Allow from 127.0.0.1
    </Location>
    <Location /jk-manager>
        # Inside Location we can omit the URL in JkMount
        #JkMount jk-manager
        #Order deny,allow
        #Deny from all
        #Allow from 127.0.0.1
    </Location>

아파치 보안 장비 웹서버 수정
/etc/apache2/sites-available/user-fbox-league.fairlineai.com
JkMount /* gfltomcat1

톰캣 수정
sudo vi /etc/tomcat8/server.xml

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

주척 처리 되었다면 해제한다.

아파치와 톰캣 재시작
sudo /etc/init.d/apache2 restart
sudo /srv/www/league.fairlineai.com/bin/startup.sh

브라우저 확인
http://ip:8080
http://ip

댓글 없음:

댓글 쓰기