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

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

編集:initctl version init(upstart 0.6.5)


1
「不明なジョブ」と「エラー」についての1つのコメント。あなたは間違った場所を見ているだけです。Initctlは構成ファイルを読み取らず、Upstartに既知のジョブをロードするように要求するだけです。また、initctlコマンドを発行しても、upstartはこのジョブを認識しません。Upstartがジョブファイルを読み取ろうとしたときに、以前にエラーが発生しました。システムログ(/ var / log / syslog、/ var / log / messages、またはシステムがこれらのログを保存する場所)にエラーメッセージがあるはずです
Jacek Konieczny

ちなみに、/ sbinにはupstartジョブの開始コマンドと停止コマンドがあることがわかります。彼らは私のために働いた。現在、それらはinitctlにリンクしているため、なぜ機能するのかはわかりませんが、機能します。

回答:


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のドキュメントを少なくともWeb上で見つけることは困難です。しかし、マニュアルページはかなり良いです。試してみてください: man 5 init
ヤツェクKonieczny

1
これは、実稼働サーバーでnginxを実行する正しい方法ではありません。daemon offオプションは、開発のためです。
PhilT

16

私はここに何度も行ったことがあるので、ここの回答を使用した後、自分の経験に基づいて更新された回答を提供したいと思いました。特に@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スクリプトを取り出し、微調整を行いました。必要な行がなく、混乱を引き起こしたり、機能しなかったりするためです。

あなたは変更する必要があるかもしれませんenv DAEMONし、env PIDあなたがnginxのインストールされていると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を参照してください

参照:


1
upstartがor ディレクティブを必要とせずに正しいプロセス/ PIDを監視するように使用して実行したいと思うでしょウィキセクションデーモンのオプションを記述も、「あなたはしかし、あなたが行うことができない、値Runit / daemontoolsのとプロダクションモードで安全にオフ優雅なアップグレードをデーモン使用することができます。」と述べ、私が参照していると仮定した上で新しいバイナリにアップグレードフライ機能。daemon off;expect forkpost-stop
ゲイリー

3

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

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

expect daemonupstartがハングアップします(Ubuntu 12.04、Upstart 1.5、Nginx)。expect fork@danortonのヒントとして、Upstartは間違ったPIDを追跡します。私はまた、復活させることができませんでした(私の完全な回答を参照してください)。
PhilT

2

あり成り上がり設定ファイルの例ではnginxのウィキ

設定ファイルでnginxバイナリへのパスを調整する必要があるかもしれません。

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

を指すようにnginxシンボリックリンクもインストール/etc/init.dした/lib/init/upstart-jobので、標準の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

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


乗客のためのそのスクリプトをありがとう。これでプロセスが停止したように見えましたが、stop: Job failed while stopping途中で停止しました。見ましたか?
PhilT

@PhilTと同じ問題があります。
Claudio Poli

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 wikiですべてのスタンザドキュメントを見ることができます


残念ながら、そのwikiはバージョン0.5のみであることを示唆しているようです。そのような重要な変更がそのように文書化されていることは、私には非常に奇妙です。
chiggsy

バージョン0.5とは何ですか?
ジムミッチェナー、

一般的なウィキ。マニュアルページは問題ありませんが、「詳細」ページではありません。通常、これはより詳細です。
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はほとんど死んだ製品です。Ubuntuはそれを使用した最後のディストリビューションに非常に近いです。他のすべてが切り替えているか、すでに切り替えています。
マイケルハンプトン

Ubuntuでさえ、新しいバージョンではsystemdに切り替わりました。しかし、一部のシステム管理者は、LTSのために14.04のままです。
Ivan Anishchuk 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.