nginx 제어
nginx는 신호로 제어할 수 있습니다. 마스터 프로세스의 프로세스 ID는 기본적으로 /usr/local/nginx/logs/nginx.pid 파일에 작성됩니다. 이 이름은 구성 시점에 변경하거나, nginx.conf에서 pid 명령을 사용하여 변경할 수 있습니다. 마스터 프로세스는 다음의 신호를 지원합니다.
TERM, INT | 빠른 종료 |
QUIT | 점진적 종료 |
HUP | 구성 변경, 변경된 시간대 동기화(FreeBSD 및 Linux 전용), 새로운 구성으로 새로운 작업자 프로세스 시작, 기존 작업자 프로세스를 점진적 종료 |
USR1 | 로그 파일 다시 열기 |
USR2 | 실행 파일 업그레이드 |
WINCH | 작업자 프로세스를 서서히 종료 |
각 작업자 프로세스는 신호로도 제어할 수 있지만 필수는 아닙니다. 지원되는 신호:
TERM, INT | 빠른 종료 |
QUIT | 점진적 종료 |
USR1 | 로그 파일 다시 열기 |
WINCH | 디버깅에 대한 비정상적 종료(debug_points 활성화 필요) |
구성 변경
nginx가 구성 파일을 다시 읽으려면 HUP 신호를 마스터 프로세스로 보내야 합니다. 마스터 프로세스는 먼저 구문 유효성을 검사한 다음, 새 구성을 적용하여 로그 파일과 새 리스닝 소켓을 열려고 시도합니다. 이 시도가 실패하면 변경 사항을 롤백하고 기존 구성을 계속 사용합니다. 성공할 경우, 새로운 작업자 프로세스를 시작하고 기존 작업자 프로세스에 점진적 종료를 요청하는 메시지를 전송합니다. 기존 작업자 프로세스는 리스닝 소켓을 닫고 기존 클라이언트를 계속 서비스합니다. 모든 클라이언트가 서비스되고 나면 기존 작업자 프로세스를 종료합니다.
그러면 예시를 통해 살펴보겠습니다. nginx가 FreeBSD에서 실행되고 이 명령을 실행하면
ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'
다음과 같은 결과가 나옵니다.
PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
33127 33126 nobody 0.0 1380 kqread nginx: worker process (nginx)
33128 33126 nobody 0.0 1364 kqread nginx: worker process (nginx)
33129 33126 nobody 0.0 1364 kqread nginx: worker process (nginx)
HUP를 마스터 프로세스로 전송하면 다음과 같은 결과가 나옵니다.
PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33129 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (nginx)
33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33135 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
PID 33129가 포함된 기존 작업자 프로세스 중 하나가 계속 작동 중입니다. 어느 정도 시간이 지나면 작업자 프로세스가 종료됩니다.
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 1368 kqread nginx: worker process (nginx)
33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
로그 파일 순환
로그 파일을 순환시키려면 먼저 이름을 새로 지정해야 합니다. 그 이후에 USR1 신호를 마스터 프로세스로 보내야 합니다. 마스터 프로세스가 현재 열려 있는 모든 로그 파일을 다시 열고, 작업자 프로세스를 실행 중인 권한이 없는 사용자를 소유자로 할당합니다. 열려 있는 파일이 모두 다시 열리면, 마스터 프로세스가 모든 열린 파일을 닫고 작업자 프로세스에 파일을 다시 열라는 메시지를 보냅니다. 작업자 프로세스도 새 파일을 열고 기존 파일을 바로 닫습니다. 따라서 기존 파일을 후속 처리(예: 압축)에 즉시 사용할 수 있습니다.
즉시 실행 파일 업그레이드
서버 실행 파일을 업그레이드하려면 먼저 기존 파일 대신 새로운 파일을 넣어야 합니다. 그 이후에 USR2 신호를 마스터 프로세스로 보내야 합니다. 마스터 프로세스는 .oldbin 접미사를 붙여서 새로운 파일의 프로세스 ID로 파일 이름을 변경합니다(예: /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)
그러면 모든 작업자 프로세스(기존 작업자 프로세스와 새로운 작업자 프로세서)가 계속 요청을 수신합니다. 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)
다만, 기존 마스터 프로세스는 리스닝 소켓을 종료하지 않으므로 필요하다면 작업자 프로세스를 다시 시작할 수 있습니다. 어떤 이유로든 새 실행 파일이 잘못된 동작을 보일 경우, 다음 중 한 가지 방법으로 조치를 할 수 있습니다.
- HUP 신호를 기존 마스터 프로세스에 보냅니다. 기존 마스터 프로세스가 구성을 다시 읽지 않고 새 작업자 프로세스를 시작합니다. 그 이후에는 QUIT 신호를 새 마스터 프로세스로 보내서 모든 새로운 프로세스를 서서히 종료할 수 있습니다.
- TERM 신호를 새 마스터 프로세스로 보냅니다. 작업자 프로세스로 메시지를 보내서 즉시 종료하도록 요청하면, 작업자 프로세스가 거의 즉시 종료됩니다. (어떤 이유로든 새 프로세스가 종료되지 않으면 KILL 신호를 보내서 강제 종료해야 합니다.) 새 마스터 프로세스가 종료되면 기존 마스터 프로세스가 자동으로 새 작업자 프로세스를 시작합니다.
새 마스터 프로세스가 종료되면 기존 마스터 프로세스가 프로세스 ID를 포함한 파일 이름에서 .oldbin 접미사를 제거합니다.
업그레이드가 성공하면 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)