며칠 전에 새로 웹서버를 설치하면서 겪었던 경험입니다.
우분투 VM에 Nginx를 설치하고, 설정 파일을 추가한 다음 "systemctl start nginx" 명령으로 기동을 시켰는데, "Job for nginx.service failed because a timeout was exceeded"라는 메시지와 함께 서버가 기동 되지 않았습니다.
에러 메시지로 구글링 해보면 아래와 같은 답변을 많이 찾을 수 있었습니다.
https://kyumpany.tistory.com/53
[Linux] Job for nginx.service failed because a timeout was exceeded.
NGINX service를 시작하면 아래와 같은 에러 메세지로 시작이 안되는 경우가 있습니다. # systemctl start nginx.service Job for nginx.service failed because a timeout was exceeded. See "systemctl status n..
kyumpany.tistory.com
요약하자면, pid이 생성되는 위치가 달라서 그랬다 인데, 저럴 수는 있겠다 싶지만, 제 경우는 저게 원인은 아니었습니다.
한참을 헤매던 중에, 어이없는 설정을 발견했는데 바로 nginx.conf "daemon off" 설정이었습니다. 이게 왜 문제가 되었느냐의 시작은 설치할 웹서버의 테스트를 로컬 환경에서 구성하는 데서 시작합니다.
로컬 환경에서는 다양한 개발환경을 테스트하느라, Docker를 이용합니다. 여느 때와 마찬가지로 nginx 이미지에 설정 내용을 넣고 잘 동작 하나 확인 후 동일한 버전의 nginx를 서버에 설치하고 설정 파일을 그대로 옮겼습니다.
여기서 문제가 시작하는데, Docker의 경우 컨테이너로 실행할 때, 실행되는 앱이 종료되면 컨테이너가 종료됩니다. nginx 같은 경우는 daemon으로 실행되는 것이 기본인데, daemon으로 실행될 경우, 컨테이너는 실행되는 앱이 포그라운드에 없으므로 종료된 것으로 인식하여 컨테이너가 종료됩니다. 따라서 "deamon off" 설정을 추가하여 nginx가 deamon으로 실행되지 않도록 하여야 합니다.
로컬에서 테스트한 설정을 그대로 옮겨 두었으니 "daemon off" 설정은 그대로 있었고 systemd는 nginx의 컨트롤을 가져야 하는데, nginx가 daemon으로 되지 않으니, 타임아웃으로 판단하여 nginx를 종료하고 있었습니다. ( 만약 systemd로 실행하지 않고, 개별로 실행하게 했다면 문제는 겪지 않았겠지만, 콘솔을 종료하는 순간 nginx도 같이 종료되는 현상이 있었겠네요. )
해결은 간단하게도 원인이 되는 "daemon off"를 "daemon on"으로 변경하는 것으로 마무리되었습니다.