본문으로 건너뛰기
Advertisement

Nginx + AJP 연동 (ngx_http_ajp_module)

Nginx는 기본적으로 AJP를 지원하지 않습니다. ngx_http_ajp_module이라는 서드파티 모듈을 컴파일하거나 OpenResty를 사용해야 합니다. 현대 환경에서는 HTTP 프록시가 권장되지만, 레거시 시스템 유지보수나 특수한 상황에서 Nginx + AJP 구성이 필요할 수 있습니다.


AJP 연동이 필요한 상황

상황권장 방식
신규 프로젝트HTTP 프록시 (proxy_pass http://) ← 권장
레거시 Apache+AJP를 Nginx로 교체Nginx + AJP (단기 전환)
바이너리 효율이 중요한 극한 성능 요구Nginx + AJP
Apache HTTPD 유지Apache + AJP (Ch6에서 다룸)

실무 관점: Nginx + AJP는 설정 복잡도 대비 HTTP 프록시보다 실질적 성능 이점이 크지 않습니다. 신규 시스템에는 proxy_pass http://를 사용하세요.


ngx_http_ajp_module 설치

방법 1: Nginx 재컴파일 (모듈 포함)

# Nginx 소스 + 모듈 다운로드
NGINX_VER=1.26.0
cd /tmp

wget http://nginx.org/download/nginx-${NGINX_VER}.tar.gz
tar -xzf nginx-${NGINX_VER}.tar.gz

git clone https://github.com/nicholasgasior/nginx-ajp-module.git
# 또는
git clone https://github.com/yaoweibin/nginx_ajp_module.git

cd nginx-${NGINX_VER}

# 현재 Nginx 컴파일 옵션 확인
nginx -V 2>&1 | grep configure

# 기존 옵션 + AJP 모듈 추가해서 컴파일
./configure \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--add-module=/tmp/nginx_ajp_module

make
sudo make install

# 버전 확인
nginx -V 2>&1 | grep ajp

방법 2: OpenResty 사용

OpenResty는 Nginx + Lua 확장 번들로, AJP 모듈이 포함된 빌드를 쉽게 구성할 수 있습니다.

# Ubuntu
wget -qO - https://openresty.org/package/pubkey.gpg | sudo apt-key add -
echo "deb http://openresty.org/package/ubuntu $(lsb_release -sc) main" \
| sudo tee /etc/apt/sources.list.d/openresty.list
sudo apt update
sudo apt install openresty

Tomcat AJP 커넥터 활성화

Nginx + AJP 연동을 위해 Tomcat의 AJP 커넥터를 활성화하고 보안 설정을 합니다.

<!-- server.xml -->
<Connector protocol="AJP/1.3"
address="127.0.0.1"
port="8009"
redirectPort="8443"
secretRequired="true"
secret="NginxAjpSecret2024!"
maxThreads="200"
connectionTimeout="20000"/>

Nginx AJP 설정

# /etc/nginx/conf.d/ajp-upstream.conf
upstream tomcat_ajp {
server 127.0.0.1:8009;
keepalive 32;
}
# /etc/nginx/sites-available/myapp-ajp.conf
server {
listen 443 ssl;
server_name example.com;

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

location / {
ajp_pass tomcat_ajp;

# AJP 보안 시크릿 (Tomcat과 일치해야 함)
ajp_pass_header Secret;

# 헤더 전달
ajp_set_header Host $host;
ajp_set_header X-Real-IP $remote_addr;
ajp_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
ajp_set_header X-Forwarded-Proto $scheme;

# 타임아웃
ajp_connect_timeout 10s;
ajp_send_timeout 60s;
ajp_read_timeout 60s;

# 버퍼
ajp_buffer_size 16k;
ajp_buffers 4 64k;
}
}

HTTP 프록시 방식과 비교

실제 마이그레이션 시나리오에서 AJP → HTTP 프록시로 전환하는 방법입니다.

기존 AJP 방식

location / {
ajp_pass 127.0.0.1:8009;
ajp_set_header Host $host;
}

HTTP 프록시로 전환 (권장)

location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Connection "";
}

전환 시 Tomcat server.xml에서 HTTP 커넥터를 활성화하고 AJP 커넥터를 주석 처리합니다.


AJP 보안 체크리스트

Nginx + AJP를 사용한다면 반드시 아래 보안 설정을 적용합니다.

# 1. AJP 포트 방화벽 차단 (외부 접근 금지)
sudo ufw deny 8009
# 또는
sudo firewall-cmd --remove-port=8009/tcp --permanent
sudo firewall-cmd --reload

# 2. Tomcat AJP 수신 IP 제한 (server.xml)
# address="127.0.0.1" 설정 확인

# 3. secretRequired="true" 설정 확인
grep -i "ajp" /opt/tomcat/latest/conf/server.xml

# 4. Ghostcat 패치 버전 확인
/opt/tomcat/latest/bin/version.sh | grep "Server version"
# Apache Tomcat/9.0.31 이상이어야 함

연결 테스트 및 진단

# AJP 포트 수신 확인
ss -tlnp | grep 8009

# Nginx AJP 설정 검증
sudo nginx -t

# 실제 요청 테스트
curl -v https://example.com/

# AJP 관련 Nginx 에러 로그 확인
tail -f /var/log/nginx/error.log | grep -i ajp

Summary

항목설정
모듈ngx_http_ajp_module (서드파티 컴파일 필요)
Tomcat 설정AJP 커넥터 + secretRequired="true" + address="127.0.0.1"
프록시 지시어ajp_pass (HTTP: proxy_pass)
보안AJP 포트(8009) 방화벽 차단 필수
권장신규 시스템은 HTTP 프록시 방식 사용
Advertisement