홈 › 리눅스 운영 › 05 / 13

Tomcat·nginx 배포·재기동

섹션 7진행 0 / 13

5. 자주 하는 실수 (Tip)

❌ 실수 1: nginx -t 없이 restart 한다

설정 오타 하나로 nginx 가 안 뜨고 모든 서비스가 끊깁니다. reload 는 실패해도 옛 설정으로 계속 돌지만 restart 는 그냥 죽습니다. ✅ 항상 nginx -t && systemctl reload nginx 순서로 씁니다.

❌ 실수 2: war 만 바꾸고 풀린 폴더를 안 지운다

webapps/ROOT/ 에 옛 클래스와 JSP 가 남아 새 war 와 섞입니다. ✅ 폴더, war, work/ 캐시 세 가지를 모두 지운 뒤 복사합니다.

bash
rm -rf webapps/ROOT webapps/ROOT.war work/Catalina/localhost/ROOT

❌ 실수 3: shutdown.sh 직후 바로 startup.sh 를 친다

JVM 이 아직 안 내려갔는데 새 JVM 이 뜨면 8080 포트 충돌로 두 번째가 죽거나, 첫 번째가 남아 옛 버전이 계속 서비스됩니다. ✅ pgrep 으로 사라진 것을 확인한 뒤 시작합니다. 스크립트의 대기 루프가 그 역할입니다.

❌ 실수 4: pkill -f java 로 Tomcat 을 죽인다

같은 서버의 다른 자바 앱까지 모두 죽습니다. ✅ pkill -f "catalina.base=/opt/tomcat" 처럼 인스턴스를 특정하는 문자열을 씁니다.

❌ 실수 5: 프록시 헤더를 안 넘긴다

앱 로그의 IP 가 전부 127.0.0.1 이고, 로그인 후 리다이렉트가 http://localhost:8080/ 으로 갑니다. ✅ Host, X-Real-IP, X-Forwarded-For, X-Forwarded-Proto 네 헤더를 넘기고 Spring 에서 forward-headers-strategy 를 켭니다.

❌ 실수 6: proxy_read_timeout 기본값 60초를 그대로 둔다

리포트 생성 같은 긴 요청이 60초에 504 로 끊기는데 Tomcat 은 계속 처리해 자원을 씁니다. ✅ 긴 요청 경로를 별도 location 으로 빼고 값을 늘리거나, 앱을 비동기 처리로 바꿉니다.

❌ 실수 7: systemctl 과 startup.sh 를 섞어 쓴다

systemd 로 띄운 Tomcat 을 shutdown.sh 로 내리면 Restart=on-failure 가 바로 다시 띄워 "정지가 안 된다" 고 헤맵니다. ✅ 유닛이 있으면 항상 systemctl 만 씁니다. 스크립트가 유닛 존재를 먼저 확인하는 이유입니다.

❌ 실수 8: 백업 없이 war 를 덮어쓴다

새 버전이 안 뜨면 돌아갈 파일이 없습니다. ✅ 교체 전 backup/이름.war.날짜 로 복사합니다. 롤백은 그 파일로 같은 스크립트를 다시 돌리는 것입니다.

❌ 실수 9: catalina.out 을 방치한다

수 GB 로 커져 디스크가 차고, Tomcat 은 파일을 계속 열고 있어 지워도 공간이 안 돌아옵니다. ✅ 06 레슨의 logrotate 에 copytruncate 로 등록합니다. > catalina.out 으로 비우는 것은 응급 처치입니다.

❌ 실수 10: nginx -t 를 일반 사용자로 실행한다

로그 파일 권한 검사에서 실패해 정상 설정도 오류로 나옵니다. ✅ sudo nginx -t 로 실행합니다. 스크립트 전체를 sudo 로 돌리는 것이 보통입니다.