500 Internal Server Error, nginx 권한 문제 해결 삽질기
500 Internal Server Error, nginx 권한 문제 해결 삽질기
안녕하세요, 오늘은 Nginx와 Docker를 함께 사용하면서 겪었던 500 Internal Server Error 해결 과정을 공유하려 합니다. 단순한 문제가 복잡하게 얽혀 며칠을 고생했지만, 결국 근본 원인을 찾아 해결할 수 있었습니다. 저와 같은 문제를 겪는 분들에게 이 글이 도움이 되기를 바랍니다.
문제 상황 요약
저는 프런트엔드(Vite)와 백엔드(Spring Boot)를 각각 빌드하여 홈 서버에 배포하고 있었습니다. Nginx는 프록시 서버 역할을 맡고 있었죠.
- 프런트엔드:
Vite build결과물을 Nginx가 서빙 (travelight.co.kr) - 백엔드: Spring Boot 애플리케이션을 Docker 컨테이너로 실행 (
localhost:8080) - Nginx 설정:
/api요청은localhost:8080으로 프록시
문제는 https://travelight.co.kr로 접속했을 때 500 Internal Server Error가 발생한다는 것이었습니다. 다른 Docker 컨테이너들은 localhost로 프록시해도 잘 작동했기 때문에, 저는 백엔드나 네트워크 문제에 집중했습니다.
삽질 과정
- 백엔드 로그 분석:
sudo docker logs travellight-app명령어로 로그를 확인했습니다. 처음에는 데이터베이스 연결 실패(UnknownHostException) 같은 오류가 보였습니다.docker-compose.yml파일을 수정하여 컨테이너 간 네트워크를 연결했죠. - 로그가 안 찍히는 현상: 데이터베이스 연결 문제를 해결한 후, 다시 접속해 보니 여전히 500 에러가 뜨는데 백엔드 로그에는 아무것도 찍히지 않았습니다. 이 때문에 Nginx가 요청을 백엔드로 전달조차 못하고 있다는 것을 깨달았습니다.
- Nginx와 Docker 통신 재검토:
Nginx를 도커 컨테이너로 통합하거나, 호스트 네트워크 모드를 사용하는 등 다양한 방법을 시도했지만, 제 환경에서는 해결되지 않았습니다. 다른 서비스들이
localhost로 잘 작동하는 것을 보고, 문제의 원인은travelight-app에 국한되어 있다고 확신했습니다.
문제의 진짜 원인: Nginx 권한
결론은 Nginx가 프런트엔드 파일(Vite 빌드 결과물)에 접근할 권한이 없었기 때문입니다.
http://공인IP:5173으로 접속하면 프런트엔드가 잘 로드되었지만, Nginx를 거치면 500 에러가 떴습니다. Nginx 로그를 확인한 결과, 다음과 같은 결정적인 오류 메시지를 발견했습니다.
Permission denied, client: 192.168.55.1, server: travelight.co.kr
이 로그는 Nginx 프로세스가 root 경로로 지정된 /home/hamsm/... 디렉터리에 접근할 수 없었다는 것을 명확하게 보여줬습니다.
Nginx는 보안을 위해 www-data라는 사용자로 실행되는데, 제 파일들은 모두 제 계정(hamsm) 소유였기 때문에 권한 충돌이 발생한 것입니다.
최종 해결 방법
www-data 사용자가 파일에 접근할 수 있도록 권한을 변경해주는 것이 정답이었습니다.
- 상위 디렉터리 접근 권한 부여:
Nginx가
dist폴더까지 찾아 들어갈 수 있도록, 상위 디렉터리(hamsm,TravelLight등)에 실행(x) 권한을 부여합니다.sudo chmod o+x /home/hamsm - 파일 소유권 변경:
Nginx가 파일을 자유롭게 읽을 수 있도록
dist폴더의 소유자를www-data로 변경합니다.sudo chown -R www-data:www-data /home/hamsm/TravelLight/src/main/travellight/dist - 파일 권한 부여:
www-data가dist폴더의 파일을 읽을 수 있도록 권한을 설정합니다.755권한은 소유자에게는 모든 권한을, 그 외 사용자에게는 읽기 및 실행 권한을 줍니다. 쓰기 권한을 주는777은 보안상 매우 위험하므로 사용하지 않습니다.sudo chmod -R 755 /home/hamsm/TravelLight/src/main/travellight/dist
이 세 가지 명령어를 실행한 후 Nginx를 재시작하자, 마침내 프런트엔드 화면이 정상적으로 로드되었습니다.
이 문제는 Nginx와 Docker의 복잡한 네트워크 문제처럼 보였지만, 사실은 기본적인 파일 권한 문제였습니다. 이번 경험을 통해 서버 배포 시 권한 관리의 중요성을 다시 한번 깨달았습니다.
감사합니다.