21장 배포 장애 10가지를 증상에서 진단한다
1. /releaseportal이 404다
WAR가 STARTED인지, 실제 context path가 무엇인지, Nginx location과 proxy_pass의 trailing slash가 URI를 어떻게 바꾸는지 확인한다. 애플리케이션 로그보다 먼저 외부 URL과 내부 Tomcat URL을 비교한다.
2. Tomcat은 떴지만 앱만 FAIL이다
배포 시각의 catalina와 localhost log에서 첫 root cause를 찾는다. 같은 예외가 반복된 마지막 줄만 복사하지 않는다. web.xml, listener 초기화, JNDI, 환경 설정, DB 연결을 본다.
3. UnsupportedClassVersionError
빌드 JDK와 server JVM bytecode 세대가 다르다. 서버를 즉석 upgrade하거나 오래된 JDK로 재빌드하기 전에 지원 matrix를 확인한다.
4. ClassNotFoundException 또는 NoClassDefFoundError
jar tf WAR와 WEB-INF/lib를 확인한다. Maven provided로 둔 라이브러리를 컨테이너가 실제 제공하는지, 반대로 Servlet API를 중복 포함했는지 본다. 공유 $CATALINA_BASE/lib에 애플리케이션 JAR를 임시 복사해 문제를 숨기지 않는다.
5. 배포 뒤 CPU와 thread가 치솟는다
트래픽을 확대하지 않는다. thread dump, GC, DB pool, 외부 API 지연을 배포 전 baseline과 비교한다. health가 UP이어도 error rate와 p95 기준으로 rollback한다.
6. 브라우저가 이전 인증서를 보여 준다
DNS가 여러 IP를 가리키는지, CDN/LB/Nginx/Tomcat 중 어디서 TLS가 끝나는지 확인한다. 각 IP에 SNI를 넣어 조회한다. reload한 서버가 실제 traffic 대상인지 본다.
7. no suitable certificate 또는 alias 오류
PKCS12/JKS의 entry type이 PrivateKeyEntry인지, alias의 대소문자, certificate와 key 일치, password와 파일 권한을 확인한다.
8. 일부 기기만 체인 오류가 난다
서버가 보낸 full chain을 openssl s_client -showcerts로 확인한다. 서버 내부 파일 목록만 보지 않는다. 오래된 trust store와 누락 intermediate를 구분한다.
9. HTTPS인데 앱이 redirect loop를 만든다
proxy가 X-Forwarded-Proto를 전달하고 애플리케이션 또는 Tomcat이 신뢰할 proxy 범위를 올바르게 처리하는지 본다. 외부가 임의로 보낸 forwarded header를 그대로 신뢰하지 않는다.
10. reload는 성공했는데 새 키를 못 읽는다
새 worker나 Tomcat 프로세스 계정이 실제 파일과 symlink 경로의 모든 상위 디렉터리를 읽을 수 있는지 확인한다. SELinux/AppArmor audit도 본다. 권한 문제를 777로 해결하지 않는다.