본문 바로가기
따로 정리/서버 세팅

[서버 세팅] 3. WEB

by 규글 2024. 5. 10.

1. Tomcat Connectors 설치

>>> wget https://archive.apache.org/dist/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz

>>> tar -zxvf tomcat-connectors-1.2.48-src.tar.gz

 

 Tomcat connectors를 /usr/local에 설치하고 나서 그 하위의 native directory로 이동한다. Directory의 파일을 살펴보면 buildconf.sh를 볼 수 있는데, 이것은 mod_jk를 build하기 위한 것이라고 한다. 이를 build 하기 위해서는 autoconf와 libtool이 설치되어 있어야 하며, 이들이 없으면 mod_jk를 build 할 수 없다. 또한 httpd_devel을  설치하지 않으면 /usr/bin에 APXS(APache eXtenSion)가 생성되지 않으므로 이어지는 단계에서 이들을 설치했다.

 

2. httpd-devel / autoconf / libtool 설치

>>> yum install autoconf

>>> yum install libtool
 
>>> ./buildconf.sh
>>> yum install httpd-devel

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

 먼저 autoconf와 libtool을 설치하면 buildconf.sh를 실행할 수 있고, httpd-devel을 설치하면 /usr/bin에 apxs가 생성되어 configure를 실행할 수 있다. 하지만 이 상태에서는 아직 /etc/httpd/modules에 mod_jk.so 파일이 생성되지 않는다.

 

>>> make

>>> make install

 이전의 ./buildconf.sh와 ./configure가 수행되지 전까지는 make (install) 명령어를  실행하고자 해도, 특정된 target이 없어서 동작이 진행되다가 멈춘다. 하지만 두 명령어가 정상적으로 수행된 상태라면, 이후의 make 명령어도 정상적으로 수행되면서 /etc/httpd/modules에 mod_jk.so가 생성된다.

 

3. httpd 설정

 mod_jk.so가 생성된 뒤에 /etc/httpd/conf directory를 보면 위 이미지와 같이 두 개의 파일만이 존재한다. 이때 httpd.conf에 원하는 모든 설정일 입력해도 되지만, 독립적인 파일에 작성해서 httpd.conf에 include 하는 방식을 택할 수도 있다.

 

3.1. workers.properties : 로드밸런서(lb)

 ### /etc/httpd/conf/workers.properties ###
 
 
 worker.list=load_balancer_a
 
 worker.load_balancer_a.type=lb
 worker.load_balancer_a.balance_workers=worker1,worker2
 
 worker.worker1.port=8009
 worker.worker1.type=ajp13
 worker.worker1.host=[서버 1 virtual ip]
 worker.worker1.ping_mode=A
 worker.worker1.socket_keepalive=true
 worker.worker1.socket_timeout=60
 worker.worker1.lbfactor=1
 
 worker.worker2.port=8009
 worker.worker2.type=ajp13
 worker.worker2.host=[서버 2 virtual ip]
 worker.worker2.ping_mode=A
 worker.worker2.socket_keepalive=true
 worker.worker2.socket_timeout=60
 worker.worker2.lbfactor=1

 필자는 새롭게 'workers.properties'를 생성하여 위와 같은 방식으로 내용을 작성해주었다.

 포트 번호와 타입은 이전에 설정했던 WAS의 server.xml의 'AJP 1.3 Connector' 설정을 참조하여 작성할 수 있다. 'host' 속성에는 WAS 서버의 사설 IP 정보를 입력해주었다.

 Ping mode에는 C, P, I, A가 있다. C는 백앤드와의 연결 직후에, P는 백앤드로 요청을 보내기 전에, I는 connection_ping_interval의 값보다 오래 걸린 연결일 때 apache와 tomcat의 연결 상태를 확인하겠다는 설정이다. A는 세 속성을 모두 사용하겠다는 설정이다.

 socket_keepalive 옵션은 WEB 서버와 Tomcat Engine  사이에 방화벽을 사용하고 있을 때 사용하도록 권하고 있는데, 필자는 KT 클라우드의 시스템을 사용하면서 방화벽을 활용하고 있었으므로 true로 설정하였다. socket_timeout은 응답을 받기까지의 최대 시간(초 단위)으로 재량껏 설정하면 되겠다.

 lbfactor는 인스턴스 부하 분산 지수이며, 균등하게 분산시키기 위해서 1로 설정했다.

 

 이 workers.properties의 설정은 'mod_jk.conf' 파일의 JkWorkersFile 속성에서 불러오게 되며, 간단한 도식으로 표현하면 위 이미지와 같다. WEB을 지나서 WAS로 요청이 들어갈 때 1번 WAS와 2번 WAS 중 한 쪽이 닫혀있다면, load balancer를 통해서 반대쪽 서버로 요청이 들어갈 수 있도록 한다. 이런 세팅을 통해 한 쪽 서버가 모종의 이유로 내려갔을 때도 온전히 페이지를 로딩할 수 있게 된다.

 

 설정에서 작성했던 worker1, worker2는 WAS 서버의 server.xml에서 위 이미지처럼 Engine tag의 jvmRoute 속성에 명시해주어야 한다.

 

 설정의 옵션과 작성할 값은 Apache Tomcat 홈페이지의 reference guide를 참고하면 좋다.[각주:1]

 

3.2. mod_jk.conf

 <IfModule jk_module>
    JkWorkersFile /etc/httpd/conf/workers.properties
    JkLogFile logs/mod_jk.log
    JkLogLevel info
 </IfModule>

 앞서 생성한 파일을 JkWorkersFile로 불러온다. JkLogFile은 어디에 로그를 기록할지에 대한 설정이고, JkLogLevel은 어느 정도까지 로그를 기록할지에 대한  설정이다. 필자는 info로 설정했다.

 이렇게 설정한 파일을 다시 다음의 httpd-vhosts.conf 파일을 만들어서 불러오게 된다.

 

3.3. httpd-vhost.conf

 LoadModule jk_module modules/mod_jk.so
 
 <VirtualHost *:80>
    DocumentRoot [WEB resources가 있는 경로]
    ServerName [연결한 도메인]
    JkUnMount /resources/* load_balancer_a
    JkMount /* load_balancer_a
    JkMount /manager/* load_balancer_a
 
    <Directory [WEB resources가 있는 경로]>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

Include conf/mod_jk.conf

 첫 번째 줄은 Tomcat connector를 make하여 생성된 mod_jk.so 파일을 load한 것이다. 그리고 마지막 줄은 조금 전에 생성한 mod_jk.conf를 include 한 것이다.

 

 이외의 VirtualHost tag 안쪽의 DocumentRoot는 web resources 파일들이 위치한 directory의 절대 경로를 입력해주고, ServerName에는 연결한 도메인을 작성해준다.

 JkMount는 tomcat으로 요청을 보내는 URL을 특정하고, 해당 URL에 대하여 worker를 특정하는 부분이다. 해당 요청에 대해 이전에 load_balancer_a로 worker를 정해주었기 때문에 그렇게 입력해주었다. /manager/* 설정은 중복되어 필자가 없앤 부분으로 기억한다.

 

 마지막의 Directory tag 하위의 설정은 작성된 directory에 대한 설정인데, 필자는 그에 대하여 자세히 탐구하지는 않아서 탐구가 필요한 부분이다.

 

 

3.4. 권한 설정

 앞서 작성했던 DocumentRoot에 작성했떤 경로에 실제 프로젝트의 resources directory를 위치시키고, 해당 directory에 대한 권한 설정을 변경해준다면 정상적으로 화면을 볼 수 있게 된다.

 위 이미지에서 볼 수 있듯, directory에 대한 권한이 root에만 열려있으므로, root 이외의 group이나 다른 사용자는 해당 directory에 대한 권한이 없어서 정상적인 화면을 볼 수 없는 것이다.

 

 >>> chmod 권한 –R /home/[사용자 계정]

 따라서 chmod 명령어를 사용하여 others에게 권한을 열어준다면 정상적인 화면을 볼 수 있게 될 것이다.

 

3.5. httpd 실행

>>> systemctl start httpd (stop, restart, status)

 

댓글