Tomcat·nginx 배포·재기동
4. 응용 변형 예제
4.1 Tomcat 여러 인스턴스 — CATALINA_BASE 분리
export CATALINA_HOME=/opt/tomcat
export CATALINA_BASE=/opt/tomcat-8081 # conf/ webapps/ logs/ 를 따로
sed -i 's/port="8080"/port="8081"/; s/port="8005"/port="8006"/' "$CATALINA_BASE/conf/server.xml"
"$CATALINA_HOME/bin/startup.sh"server.xml 의 HTTP 포트와 shutdown 포트를 모두 바꿔야 충돌하지 않습니다. 배포 스크립트는 CATALINA_BASE 만 바꿔 같은 파일로 두 인스턴스를 다룹니다.
4.2 catalina.out 보기
Tomcat 의 stdout 은 logs/catalina.out 에 계속 쌓입니다. 02 레슨의 도구를 그대로 씁니다.
tail -f logs/catalina.out | grep --line-buffered -E 'ERROR|Exception'
grep -c 'Server startup in' logs/catalina.out # 기동 횟수
grep -A20 'SEVERE' logs/catalina.out | head -n 40Server startup in [n] ms 가 찍히면 기동 완료입니다. 헬스 체크 URL 이 없는 옛 앱은 이 줄을 기다리는 것으로 대신합니다.
4.3 HTTPS 종료
인증서는 nginx 에만 두고 Tomcat 은 8080 http 로 둡니다. 자바 쪽 keystore 관리가 없어집니다.
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/myapp.crt;
ssl_certificate_key /etc/nginx/ssl/myapp.key;
location / { proxy_pass http://myapp; proxy_set_header X-Forwarded-Proto https; }
}
server { listen 80; return 301 https://$host$request_uri; }X-Forwarded-Proto https 를 넘겨야 Spring 이 리다이렉트 URL 을 https:// 로 만듭니다. 폐쇄망은 사내 CA 인증서를 씁니다.
4.4 정적 파일과 캐시
location ~* \.(js|css|png|woff2)$ {
root /opt/myapp/public;
expires 30d;
add_header Cache-Control "public";
}Tomcat 이 정적 파일까지 서비스하면 스레드를 낭비합니다. 배포 시 정적 파일을 /opt/myapp/public 에 함께 풀어 두면 nginx 가 직접 줍니다.
4.5 점검 페이지 전환
배포 중 사용자에게 점검 안내를 보여 주려면 파일 하나로 전환합니다.
location / {
if (-f /opt/myapp/maintenance.on) { return 503; }
proxy_pass http://myapp;
}
error_page 503 /maintenance.html;
location = /maintenance.html { root /opt/myapp/public; }touch /opt/myapp/maintenance.on 으로 켜고 rm 으로 끕니다. reload 도 필요 없어 배포 스크립트 앞뒤에 넣기 좋습니다.