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 DAEMONenv 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.