apache와 tomcat을 연동하는 방법 중 대표적인 방법은 크게 mod_jk와 mod_proxy가 있습니다.
mod_jk
moad_jk는 apache와 tomcat간의 연동에 특화되어 있고, 로드 밸런싱과 세션 관련 설정을 제공합니다.
workers.properties와 httpd.conf을 사용하여 세밀하게 설정이 가능합니다.
과거에는 전송 크기의 차이가 유의미하게 발생하여 mod_jk의 성능이 더 좋다고 했지만,
최근에는 mod_proxy의 성능도 많이 개선하였다고 합니다.
mod_proxy
mod_proxy는 다양한 프로토콜을 지원하며 mod_jk에 비해 상대적으로 간단합니다.
하지만 그 만큼 옵션 설정이 세분화되어있지 않습니다.
오늘은 centos7에서 mod_jk를 사용하여 apache와 tomcat을 연동하는 방법을 설명하겠습니다.
설치 환경은 centos7의 root계정으로 모든 방화벽을 allow 하여 진행하였습니다.
1. apache + apr 설치
apache와 apr은 앞에서 소스 컴파일을 해보았기 때문에 빠르게 넘어가보겠습니다.
# 설치 디렉터리 생성
mkdir /usr/local/src/APM_Setup
# 의존성 설치
yum install -y wget vim epel-release
yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum update -y
# 패키지 설치
yum install -y libdb-devel enchant-devel libxslt libxslt-devel net-snmp-devel readline-devel readline aspell-devel unixODBC unixODBC-devel libicu-devel icu libicu libc-client libc-client-devel libc-client-2007f freetype-devel freetype* freetype libXpm libXpm-devel libpng-devel libpng* libvpx-devel libvpx libcurl libcurl-devel curl* curl-devel curl tcp_wrappers-devel libzip environment-modules uw-imap-utils uw-imap-devel uw-imap uw-imap-static pam-devel libldb-devel openldap-devel cyrus-sasl-devel bzip2-devel bzip2 bzip2-libs ncurses-devel ncurses mysql-devel libjpeg-devel libjpeg* libjpeg-devel openssl-devel openssl* openssl-libs libxml* libxml2 libxml2-devel libmcrypt libmcrypt-devel libmcrypt* mcrypt mhash* mhash mhash-devel libmhash libmhash-devel expat-devel expat expat* gmp* gmp gmp-devel krb5* krb5-devel db4 db4-devel wget make cmake libtool* pcre* gdbm* gdbm gdbm-devel libtiff* libtiff libtiff-devel flex zlib* zlib-devel zlib gd* gd gd-devel patch t1lib t1lib-devel readline libedit-devel libtidy libtidy-devel gcc* gcc gcc-c++ libtermcap-devel dialog sqlite-devel oniguruma oniguruma-devel libzip5 mod_ssl postgresql-devel lcov systemtap-sdt-devel mod_ldap elfutils-devel libwebp-devel libwebp git gzip libnghttp2-devel valgrind* mod_proxy* editline editline-devel patchelf systemd-devel ImageMagick-devel libzstd-devel libffi libffi-devel libraqm-devel libraqm libsodium libsodium-devel
# apache 2.4 , apr 다운로드
cd /usr/local/src/APM_Setup
wget https://archive.apache.org/dist/httpd/httpd-2.4.57.tar.gz
tar -zxvf httpd-2.4.57.tar.gz
wget https://archive.apache.org/dist/apr/apr-1.7.4.tar.gz
tar -zxvf apr-1.7.4.tar.gz
wget https://archive.apache.org/dist/apr/apr-iconv-1.2.2.tar.gz
tar -zxvf apr-iconv-1.2.2.tar.gz
wget https://archive.apache.org/dist/apr/apr-util-1.6.3.tar.gz
tar -zxvf apr-util-1.6.3.tar.gz
wget https://ftp.exim.org/pub/pcre/pcre-8.45.tar.gz
tar -zxvf pcre-8.45.tar.gz
# apr 설치
cd /usr/local/src/APM_Setup/apr-1.7.4
./configure --prefix=/usr/local/apr
make -j && make install
cd /usr/local/src/APM_Setup/apr-iconv-1.2.2
./configure --prefix=/usr/local/apr --with-apr=/usr/local/apr/bin/apr-1-config
make -j && make install
cd /usr/local/src/APM_Setup/apr-util-1.6.3
./configure --prefix=/usr/local/apr --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-iconv=/usr/local/apr/bin/apriconv --with-crypto --with-openssl --with-nss --with-lber --with-ldap --with-ldap-include=/usr/include --with-ldap-lib=/usr/lib64/
make -j && make install
cd /usr/local/src/APM_Setup/pcre-8.45
./configure --prefix=/usr/local/pcre --enable-pcre8 --enable-pcre16 --enable-pcre32 --enable-jit --enable-utf8 --enable-pcregrep-libz --enable-pcregrep-libbz2 --enable-pcretest-libreadline --enable-valgrind
make -j && make install
# apache 설정 및 설치
cd /usr/local/src/APM_Setup/httpd-2.4.57
sed -i "s/#define DEFAULT_SERVER_LIMIT 256/#define DEFAULT_SERVER_LIMIT 2048/g" server/mpm/prefork/prefork.c # 동시 접속자 업데이트
./configure --prefix=/usr/local/apache --enable-load-all-modules --enable-maintainer-mode --enable-debugger-mode --enable-pie --enable-modules=all --enable-mods-shared=all --enable-imagemap --enable-authnz-ldap --enable-authnz-fcgi --enable-allowmethods --enable-isapi --enable-file-cache --enable-cache --enable-cache-disk --enable-cache-socache --enable-socache-shmcb --enable-socache-dbm --enable-socache-memcache --enable-socache-redis --enable-so --enable-rewrite --enable-ssl --enable-expires --enable-proxy-fcgi --enable-proxy-scgi --enable-proxy-html --enable-cgi --enable-cgid --enable-xml2enc --enable-cern-meta --enable-case-filter --enable-ident --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr/bin/apu-1-config --with-pcre=/usr/local/pcre/bin/pcre-config --with-mpm=prefork --enable-http --disable-http2 --enable-modules=all
make -j && make install
# 설정파일 수정
sed -i "s/`grep '^User ' /usr/local/apache/conf/httpd.conf`/User nobody/g" /usr/local/apache/conf/httpd.conf
sed -i "s/`grep '^Group ' /usr/local/apache/conf/httpd.conf`/Group nobody/g" /usr/local/apache/conf/httpd.conf
sed -i 's/#ServerName www.example.com:80/ServerName localhost:80/g' /usr/local/apache/conf/httpd.conf
sed -i 's/ServerAdmin you@example.com/ServerAdmin root@localhost/g' /usr/local/apache/conf/httpd.conf
# systemd 설정
echo '[Unit]
Description=The Apache HTTP Server
[Service]
Type=forking
#EnvironmentFile=/usr/local/apache/bin/envvars
PIDFile=/usr/local/apache/logs/httpd.pid
ExecStart=/usr/local/apache/bin/apachectl start
ExecReload=/usr/local/apache/bin/apachectl graceful
#ExecStop=/bin/kill -WINCH
ExecStop=/usr/local/apache/bin/apachectl stop
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target
' > /usr/lib/systemd/system/apachectl.service
* php 관련 설정은 제외하였습니다.
2. tomcat 설치
tomcat 또한 tar파일을 설치하여 다운로드합니다. 링크를 통해 좌측 하단에서 버전을 다운로드하실 수 있습니다.
아래는 10.1.20 버전을 다운로드하는 과정입니다.
cd /usr/local/src
wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.20/bin/apache-tomcat-10.1.20.tar.gz
tar xvf apache-tomcat-10.1.20.tar.gz
mv apache-tomcat-10.1.20 /usr/local/tomcat
데몬을 따로 설정을 하지 않았기 때문에
/usr/local/tomcat/bin/startup.sh를 사용하여 실행합니다.
다음으로 netstat -nltp를 이용하여 8080 포트와 8005 포트가 열린 걸 확인하고
curl localhost:8080에 접속이 되는지 확인합니다.
3. java 설치
톰캣의 버전별로 필요한 자바의 최소 버전이 있습니다. 해당 버전은 링크에서 확인이 가능합니다.
저는 톰캣을 10.1.x버전을 설치하였기 때문에 java는 11보다 높은 버전이 필요합니다.
java는 yum을 사용하여 패키지로 설치하겠습니다.
패키지 설치 전 정확한 패키지의 이름을 확인하고 설치하겠습니다.
yum list java*jdk-devel
아래와 같은 결과가 출력됩니다.
java-1.6.0-openjdk-devel.x86_64 1:1.6.0.41-1.13.13.1.el7_3 base
java-1.7.0-openjdk-devel.x86_64 1:1.7.0.261-2.6.22.2.el7_8 base
java-1.8.0-openjdk-devel.i686 1:1.8.0.402.b06-1.el7_9 updates
java-1.8.0-openjdk-devel.x86_64 1:1.8.0.402.b06-1.el7_9 updates
java-11-openjdk-devel.i686 1:11.0.22.0.7-1.el7_9 updates
java-11-openjdk-devel.x86_64 1:11.0.22.0.7-1.el7_9 updates
java 11 버전이 필요하므로 java-11-openjdk-devel.x86_64을 설치합니다.
ymu install -y java-11-openjdk-devel.x86_64
설치 완료 후 java의 버전을 확인합니다.
java -version
이제 tomcat의 systemd를 설정하겠습니다.
vi /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=forking
#Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
Environment=CATALINA_PID=/usr/local/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/usr/local/tomcat
Environment=CATALINA_BASE=/usr/local/tomcat
#Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
#Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
#User=tomcat
#Group=tomcat
#UMask=0007
#RestartSec=10
#Restart=always
[Install]
WantedBy=multi-user.target
필요에 따라 주석처리 된 설정값을 바꾸어 등록해 주시면 됩니다.
4. tomcat connerctor 설치
mod_jk로 apache와 tomcat을 연동하기 위해 tomcat connector가 필요합니다.
tomcat connertor는 링크에 접속하여 설치파일을 다운로드합니다.
다운로드를 한 후 apache의 apxs경로를 지정하여 컴파일 후 설치합니다.
cd /usr/local/src
wget https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.49-src.tar.gz
tar xvf tomcat-connectors-1.2.49-src.tar.gz
cd tomcat-connectors-1.2.49-src/native
./configure --with-apxs=/usr/local/apache/bin/apxs
make && make install
apxs는 아파치의 확장 도구를 저장하는 경로이며, mod_jk.so가 설치되는 곳입니다.
설치가 완료되었다면 mod_jk의 경로를 확인합니다
find / -name mod_jk.so 2>/dev/null
5. mod_jk 설정
mod_jk로 apache와 tomcat을 연동하기 위해서는
apache의 workers.properties 설정
apache의 httpd.conf 설정
tomcat의 server.xml 설정
이 필요합니다.
5-1) workers.properties 설정
포트와 ip를 사용하여 tomcat으로 접속하는 트래픽을 관리합니다.
vi /usr/local/apache/conf/workers.properties
worker.list=worker1
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker1이라는 alias로 connector를 지정하였습니다.
5-2) httpd.conf 설정
mod_jk 모듈을 명시하여 세부 옵션을 지정합니다.
vim /usr/local/apache/conf/httpd.conf
LoadModule jk_module modules/mod_jk.so
<IfModule mod_jk.c>
JkWorkersFile conf/workers.properties
JkShmFile logs/mod_jk.shm
JkLogFile logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H :%M :%S %Y]"
JkMount /* worker1
</IfModule>
worker1이라는 connector에 모든 형식의 파일들과 연결하고, 로그파일을 설정합니다.
5-3) server.xml 설정
tomcat AJP connector와 관련된 설정의 주석을 풀어 적용시킵니다.
vim /usr/local/tomcat/conf/server.xml
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector protocol="AJP/1.3"
address="0.0.0.0" # 수신 ip 설정
port="8009" # worker1의 포트 설정
redirectPort="8443"
maxParameterCount="1000"
secretRequired="false"
/>
apache와 tomcat 재구동
systemctl restart apachectl
systemctl restart tomcat
이제 apache와 tomcat이 연동되어 localhost로 접속하면 tomcat의 index페이지가 보이게 될 것입니다.
6. 트러블 슈팅
6-1) tomcat 구동
간혹 연동 과정에서 tomcat의 구동이 늦어 페이지가 열리지 않을 때가 있었습니다.
이때 catalina.out의 로그를 살펴보면 구동 실패인지, 구동 준비 중인지 확인할 수 있습니다.
해당 로그 파일은
cat /usr/local/tomcat/logs/catalina.out
에서
03-Apr-2024 13:17:49.273 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [372320] milliseconds
와 같은 출력문을 확인하여 판단할 수 있습니다.
INFO의 경우 정상작동 중이며, DEBUG일 경우 설정 파일에 문제가 있다는 것입니다.
6-2) workers.propertices 설정
설정 파일을 잘못 지정하거나 ip를 잘못 입력한다면
cat /usr/local/apache/logs/mod_jk.log
에서 설정 된 listen 포트와 연결이 되었는지 확인이 가능합니다.
만약 failed가 출력된다면 포토의 설정값을 확인하거나 apache나 tomcat을 재구동시켜 해결이 가능합니다.
이상 centos에서 apahce와 tomcat을 연동하는 방법을 아아봤습니다.
감사합니다.
'OS > Linux' 카테고리의 다른 글
mod_jk를 활용하여 lb설정 하기 (0) | 2024.04.04 |
---|---|
Ubuntu22.04) apache, tomcat 설치 및 연동 (mod_jk) (1) | 2024.04.03 |
PHP 확장 모듈 컴파일 설치 도구 PHPIZE (0) | 2024.04.01 |
Centos7 apache 2.4, apr설정, php 7.4.33, sqlsrv 설치 및 연동 (3) (2) | 2024.03.28 |
Centos7 apache 2.4, apr설정, php 7.4.33, sqlsrv 설치 및 연동 (2) (0) | 2024.03.28 |