2012-03-02 3 views
2

나는 nginx가 항상 켜져 있는지 확인하는 것에 다소 혼란 스럽습니다. 내 이해 init.d 스크립트를 시작하고 nginx 중지합니다. 이 올바른지? 그런 다음 문서에서 데몬을 끄지 말고;Nginx와 runit .... 가장 좋은 방법은 무엇입니까

지금, runit을 사용하고자하고 아래에있는 내 runit가 실행되는 스크립트를

#!/bin/sh 
exec /etc/init.d/nginx start 

나는 새로운 PID는 항상 생성되는 것을 알 수 있습니다. 합에 따라서

: 1) 나는 nginx를 파일에이 문이없는 :

daemon = off; 

2) 위의 runit 스크립트를 사용하고 있지만, 항상 새로운 PID를 작성합니다.

그래서 ... nginx가 항상 실행되고 있는지 확인하는 것이 가장 좋습니다.

나는 monit를 사용하고 있지만, hte 데몬을 소유하기 위해 runit을 사용합니다.

테스트로서, killall -9 nginx를 사용하여 nginx를 죽였고 PS aux | grep nginx와 나는 새로운 pid를 알아 차렸다. 그래서 .. 나 아직도 runit이 필요해?

답변

-4

Nginx에는 작업자 프로세스를 관리하는 마스터 프로세스가 있습니다. 그것은 계속 실행됩니다. 포 그라운드에서 nginx를 실행하고 다른 응용 프로그램을 관리하게함으로써 바퀴가 다시 혁신됩니다.

+0

감사합니다 ... 그래서 ... 멋진 ... 내가 수집 아무것도 할 필요 없다. – Tampa

+3

마스터 프로세스가 충돌 할 경우를 대비해 마스터 프로세스가 계속 실행되는 방식을 이해하지 못합니까? – Paolo

+3

전용 감시 프로그램 (runit과 같은)을 사용한다는 전체 아이디어는 바퀴를 다시 발명하지 않는 것입니다. 긍정적 인 메모 적어도 nginx는 reinvention의 도움으로 논스톱 업그레이 드를 제공하므로 필요하다면 좋은 생각 일 수 있습니다. – squiddle

1

/etc/init.d 아래의 스크립트는 유닉스 서비스 관리에 대한 유감스럽고 상당히 불편한 접근 방식 인 sysvinit과 관련이 있습니다. UNIX에서 프로세스는 트리를 참조하십시오. 모든 프로세스는 부모 프로세스를 시작한 프로세스를가집니다. 부모는 자녀에 대해 많은 통제권을 가지며 자녀 과정이 끝날 때 통보됩니다. 부모가된다면 프로세스를 실행하거나 종료하는 것이 사실상 쉽지 않습니다.

그리고 문제가 있습니다. sysvinit 서비스 스크립트가 서비스를 시작한 다음 종료되어 서비스가 계속 실행됩니다. 서비스의 상위 프로세스가 사라져서 서비스 찾기 및 추적이 어려워집니다. sysvinit 스크립트에 서비스를 중지하라는 메시지가 표시되면 서비스를 중지 할 때 신뢰할 수없는 정보를 사용하여 어떤 프로세스를 중지해야하는지 파악해야합니다.

runit 및 daemontools에서 사용되는 올바른 서비스 관리 접근법에 따라 서비스를 시작한 후에 인 프로세스를 감독하여 서비스가 실행됩니다. 서비스는 하위 프로세스이므로 감독자 프로세스는 실행 중인지, 충돌한지, 신호를 보낼 위치를 알고 있습니다.

그래서 runit 스크립트에서 올바른 작업은 init.d 스크립트가 아닌 nginx 자체를 실행하는 것입니다. 이것은하기에 충분합니다. 그러나 기본적으로 nginx는 스스로를 daemonize합니다. 즉, 부모 프로세스에서 의도적으로 "이탈"하여 추적하기가 매우 어려워집니다. 다행히도이 동작은 해제 할 수 있습니다. 이것은 구성 옵션 인 daemon off;의 목적입니다. nginx에 대한 유효한 runit 스크립트는 다음과 같습니다.

#!/bin/sh 
exec /usr/sbin/nginx -g "daemon off;" 

짧고 달콤합니다. runit은이 배열을 매우 잘 관리 할 수 ​​있습니다. nginx를 계속 실행하면 sv으로 제어 할 수 있습니다. 예를 들어 sv hup nginx은 nginx에 구성을 다시로드하도록 지시합니다.물론, PID는 nginx가 충돌하여 다시 시작되거나, 의도적으로 sv restart nginx으로 다시 시작하도록 요청한 경우 변경되지만 runit은 정상적으로 처리합니다.

은 (덧붙여, never ever ever use kill -9, ever.)