서버 운영
서버에서만 터질 때 패키지 충돌과 권한 문제 찾기
로컬에서는 된다는데 서버에서만 안 된다. 권한, 포트, 프로세스를 한 번에 확인하는 진단 방법.
로컬 환경에서는 완벽한데 서버에서만 문제가 난다. 이럴 때는 단순히 코드 문제가 아니라 시스템 환경의 차이일 가능성이 높다.
서버 전체 상태 먼저 보기
한 서비스만 보지 말고, 서버 전체의 상태를 파악한다.
sudo ss -lntp
df -h
sudo journalctl -n 80
첫 번째는 어떤 포트가 이미 점유되고 있는지, 서비스 프로세스가 정상인지 본다. 두 번째는 디스크가 부족한지 확인한다. 세 번째는 최근 에러 로그를 본다.
권한 확인하기
파일과 디렉토리의 소유권이 올바른가? 서비스가 실행되는 사용자가 필요한 파일을 읽고 쓸 수 있는가?
ls -la /path/to/service/directory
권한이 644 또는 755 정도여야 한다. 너무 제한적이면 (600) 서비스 실행 시 권한 에러가 나고, 너무 개방적이면 (777) 보안 문제가 생긴다.
로그에서 진짜 에러 찾기
Journactl로 서비스 로그를 직접 본다.
sudo journalctl -u myservice -n 50
혹은 애플리케이션의 로그 파일을 본다. "port already in use"인가? "permission denied"인가? 에러 메시지가 정확히 뭐라고 하는가?
포트 충돌 확인
내가 원하는 포트가 이미 다른 프로세스에 점유되어 있지 않은가?
sudo ss -lntp | grep :8080
만약 다른 프로세스가 점유하고 있다면, 그 프로세스를 정지하거나 다른 포트를 사용해야 한다.
패키지 버전 차이 확인하기
로컬과 서버의 의존성 버전이 다를 수 있다. 특히 네이티브 바인딩이 필요한 패키지는 서버의 OS나 컴파일러 버전에 따라 작동이 달라질 수 있다.
서버에서도 같은 버전으로 설치했는가? 빌드는 정상적으로 됐는가?
한 가지씩 수정하고 재시작하기
권한을 고쳤다면 서비스를 재시작해서 정말 작동하는지 확인한다. 한 번에 여러 것을 고치면 어디서 문제가 풀렸는지 알 수 없다.
해결 후에는 어떤 원인이었고 어떻게 고쳤는지를 기록해두면, 다음 번에 같은 상황이 나올 때 훨씬 빠르게 대응할 수 있다.