HTTP 프로토콜은 많이 들어보셨을텐데, AJP프로토콜은 들어보셨나요?
아파치랑 톰캣이랑 연동하는 통신방식입니다.
요즘은 Nginx를 http통신을하여 리버스프록시 형태를 주로 가져가죠.
포워드프록시, 리버스프록시는 관련 글을 포스팅 해보도록 하겠습니다.
하지만 프로젝트에서 apache를 채택했다면 속도면에서 우월한
바이너리 형식의 통신방식인 AJP(Apache JServ Protocol) 를 주로 택할겁니다.
이 글에서는 apache와 tomcat의 연동방식에 대해서 알아볼겁니다
물론 HTTP 프로토콜을 사용 할 수도 있으니 같이 소개해보도록 할게요!
AJP와 HTTP
AJP와 HTTP 프로토콜의 기본 개념부터 살펴보겠습니다.
HTTP는 웹에서 데이터를 전송하기 위한 가장 기본적인 프로토콜로 웹 브라우저와 서버 간의 통신에 사용됩니다.
반면, AJP는 특히 아파치 웹 서버와 톰캣 같은 WAS 간의 통신을 최적화하기 위해 설계된 프로토콜입니다.
AJP는 바이너리 형식의 데이터 전송을 통해 HTTP보다 더 효율적인 통신을 가능하게 합니다.
아파치와 톰캣 연동 전략
아파치와 톰캣을 연동하는 방법은 크게 세 가지로 나뉩니다 (모듈 기준)
1. mod_jk
2. mod_proxy_ajp
3. mod_proxy를 이용한 HTTP 리버스 프록시
모듈 | mod_jk | mod_proxy_ajp | mod_proxy |
프로토콜 | AJP | AJP | HTTP/HTTPS |
주요 용도 | 아파치와 톰캣 간의 효율적인 연동 | 아파치와 톰캣 간의 연동 | 다양한 애플리케이션 서버와의 범용 연동 |
장점 | - 낮은 네트워크 오버헤드 - 성능 최적화 - 로드 밸런싱 및 세션 클러스터링 지원 |
- mod_proxy의 유연성 - AJP 기반의 성능 이점 - 설정과 관리의 용이성 |
- 설정의 단순성 - SSL 터미네이션 지원 - 범용적인 사용 가능 |
단점 | - 설정 복잡성 - 주로 Java 애플리케이션 서버에 한정 - 모듈 별도 구성 및 필요시 C언어 컴파일 필요 |
- mod_jk 대비 세부 튜닝 제한 |
- AJP 대비 높은 네트워크 오버헤드 - 성능 저하 가능성 |
적합한 환경 | - 성능 최적화가 필요한 대규모 Java 웹 애플리케이션 |
- 설정의 유연성을 원하는 Java 웹 애플리케이션 |
- 다양한 유형의 애플리케이션 서버와의 연동 - 간단한 설정을 원하는 경우 |
아파치 모듈 활성화 하기
간단하게 사용하는 방법을 설명할겁니다
그전에 apache설치가 필요합니다.
c드라이브에 아파치와 톰캣이 설치됐다는 가정을 하겠습니다.
0. 톰캣 server.xml 설정
#C:\apache-tomcat-7.0.67\conf\server.xml
#위의 파일에 아래 코드추가
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
1. mod_jk
https://archive.apache.org/dist/tomcat/tomcat-connectors/jk/
모듈설치가 필요하고, 해당 모듈은 C:\Apache24\modules 에 던져져야합니다.
링크에서 환경에 맞는 connector를 다운받아서 압축풀면
mod_jk.so라는 파일이 나옵니다. 그걸 던져주면 됩니다.
셋팅하는걸 쭉 써볼게요
#C:\Apache24\conf\httpd.conf
#위의 파일에 아래 코드추가
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkMount /app/* worker1
#C:\Apache24\conf\workers.properties
#위의 파일에 아래 코드추가
worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
2. mod_proxy_ajp (AJP 리버스 프록시)
별도 모듈 설치가 필요없습니다.
#C:\Apache24\conf\httpd.conf
#위의 파일에 아래 코드추가
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
Include conf/extra/httpd-vhosts.conf
#C:\Apache24\conf\extra\httpd-vhosts.conf
#위의 파일에 아래 코드추가
<VirtualHost *:80>
ServerName localhost
ProxyPass /app ajp://localhost:8009/app
ProxyPassReverse /app ajp://localhost:8009/app
</VirtualHost>
3. mod_proxy (HTTP 리버스 프록시)
별도 모듈 설치가 필요없습니다.
#C:\Apache24\conf\httpd.conf
#위의 파일에 아래 코드추가
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
Include conf/extra/httpd-vhosts.conf
#C:\Apache24\conf\extra\httpd-vhosts.conf
#위의 파일에 아래 코드추가
<VirtualHost *:80>
ServerName localhost
ProxyPass /app http://localhost:8080/app
ProxyPassReverse /app http://localhost:8080/app
</VirtualHost>
결론
윈도우 환경에서 아파치 웹서버와 애플리케이션 서버의 연동은
mod_proxy, mod_jk, mod_proxy_ajp 모듈을 통해 효과적으로 구성할 수 있습니다.
각 모듈의 선택은 애플리케이션의 요구 사항과 성능 목표에 따라 달라질 수 있으므로 상황에 맞게 사용하도록 합시당
그리고 추가적으로 톰캣에서 AJP취약점 이슈가 있는데요.
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
톰캣 특정 버전들에서 ajp통신을 사용하지 않는데, 자동으로 커넥터가 열려있습니다.
저걸 이용한 공격법들이 github에 돌았었습니다.
AJP통신을 하지 않는다면 지워주세요 그러면 문제가 되지 않습니다
사실 apache-tomcat-7.0.67 버전으로 깔아둔 이유가 취약점 공격법까지 같이 써볼려고 했는데
글이 너무 길어져서 다음에 해보도록할게요!
참고자료
https://cwiki.apache.org/confluence/display/TOMCAT/Connectors#Connectors-Q2
'통신&프로토콜&네트워크' 카테고리의 다른 글
JSON 이해하기: 개발자의 기본기 (WITH 자바예제) (0) | 2024.02.18 |
---|