web-dev-qa-db-ja.com

どうすればupstartでnginxを起動できますか?

バックグラウンド:

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を使用して実行しようとすると、「不明なジョブ」が表示されます。これは、エラーがあることを意味します(エラーを説明するための「Error」の何が問題になっていますか?)

誰かが私を正しい方向に向けることができますか?私はドキュメントをそのまま読みましたが、SysV initの置き換えではまばらなようです...しかし、このジョブをリストに追加して実行する必要があるものは何でも、私の人生の残りの部分に取り掛かります。 .. 任意のヒント?

編集:initctl version init(upstart 0.6.5)

9
chiggsy

複数のstop on Upstartのアップスタートジョブの説明に含まれるディレクティブ> = 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
3
Jacek Konieczny

私はここに何度も行ったことがあるので、ここの回答を使用した後、自分の経験に基づいて最新の回答を提供したいと思いました。特に@danortonと@orjの回答に感謝します。

このスクリプトは、Nginx 1.0.11およびPassenger 3.0.11を搭載したUbuntu 12.04で実行されているUpstart 1.5でテストされています。 Passengerを使用していない場合は、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のみが機能しているようです。 Passengerを使用すると、nginxは61のフォークを作成します。 Upstartには0、1、または2が必要です。他の人が示唆したように、Upstartは間違ったPIDを追跡します。同じ理由でおそらく何もしないので、respawnも削除しました。いくつかの追加の開始前/後開始スクリプトは、実際のP​​IDを取得することで修正できる場合があります。ただし、私は再起動の処理にmonitを使用しているため、再起動は必要ありません。

daemon offは使用しないでください。これは開発専用です。参照 http://wiki.nginx.org/CoreModule#daemon

参照:

16
PhilT

できません。とにかく、少なくとも正しくはありません。

Nginxは、「expect fork」または「expectデーモン」を介して、upstartが必要とする2つの方法のいずれかでデーモンを生成しないため、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
3
danorton

NGINX Wikipstart設定ファイルの例 があります。

設定ファイルでnginxバイナリへのパスを調整する必要がある場合があります。

この構成ファイルは、Ubuntu 10.04とnginx 1.0.5でうまく動作します。

また、/etc/init.d/lib/init/upstart-jobを指すnginxシンボリックリンクをインストールしたので、標準のserviceコマンドを使用してnginxを開始および停止できます。

注:Phusion PassengerをNGINXと一緒にインストールする場合、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

私はこれが私のUbuntuの設定で必要であるとわかりました。それ以外の場合、initctl stop nginxまたはservice nginx stopを発行したときに、nginxが実際に停止しませんでした。 Upstartがnginxプロセスには実際にはPassengerプロセスの1つのPIDであるPIDがあると考えていることにも気付きました。 NGINX/PassengerがUpstartを少し混乱させているのは明らかです。

2
orj

奇妙なことに、ここでの回答は実際には完全に機能しません。なぜなら、それらはupstartをstop/killed状態のままにし、別の開始が機能しないためです。この意味は 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

このように書くことの利点は、リスポーンでさえ機能することです。欠点は、醜くて厄介なハックであることです。

0
Cliff Stanford
description "nginx"

start on (net-device-up and local-filesystems)
stop on runlevel [016]

expect fork
respawn
exec /usr/sbin/nginx

詳細は http://geeknme.wordpress.com/2009/10/15/getting-started-with-upstart-in-ubunt を参照してください。

0
Rudiger Wolf

私が使う:

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に送信するだけです。デフォルトの動作では、コンソール出力をロガーに送信するだけです。

すべての スタンザ ドキュメントを pstart wiki で確認できます

0
Jim Mitchener