← 전체 글로 돌아가기

서버 운영

서버에서만 터질 때 패키지 충돌과 권한 문제 찾기

로컬에서는 된다는데 서버에서만 안 된다. 권한, 포트, 프로세스를 한 번에 확인하는 진단 방법.

로컬 환경에서는 완벽한데 서버에서만 문제가 난다. 이럴 때는 단순히 코드 문제가 아니라 시스템 환경의 차이일 가능성이 높다.

서버 전체 상태 먼저 보기

한 서비스만 보지 말고, 서버 전체의 상태를 파악한다.

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나 컴파일러 버전에 따라 작동이 달라질 수 있다.

서버에서도 같은 버전으로 설치했는가? 빌드는 정상적으로 됐는가?

한 가지씩 수정하고 재시작하기

권한을 고쳤다면 서비스를 재시작해서 정말 작동하는지 확인한다. 한 번에 여러 것을 고치면 어디서 문제가 풀렸는지 알 수 없다.

해결 후에는 어떤 원인이었고 어떻게 고쳤는지를 기록해두면, 다음 번에 같은 상황이 나올 때 훨씬 빠르게 대응할 수 있다.