upstart를 통해 nginx를 시작하려면 어떻게해야합니까?


9

배경:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04 LTS"

nginx를 만들었고 upstart를 사용하여 시작하고 싶습니다.

사이트에서 nginx upstart 스크립트 :

description "nginx http daemon"

start on runlevel 2

stop on runlevel 0
stop on runlevel 1
stop on runlevel 6

console owner

exec /usr/sbin/nginx -c /etc/nginx/nginx.conf  -g "daemon off;"

respawn

initctl을 사용하여 실행하려고하면 "알 수없는 작업"이 나타납니다. 이것은 분명히 오류가 있음을 의미합니다 (오류를 설명하는 "오류"의 문제점은 무엇입니까?)

누군가 올바른 방향으로 나를 가리킬 수 있습니까? 나는 문서를 그대로 읽었으며 SysV init 대체를 위해 드문 것 같습니다 ...하지만이 작업을 목록에 추가하고 실행하고 남은 인생을 계속해야합니다. .. 팁이 있습니까?

편집 : initctl 버전 init (시작 0.6.5)


1
'알 수없는 직업'과 '오류'에 대한 한 가지 의견. 당신은 잘못된 곳을 찾고 있습니다. Initctl은 구성 파일을 읽지 않고 Upstart에게 알려진 작업을로드하도록 요청하며 initctl 명령을 실행할 때 upstart는이 작업을 알지 못합니다. Upstart가 작업 파일을 읽으려고 할 때 이전에 오류가 발생했습니다. 시스템 로그에 오류 메시지 (/ var / log / syslog, / var / log / messages 또는 시스템이이 로그를 저장하는 모든 위치)가 있어야합니다.
— Jacek Konieczny

그건 그렇고, / sbin에는 upstart 작업에 대한 시작 및 중지 명령이 있음이 밝혀졌습니다. 그들은 나를 위해 일했다. 이제 그들은 initctl과 다시 연결되므로 왜 작동하는지 잘 모르겠습니다.
— chiggsy

답변:


3

stop onUpstart> = 0.5에 대한 시작 작업 설명에 여러 지시문을 가질 수 없습니다 .

그리고 console owner아마도 당신이 원하는 것이 아닐 것입니다 (이는 nginx를 시스템 콘솔의 소유자로 만듭니다).

시험:

description "nginx http daemon"
start on runlevel 2
stop on runlevel [016]
console output
exec /usr/sbin/nginx -c /etc/nginx/nginx.conf  -g "daemon off;"
respawn

아직 알려지지 않은 직업입니다. 이 정보는 어디서 구할 수 있습니까? 남자? 정보? 온라인? 0.6.5는 어디에 기록되어 있습니까?
— chiggsy

좀 일했다. thnx
— chiggsy

예, 적어도 웹에서 최신 Upstart 설명서를 찾기가 어렵습니다. 그러나 매뉴얼 페이지는 꽤 좋습니다. 시도 : man 5 init
— Jacek Konieczny

1
이것은 프로덕션 서버에서 nginx를 실행하는 올바른 방법이 아닙니다. daemon off옵션은 개발을위한 것입니다.
— PhilT

16

나는 여기에 두 번 이상 끝났으므로 여기에 답변을 사용한 후 내 경험에 따라 업데이트 된 답변을 제공 할 것이라고 생각했습니다. 그들의 답변에 대해 @danorton과 @orj에게 특히 감사합니다.

이 스크립트는 Nginx 1.0.11 및 Passenger 3.0.11과 함께 Ubuntu 12.04에서 실행되는 Upstart 1.5에서 테스트되었습니다. 승객을 사용하지 않는 경우 post-stop회선 을 가지고 놀아야 할 수도 있습니다 . Upstart 요리 책을 참조하십시오.

빈 /etc/init/nginx.conf칸에 다음 줄을 추가하십시오 (원하는 경우 주석을 제거 할 수 있음).

description "nginx http daemon"

start on (filesystem and net-device-up IFACE=lo)
stop on runlevel [!2345]

env DAEMON=/usr/local/nginx/sbin/nginx
env PIDFILE=/var/run/nginx.pid

# Needed to allow Nginx to start, however, the wrong PID will be tracked
expect fork

# Test the nginx configuration (Upstart will not proceed if this fails)
pre-start exec $DAEMON -t

# Ensure nginx is shutdown gracefully
# Upstart will be tracking the wrong PID so the following is needed to stop nginx
post-stop exec start-stop-daemon --stop --pidfile $PIDFILE --name nginx --exec $DAEMON --signal QUIT

# Start Nginx
exec $DAEMON

Nginx Wiki에서 Upstart 스크립트를 가져 와서 여러 줄이 필요하지 않거나 혼란을 일으키거나 작동하지 않기 때문에 조정했습니다.

nginx를 설치하고 PID를 작성하는 위치에 따라 env DAEMON및 env PID행 을 변경해야 할 수도 있습니다 . PID는 nginx에서 구성 할 수 있습니다.

나는 모든 형태의 시도했다 expect. 만 expect fork작동하는 것 같다. 승객 nginx와 함께 61 포크를 만듭니다. Upstart에는 0, 1 또는 2가 필요합니다. 다른 사람들이 암시했듯이 Upstart는 잘못된 PID를 추적합니다. 나는 또한 respawn같은 이유로 아마도 아무것도하지 않기 때문에 제거 했습니다. 일부 추가 사전 / 사후 시작 스크립트는 실제 PID를 잡아서이를 수정할 수 있습니다. 그러나 monit을 사용하여 재시작을 처리하므로 필요하지 않습니다.

사용하지 마십시오 daemon off. 이것은 개발 전용입니다. http://wiki.nginx.org/CoreModule#daemon을 참조 하십시오

참고 문헌 :


1
난 당신이 생각 할 것이다 사용하여 실행하려는 daemon off;신출내기가 필요없이 올바른 프로세스 / PID 시계 너무 expect fork또는 post-stop지시. 위키 섹션 데몬 옵션을 설명은 "당신은 그러나 당신이 할 수없는, runit / 데몬 툴즈와 생산 모드에서 안전하게 떨어져 우아한 업그레이드를 데몬 사용할 수 있습니다."미국, 내가 언급된다고 가정하는 온 새로운 바이너리로 업그레이드 비행 기능.
— Gary

3

당신은 할 수 없습니다. 어쨌든 적어도 제대로되지 않았습니다.

Nginx는 "expect fork"또는 "expect daemon"을 통해 upstart에 필요한 두 가지 방법 중 하나로 데몬을 생성하지 않으므로 upstart가 마스터 nginx 프로세스를 추적 할 수 없습니다. 해킹이 있지만 자체 문제가 있습니다.

upstart가 마스터 프로세스를 추적 할 수없고 종료시 종료 할 수 있다는 사실이 괜찮다면 다음과 같이 작동합니다.

start on local-filesystems \
  and (net-device-added INTERFACE=lo) \
  and (runlevel [12345])
stop on runlevel [06]

env DAEMON=/usr/sbin/nginx

respawn
respawn limit 10 5

expect daemon

pre-start script
  $DAEMON -t
end script

$DAEMON

expect daemonupstart가 나를 멈추게합니다 (Ubuntu 12.04, Upstart 1.5, Nginx). expect fork@danorton 힌트로 작동했지만 Upstart는 잘못된 PID를 추적합니다. 나는 또한 일하기 위해 리스폰을 얻지 못했습니다 (전체 답변보기).
— PhilT

2

NGINX Wiki 에는 Upstart 설정 파일 예제 가 있습니다.

구성 파일에서 nginx 바이너리의 경로를 조정해야 할 수도 있습니다.

이 구성 파일은 Ubuntu 10.04 및 nginx 1.0.5에서 제대로 작동합니다.

나는 또한 설치 nginx에 심볼릭 링크를 /etc/init.d가리키는 /lib/init/upstart-jobI는 표준 사용할 수 있도록 service시작 및 정지 명령을 nginx.

참고 : NGINX와 함께 Phusion Passenger을 설치하는 경우 Upstart 구성 스크립트에 다음 스탠자를 추가해야합니다.

env PID=/opt/nginx/logs/nginx.pid
post-stop script
    start-stop-daemon --stop --pidfile $PID --name nginx --exec $DAEMON --signal TERM
end script

우분투 설정에서 이것이 필요하다는 것을 알았습니다. 그렇지 않으면 내가 발행했을 때 initctl stop nginx또는 service nginx stopnginx가 실제로 멈추지 않았습니다. 또한 Upstart는 nginx 프로세스에 실제로는 승객 프로세스 중 하나의 PID 인 PID가 있다고 생각했습니다. NGINX / Passenger는 Upstart를 약간 혼란스럽게합니다.


승객을위한 스크립트 감사합니다. 이것은 프로세스를 멈추는 것처럼 보였지만 stop: Job failed while stopping그렇게하는 동안 얻었습니다 . 이거 봤어?
— PhilT

@PhilT와 같은 문제가 있습니다.
— 클라우디오 폴리

0

나는 사용한다:

description "Nginx HTTP Server"

start on filesystem
stop on runlevel [!2345]

respawn

exec /opt/nginx/sbin/nginx -g "daemon off;"

중지 runlevel [!...]가 더 표준적인 것 같습니다. 그것은 주식 ssh / samba 스크립트가하는 일입니다. 또한 respawn죽으면 다시 시작되도록 비트를 추가해야합니다 . 또한 왜 console output콘솔 출력을 stdout으로 보내는 지 확실하지 않습니다 . 기본 동작은 단순히 콘솔 출력을 로거에 전송하는 것입니다.

Upstart 위키 에서 모든 스탠자 문서를 볼 수 있습니다


불행히도, 그 위키는 그것이 0.5 버전이라는 것을 암시하는 것 같습니다. 그러한 중요한 변화가 그러한 방식으로 문서화되어 있다는 것은 매우 이상합니다.
— chiggsy

버전 0.5 만 무엇입니까?
— Jim Mitchener

일반적으로 위키입니다. 매뉴얼 페이지는 괜찮지 만 '정보'페이지가 아니며 일반적으로 훨씬 자세한 내용입니다.
— chiggsy


0

이상하게도 여기서 다른 답변이 작동하지 못하게하는 중지 / 종료 상태로 시동을 시작해도 실제로는 완전히 작동하지 않습니다. 이것은 restart nginx실패 한다는 것을 의미 합니다.

upstart의 버그는 https://bugs.launchpad.net/upstart/+bug/406397에 잘 설명되어 있으며 upstart 의 작성자가 문제를 해결하기에 충분히 신경 쓰지 않는 것으로 보입니다. 내가 본 유일한 해결책은 다음과 같습니다 (동일한 버그 보고서에서 도난당한).

# nginx - Nginx Web Server
#

description "Nginx Web Server"

start on (local-filesystems and
    (net-device-up IFACE=eth1 or net-device-up IFACE=eth0) )
stop on runlevel [!2345]

env DAEMON=/usr/local/sbin/nginx
env PID=/var/run/nginx.pid

respawn

pre-start script
$DAEMON -s stop 2> /dev/null || true
$DAEMON -t > /dev/null
$DAEMON
end script

script
sleepWhileAppIsUp(){
    while pidof $1 >/dev/null; do
    sleep 1
    done
}
sleepWhileAppIsUp $DAEMON
end script

post-stop script
if pidof > /dev/null $DAEMON;
then
    $DAEMON -s stop
fi
end script

이와 같이 작성하면 장점도 부활합니다. 단점은 그것이 추악하고 불쾌한 해킹이라는 것입니다.


Upstart는 거의 죽은 제품입니다. 우분투는 그것을 사용하는 마지막 배포판입니다. 다른 모든 사람들이 전환하거나 이미 전환했습니다.
— Michael Hampton

우분투 자체조차도 최신 버전으로 시스템화되었습니다. 그러나 일부 시스템 관리자는 LTS 때문에 14.04로 계속 붙어 있습니다.
— Ivan Anishchuk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.