웹 애플리케이션 서버(WAS)인 Tomcat이나 Node.js를 8080 포트로 띄우고 바로 외부 트래픽을 받게 하는 것은 보안상, 성능상 좋지 않습니다. 정적 리소스 처리, SSL 암호화, Gzip 압축, 로드 밸런싱 등의 역할을 전문적으로 수행하는 웹 서버를 앞단에 두는 것이 일반적입니다. Apache HTTPD보다 Event-Driven 구조로 동시 접속 처리에 훨씬 유리한 Nginx를 리버스 프록시로 도입했습니다.
Ubuntu 환경에서 패키지 매니저로 설치합니다.
sudo apt update
sudo apt install nginx
sudo systemctl status nginx
Nginx 설정의 핵심은 /etc/nginx/nginx.conf와 /etc/nginx/sites-available/ 디렉토리입니다.
우리는 default 설정 파일을 수정하여 리버스 프록시를 구성합니다.
사용자가 도메인(www.example.com)으로 접속하면 내부의 8080 포트로 트래픽을 토스해주는 설정입니다.
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://localhost:8080;
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;
# 타임아웃 설정 (Long Polling 등을 위해)
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
}
}
보안을 위해 HTTPS는 필수입니다. Certbot을 사용하면 5분 만에 무료 인증서를 발급 및 자동 갱신 설정까지 할 수 있습니다.
# Certbot 설치
sudo apt install certbot python3-certbot-nginx
# 인증서 발급 및 Nginx 설정 자동 변경
sudo certbot --nginx -d www.example.com
이제 sites-available/default 파일을 다시 확인해보면 443 포트 리스닝 설정과 인증서 경로가 자동으로 추가된 것을 볼 수 있습니다.
텍스트 기반의 리소스(HTML, CSS, JS, JSON)를 압축하여 전송량을 줄입니다. nginx.conf의 http 블록에서 주석을 해제합니다.
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
XSS, Clickjacking 공격 등을 방지하기 위한 헤더를 추가합니다.
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
Nginx를 앞단에 배치함으로써 WAS의 부하를 약 30% 절감할 수 있었고, SSL 인증서 관리 포인트가 Nginx 한 곳으로 일원화되어 운영이 편리해졌습니다.
또한 향후 서버 증설 시 upstream 블록만 추가하면 손쉽게 로드 밸런싱을 구현할 수 있는 기반을 마련했습니다.