- target: Apache - Tomcat 연동 시, mod_proxy / mod_proxy_ajp 방식으로 연동
- method:
※ 기본 전제 사항
- Linux 환경 기준
- Apache는 v2.4 이상(2.4 미만에 대해서는 마지막에 desc 부분 확인), Tomcat은 v9 이상 기준
- Apache는 설치 경로는 /usr/local/apache2
- Tomcat의 설치 경로는 /usr/local/tomcat
- Apache와 Tomcat은 한개의 서버가 아닌 각각 개별 서버에 설치 (Kubernetes의 경우, 하나의 Node에 각각의 Pod에 설치해도 무관)
- Apache와 Tomcat은 서로 방화벽 open (mod_proxy의 경우 AJP가 아닌 http로도 가능)
1. Apache - Tomcat 연동 아키텍쳐
1.1. 사용자의 요청은 모두 1차적으로 Web Server의 Apache로 접근 (포트 80)
1.2. 정적인 리소스(각종 이미지, css, js 등)은 Apache에서 해당 파일을 찾아서 응답
2.3. 각종 로직정보를 포함한 Application의 경우에는 Tomcat으로 전달하여, 처리된 이후 전달받아서 응답
2. Apache - Tomcat 연동
2.1. mod_jk: tomcat connector를 이용한 방법. 옛날부터 사용하다보니 가이드 문서들을 다수 찾아볼 수 있음
2.2. mod_proxy: apache의 mod_proxy, mod_proxy_http 모듈을 이용하여 reverse proxy 기능을 사용한 방법
2.3. mod_proxy_ajp: AJP Protocol을 reverse proxy로 사용하는 방법
3. Apache 설정
# /usr/local/apache2/conf/httpd.conf
...
(중략)
...
# 아래 모듈들 주석 해제 (본인이 필요한게 어떤건지 아는 경우, 필요 모듈만 해제)
########################################################
...
LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule authn_file_module modules/mod_authn_file.so
...
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
...
LoadModule authz_core_module modules/mod_authz_core.so
...
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
...
LoadModule reqtimeout_module modules/mod_reqtimeout.so
...
LoadModule filter_module modules/mod_filter.so
...
LoadModule mime_module modules/mod_mime.so
...
LoadModule log_config_module modules/mod_log_config.so
...
LoadModule env_module modules/mod_env.so
...
LoadModule headers_module modules/mod_headers.so
...
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule remoteip_module modules/mod_remoteip.so
# mod_proxy 모듈
LoadModule proxy_module modules/mod_proxy.so
...
# mod_proxy 모듈
LoadModule proxy_http_module modules/mod_proxy_http.so
...
# mod_proxy_ajp 모듈
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
...
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
...
LoadModule ssl_module modules/mod_ssl.so
...
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
LoadModule unixd_module modules/mod_unixd.so
...
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
...
# mod_proxy 모듈 사용시 필요
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
...
LoadModule alias_module modules/mod_alias.so
...
# mod_jk 모듈
LoadModule jk_module modules/mod_jk.so
...
########################################################
...
(중략)
...
# 보통 ServerName을 127.0.0.1:80으로 수정
ServerName ${hostname}
<Directory />
AllowOverride none
# Require all denied
Require all granted
</Directory>
...
(중략)
...
# 아래 httpd-vhosts.conf 주석 해제
Include conf/extra/httpd-vhosts.conf
...
※ LoadModule 부분은 본인이 필요한 모듈을 알고 있는 경우, 해당 모듈만 주석해제 하여도 가능
※ mod_proxy 연동 시, ServerName & Directory 설정 필수
# /usr/local/apache2/conf/extra/httpd-vhosts.conf
...
(중략)
...
<VirtualHost *:80>
ServerName ${HOSTNAME}
# 정적 리소스 위치
# NAS를 이용하여 web과 was의 documentRoot와 webRoot를 일치한 경우, 해당 경로로 설정
DocumentRoot "/usr/local/apache2/htdocs/static"
# ProxyRequests= Forward proxy는 On, Reverse proxy는 Off
ProxyRequests Off
# HTTP HOST가 받은 HTTP Request를 Proxy 요청 시 사용, Reverse의 경우 On
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
# 마지막에 !는 해당 URL로 시작하는 경우, Proxy를 적용하지 않고, 정적 리소스는 Apache에서 처리
# ProxyPass에는 정규식 적용 불가
ProxyPass /resources !
ProxyPass /images !
# 정규식은 ProxyPassMatch에서 적용
#ProxyPassMatch ^/(.*\.jsp)$ http://${WAS_IP or WAS_HOSTNAME}:8080/$1
#ProxyPassMatch ^/(.*\.do)$ http://${WAS_IP or WAS_HOSTNAME}:8080/$1
# Proxy에 연결할 URL
ProxyPass / http://${WAS_IP or WAS_HOSTNAME}:8080/
# <ProxyPassReverse>
# WAS가 redirect HTTP 응답을 보냈을 경우, Location, Content-Location HTTP header를 수정하여 Client에 전달
# Reverse Proxy가 이 header를 수행하지 않으면 Client는 redirect시 제대로 연결할 수 없으므로 반드시 설정 필요
ProxyPassReverse / http://${WAS_IP or WAS_HOSTNAME}:8080/
<Location />
Order allow,deny
Allow from all
</Location>
ErrorLog "|/usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/apache-error_log.%Y-%m-%d 86400 +540"
CustomLog "|/usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/apache-access_log.%Y-%m-%d 86400 +540" combined
</VirtualHost>
...
※ 일반적으로 대다수의 글에서 보면 Apache - Tomcat 연동했다고 하고 ProxyPass / http://localhost:8080/ 만 작성하고 끝남
※ 연동이 된 것은 맞지만, 위 부분만 작성할 경우, Apache로 온 모든 요청에 대해서 Tomcat으로 bypass 시켜버리기 때문에, 연동의 의미가 없음 이럴꺼면 그냥 Tomcat만 쓰지 뭐하러 Apache까지 설치 연동하나...
※ 단순히 포트 80을 사용해서 Domain 뒤에 포트를 작성하지 않기 위해서 하는 거라면 상관없음
※ 정적리소스를 apache에서 처리하기 위해서 ProxyPass에서 Domain뒤에 정적리소스 디렉토리 명과 !를 작성하면, 해당 URL의 모든 요청은 WAS로 넘기지 않고 apache에서 처리
ex) http://localhost/resources/js/jquery-min.js > ${DocumentRoot}/resources/js/jquery-min.js 를 찾음
※ mod_proxy는 3. apache 설정만으로 끝
※ mod_proxy_ajp 방식을 원할 경우, 아래 내용 진행
4-1. properties 생성
# /usr/local/apache2/conf/prop/mod_proxy_http.properties
RewriteEngine on
ProxyErrorOverride on
Timeout 600
ProxyTimeout 600
ProxyRequests Off
ProxyPreserveHost On
ProxyPassMatch ^/.*\.(jsp|do)$ http://localhost:8080/
# /usr/local/apache2/conf/prop/mod_proxy_ajp.properties
RewriteEngine on
ProxyErrorOverride on
Timeout 600
ProxyTimeout 600
ProxyRequests Off
ProxyPreserveHost On
ProxyPassMatch ^/.*\.(jsp|do)$ ajp://localhost:8009/
4-1. Apache 설정
# /usr/local/apache2/conf/extra/httpd-vhosts.conf
...
(중략)
...
<VirtualHost *:80>
ServerName ${HOSTNAME}
# 정적 리소스 위치
# NAS를 이용하여 web과 was의 documentRoot와 webRoot를 일치한 경우, 해당 경로로 설정
DocumentRoot "/usr/local/apache2/htdocs/static"
<Directory "/usr/local/apache2/htdocs/static">
AllowOverride ALL
Options MultiViews FollowSymLinks
DirectoryIndex index.jsp index.html index.htm
<RequireAll>
Require all granted
</RequireAll>
</Directory>
#mod_proxy(http)
IncludeOptional conf/prop/mod_proxy_http.properties
#mod_proxy_ajp(ajp)
#IncludeOptional conf/prop/mod_proxy_ajp.properties
ErrorLog "|/usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/apache-error_log.%Y-%m-%d 86400 +540"
CustomLog "|/usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/apache-access_log.%Y-%m-%d 86400 +540" combined
</VirtualHost>
...
4-2. Tomcat 설정
# /usr/local/tomcat/conf/server.xml
...
(중략)
...
<!-- Define an AJP 1.3 Connector on port 8009 -->
<!--
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
redirectPort="8443"/>
-->
# 원본 아래에 동일하게 추가
<Connector address="0.0.0.0"
port="8009"
maxHttpHeaderSize="8192"
tomcatAuthentication="false"
maxThreads="150"
minSpareThreads="25"
maxSpareThreads="75"
secretRequired="false"
enableLookups="false"
acceptCount="100"
redirectPort="8443"
connectionTimeout="20000"
disableUploadTimeout="true"
protocol="AJP/1.3"/>
...
- warning:
- Apache v2.4 미만 관련:
mod_proxy를 통한 apache - tomcat 연동의 경우, 2진 패킷 전송 크기가 8kb이므로, mod_jk를 사용하고 있는 경우, mod_proxy 방식으로 변경을 권장하지 않는다고 함
Apache v2.4 부터는 성능 차이가 크게 줄어들었기 때문에 v2.4이상부터 mod_proxy로 변경하여도 무방하다고 함
- mod_proxy / mod_proxy_ajp의 차이는 http(default tomcat 기준 8080) / ajp(default tomcat 기준 8009) 연결의 차이
- source:
https://velog.io/@bonjaski0989/EC2-TomcatModProxy-%EC%97%B0%EB%8F%99
[EC2] Apache↔ Tomcat Mod_Proxy 연동
[EC2] Apache-Tomcat Mod_Proxy 연동법에 대한 기술글입니다.
velog.io
https://sepiros.tistory.com/16
[CentOS 7] Apache 웹 서버 " 2 "
6. Apache 모듈 사용 Apache 웹 서버는 다양한 기능을 제공하는 모듈을 통해 그 기능을 더욱 풍성하게 사용할 수 있다. 이러한 모듈은 서버 관리자의 필요에 따라 언제든지 Apache에 동적으로 포함되거
sepiros.tistory.com
https://sarc.io/index.php/httpd/621-proxypassmatch-apache-http-server
ProxyPassMatch 사용법(Apache HTTP Server)
Tech Note 정보 808베이스 님이 작성하신 글입니다. 카테고리: [ Apache HTTP Server ] 게시됨: 06 October 2016 작성됨: 06 October 2016 최종 변경: 13 December 2016 조회수: 10074 Apache HTTP Server 2.2.5이상 버전에서 사용
sarc.io
https://jfrom.tistory.com/entry/modjk-%EB%8C%80%EC%8B%A0-modproxy%EC%82%AC%EC%9A%A9
mod_jk 대신 mod_proxy사용
mod_jk 잘 쓰고 있는 상태면 mod_proxy로 굳이 바꿀 필요는 없다. mod_proxy를 쓰려는 이유는 별도의 모듈 빌드가 필요없고 별도의 설정 파일이 필요없어서 사용하려고 함. apache 2.2버전을 사용할때 쓸만
jfrom.tistory.com
https://hoing.io/archives/178#mod_proxy_mod_proxy_ajp
리눅스에 apache tomcat9 jdk yum 으로 설치 및 연동
안녕하세요 이번 포스팅에서는 apache 와 tomcat 9 버전 그리고 jdk 를 yum(패키지 시스템) 으로 설치하는 내용에 대해서 확인 해보도록 하겠습니다. 내용 업데이트 : 2020/11/06 설치 진행 환경 - OS: C
hoing.io
Apache | Apache 기본 설정 | 접근 허용 범위 설정 (섹션 컨테이너)
Apache에서는 접근을 허용하는 적용 범위를 디렉토리 단위와 파일 단위로 제한할 수 있다. 여기에서는 구성 적용 범위를 지정하는 방법에 대해 설명한다. 구성 적용 범위를 제한 “httpd.conf"파일을
www.devkuma.com
'Dev > Server' 카테고리의 다른 글
[Apache] 설정 파일의 주석 위치에 따른 Apache 응답 속도 저하 (0) | 2022.06.28 |
---|---|
[Tomcat] URL 마지막에 jsessionid가 생성되는 원인 및 해결안 (0) | 2022.06.28 |
[Docker] hostname (0) | 2022.06.20 |
[Maven] Maven build시 profile 설정 (0) | 2022.06.20 |
[SAP] 로컬 연결 환경설정 (0) | 2022.06.13 |