Nginx 시작시키기, 정지시키기, 재시작시키기

필요에 의해서, 아래의 링크를 대~~충 번역한 글입니다.
http://wiki.nginx.org/CommandLine

Nginx 시작시키기, 정지시키기, 재시작시키기

이 페이지는 Nginx를 어떻게 시작시키는지 알려줍니다.
그리고 일단 실행된 Nginx를 어떻게 정지시키고, 재시작할지 컨트롤하는 법을 알려줍니다.

Nginx시작시키기

Nginx는 보통 /usr/bin/nginx 라는 커맨드로 실행됩니다.

Nginx 시작시키기 기본예제

/usr/bin/nginx

Ngnix 시작시키기 고급예제

/usr/bin/nginx -t -c ~/myynginx.conf -g "pid /var/run/nginx.pid; worker_processes 2;"

옵션들

Nginx는 커맨드라인 파라메터를 달랑 몇개만 가지고 있습니다.
수많은 다른 소프트웨어 시스템과는 달리, 설정파일의 설정만으로 설정은 땡입니다. (상상해보세요~)

-c 디폴트파일 대신 사용될 Nginx설정 파일을 지정합니다.

-t  Nginx를 실행하지는 않고 단지 설정파일을 테스트해봅니다. nginx에서 문법에 맞게 설정됐는지 체크합니다. 그리고 설정으로 지정된 파일을 시험삼아 열어봅니다.

-s  master 프로세스로 signal을 날립니다. :stop, quit, reopen, reload. (버전 >=0.7.53)

-v  버전을 찍어줍니다.

-V nginx의 버전, 컴파일러의 버전, 그리고 설정파라메터들을 찍어줍니다.

-ㅔ prefix prefix의 경로를 설정합니다. (디폴트 : /usr/local/nginx/). (버전 >=0.7.53)

-h, -? 도움말 찍기.

nginx 정지, 재시작하기

이미 동작중인 nginx를 정지시키는 방법은 2가지가 있습니다.
첫번째는 -s 명령을 커맨드 라인 파라메터로 넣는 것입니다.
예를들면

/usr/bin/nginx -s stop

이렇게 하면 Nginx서버는 정지될 것입니다. (앞절에서도 말했지만, ‘-s’의 다른 옵션들도 있습니다.)

Nginx를 컨트롤하는 두번째방법은 Nginx의 마스터 프로세스에 시그날을 보내는 것입니다.
디폴트로 nginx는 마스터 프로세스 아이디를 /usr/local/nginx/logs/nginx.pid에 쓰게됩니다.
./configure로 컴파일할때 파라메터로 넘기면 pid경로를 바꿀 수 있습니다. 또는
설정파일에 pid를 직접써서 설정할 수 도 있습니다.
어떻게 ‘QUIT'(정상적으로 종료 – Gracefule Shutdown – )을 Nginx마스터 프로세스로 날리는지는 아래에 나와있습니다.

kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid)

마스터 프로세스는 아래의 시그날들로 조종할 수 있습니다.

TERM, INT - Quick shutdown 빠른 종료
QUIT - Graceful shutdown 정상적으로 종료
KILL - Halts a stubborn process 잘안죽는 프로세스 죽이기
HUP - Configuration reload
      Start the new worker processes with a new configuration
      Gracefully shutdown the old worker processes

      설정 리로드하기
      새로운 워커 프로세스가 시작될때 새로운 설정으로 시작됨
      오래된 워커 프로세스는 알아서 종료

USR1 - Reopen the log files - 로그파일 다시 열기
USR2 - Upgrade Executable on the fly 운행중 실행파일 업그레이드하기
WINCH - Gracefully shutdown the worker processes
        워커프로세스를 정상적으로 종료시키기

워커프로세스가 몇개의 시그날을 지원하기는 하지만, 걔네들을 따로 컨트롤할 필요는 없습니다.

TERM, INT - Quick shutdown 퀵 종료
QUIT - Graceful shutdown 정상 종료
USR1 - Reopen the log files 로그파일 다시열기

시그날을 사용해서 새로운 설정파일을 로딩시키기

Nginx는 운영중에도 nginx를 컨트롤 하기 위해 사용할 수 있는 몇개의 시그날을 지원합니다.
가장 일반적인 시그날은 15인데, 실행중인 프로세스를 정지시키기위해 사용합니다.

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2213 0.0 0.0 6784 2036 ? Ss 03:01 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf

그런데, 더 재미 있는것은 운행중에 nginx의 설정파일이 변경이 된다는 것입니다.
(우리가 리로드 되는 설정의 우선순위를 테스트했음을 주의하세요.)

2006/09/16 13:07:10 [info] 15686#0: the configuration file /etc/nginx/nginx.conf syntax is ok
2006/09/16 13:07:10 [info] 15686#0: the configuration file /etc/nginx/nginx.conf was tested successfully
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2213 0.0 0.0 6784 2036 ? Ss 03:01 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf

nginx가 HUP 시그날을 받았을 때 무슨일이 일어났는가 하면, nginx는 설정파일의 파싱을 시도하고
(지정한 파일이 있으면 그 파일을 없으면 디폴트) 파싱이 성공하면, 새로운 설정을 적용하려고 합니다.
(즉, 로그파일과 listen상태의 소켓이 재 오픈되요. ). 재설정이 성공하면, nginx는 새로운 워커 프로세스를
실행시키고 이전의 오래된 워커들에게는 정상종료되도록 시그날을 보냅니다. 시그날을 받은 워커는 listen socket들을
닫지만, 현재 클라이언트들에 대한 동작은(to servce current clients) 계속됩니다.
모든 클라이언트에 대한 동작이 완료되면 오래된 워커들은 종료되고ㅡ 만약에 nginx가 새로운 설정의 적용에 실패하면,
이전 설정으로 계속해서 동작하게 됩니다.

운행중에 새로운 바이너리로 업그레이드하기 (Upgrading To a New Binary On The Fly)

만약에 nginx의 바이너리를 새로운 녀석으로 교체하고 싶다면,
(새버전으로의 업그레이드 혹은 서버의 모듈들의 추가/삭제를 할 때)
어떠한 서비스의 다운타임이 없이- 들어오는 요청의 소실 없이 – 도 변경가능합니다.

첫째로, 이전 버전의 바이너리를 새것으로 교체하려면, USR2 시그날을 마스터 프로세스로 보내면 됩니다.
그 시그날은 nginx의 .pid 파일을 .oldbin으로 이름을 변경합니다.
(예를들면 /usr/local/nginx/logs/nginx.pid.oldbin), 그러고 나서 새로운 바이너리를 실행시키고,
마스터 프로세스와 새로운 워커 프로세스들이 차례대로 시작됩니다.

: PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33135 33126 nobody 0.0 1380 kqread nginx: worker process (nginx)
33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)

여기서, 두개의 niginx 인스턴스가 실행되고, 들어오는 리퀘스트를 같이 처리합니다.
오래된 인스턴스를 빼려면, WINCH시그날을 오래된 마스터프로세스에 보내야합니다.
그러면 그 녀석의 워커 프로세스는 정상종료를 시작할것입니다.

: PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33135 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (nginx)
36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)

그리고 얼마후에, 오래된 워커프로세스는 모두 없어지고, 새로운 워커 프로세스들만이 리퀘스트 요청을 처리하게 됩니다.

: PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)

여기서, 이전의 서버로 되돌리는것도 가능한데, 왜냐하면 listen socket들을 닫지 않았기 때문에 아래의 절차를
따라하면 됩니다.

– 오래된 마스터 프로세스에 HUP 시그날을 보낸다. – 설정파일의 리로딩 없이 워커 프로세스를 시작시킨다.
– 새로운 마스터 프로세스에 QUIT 시그날을 보내서 그것의 워커프로세스를 정상적으로 종료시킨다.
– 새로운 마스터 프로세스에 TERM 시그날을 보내서 강제로 종료시킨다.
– 어떠한 이유로 새로운 마스터 프로세스가 종료되지 않으면, KILL 시그날을 보낸다.

새로운 마스터 프로세스가 종료되고, 오래된 마스터프로세스는 .oldbin 접미어를 그것의 .pid파일에서 삭제합니다.
그리고 모든것이 업그레이드 하기 전으로 돌아가게됩니다.

만약에 업그레이드가 성공적으로 되었고 새 서버로 유지하는게 좋으면, QUIT시그날을
오래된 마스터 프로세스로 보내면 새로운 서버만이 돌게됩니다.

: PID PPID USER %CPU VSZ WCHAN COMMAND
: 36264 1 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
: 36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
: 36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
: 36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)

레퍼런스