Ubuntuで構成テストが成功した後でのみnginxを再起動するにはどうすればよいですか?


111

Ubuntuサーバーのコマンドラインでnginxサービスを再起動すると、nginx構成ファイルにエラーがあると、サービスがクラッシュします。マルチサイトサーバーでは、構成エラーのないサイトも含め、すべてのサイトがダウンします。

これを防ぐために、最初にnginx構成テストを実行します。

nginx -t

テストが成功した後、サービスを再起動できます。

/etc/init.d/nginx restart

または、再起動せずにnignxサイト構成のみをリロードします。

nginx -s reload

再起動コマンドが構成テストの結果を条件とする場合に、これら2つのコマンドを組み合わせる方法はありますか?

私はこれをオンラインで見つけることができませんでした、そしてこれに関する公式文書はかなり基本的です。Linuxの使い方がよくわからないので、探しているものが目の前にあるのか、それともまったくできないのかわかりません。

nginx v1.1.19を使用しています。


nginx -t($を使用)の戻りステータスをチェックし、戻り状態に応じて再起動する小さなシェルスクリプトはどうですか?
TeTeT 2013

回答:


49

実際、私が知る限り、nginxは空のメッセージを表示し、構成が悪い場合は実際には再起動しません。

それを台無しにする唯一の方法は、nginxを停止してから再開することです。停止は成功しますが、開始は失敗します。


1
どのバージョンのnginxについて話しているのですか?私はv 1.1.19で作業しており、設定ファイルのエラーに関係なく再起動を試みます。問題があることを通知しますが、それまでにはもう手遅れです
jan

5
OK、テストしたところ、私のラップトップにはnginx 1.2があり、それは私が説明したように機能しました。私のVPSはあなたのような1.1.19であり、質問で説明したのと同じでした。したがって、これは1.2で処理されたと思います
Mohammad AbuShady 2013

すごい!それを理解してくれてありがとう。質問をもう少し長く開いて、nginx <v1.2
jan

1
私はそれからアップグレードする必要があると思います:-)とにかく言い訳が必要
jan

1
service nginx reload設定が正しく読み込まれたかどうかにかかわらず、何も表示されないため、設定が誤っていると思われる場合は役に立ちません。service nginx restart設定にエラーがある場合、サーバーを停止します!
Dan Dascalescu、2015年

80

nginx 1.8.0以降、正しい解決策は

sudo nginx -t && sudo service nginx reload

バグのため、設定ファイルにエラーがある場合でも、configtest常にゼロの終了コードが返されることに注意してください。


3
nginx -t && sudo nginx -s reload
MechanisM

5
@MechanisM:nginx -tsudoなしでは、ほぼ間違いなく権限エラーのために失敗します。
Dan Dascalescu、2016年

リロードの最後の部分をほとんど見せたかった。私の場合、カスタムコンパイルされたnginxがあり、/ etc / init.dなどにスクリプトもないので、私の場合、「service nginx reload」は何もしません
MechanisM

39

構成テストが成功した場合のみ、次のコマンドを使用してNginx(バージョン1.5.9)をリロードします。

/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload

これを頻繁に行う必要がある場合は、エイリアスを使用できます。私は以下を使用します:

alias n='/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload'

ここでのトリックは、最初のコマンドが成功した場合にのみ2番目のコマンドを実行する「&&」によって行われます。ここでは、 "&&"演算子の使用法の詳細な説明をご覧いただけます

本当にサーバーを再起動したい場合は、「reload」の代わりに「restart」を使用できます。


nginx 1.4.2に注意してくださいpkill -1 nginx。構成が失敗し、誤解を招くように成功した場合、事実上、私のinit.d / nginxのリロードが行うことをリロードしません。自分のバージョンを確認してください。
KCD、2014

2
これは私にはうまくいきません。テストが失敗した場合でも、両方のコマンドが実行されます。
マリオカンパ2014年

2
configtestは、少なくともnginx 1.8.0 では常にゼロの終了コードを返しますnginx -t代わりに使用してください。
Dan Dascalescu、2015年

8
alias nginx.start='sudo nginx -c /etc/nginx/nginx.conf'
alias nginx.stop='sudo nginx -s stop'
alias nginx.reload='sudo nginx -s reload'
alias nginx.config='sudo nginx -t'
alias nginx.restart='nginx.config && nginx.stop && nginx.start'
alias nginx.errors='tail -250f /var/logs/nginx.error.log'
alias nginx.access='tail -250f /var/logs/nginx.access.log'
alias nginx.logs.default.access='tail -250f /var/logs/nginx.default.access.log'
alias nginx.logs.default-ssl.access='tail -250f /var/logs/nginx.default.ssl.log'

そして、 "nginx.reload"などのコマンドを使用します。


6

/etc/init.d/nginx reloadとを使用してリロードできますsudo service nginx reload

nginx -tエラーが発生した場合は再読み込みされません

&&を使用して両方を同時に実行する

お気に入り

nginx -t && /etc/init.d/nginx reload


bashについて教えてあげましょう。&&しないrun both at a same time左側のコマンドが終了コード0を返した場合、右側のnginx -tコマンドが実行されます。エラーがスローされた場合、終了コードは0ではないため、2番目のコマンドは実行されません。そのnginx -s reloadいずれにせよ
miknik

@miknikそれは彼が言うつもりだったと思う、それはちょうど正しく出てこなかった。彼は言うIf nginx -t throws some error then it won't reload。ステートメントrun both at a same timeは、単一のコマンドまたは1行として解釈することもできます。私は彼がこの場合必ずしも言っているとは解釈しませんin parallel
マット

2

信号を使用してnginxを制御できます。

ドキュメントによると、nginxマスタープロセスにHUP信号を送信する必要があります。

HUP-構成の変更、変更されたタイムゾーンへの対応(FreeBSDおよびLinuxのみ)、新しい構成での新しいワーカープロセスの開始、古いワーカープロセスの正常なシャットダウン

こちらのドキュメントを確認してください:http : //nginx.org/en/docs/control.html

次のように、HUP信号をnginxマスタープロセスPIDに送信できます。

kill -HUP $( cat /var/run/nginx.pid )

上記のコマンドは、nginx PIDをから読み取ります/var/run/nginx.pid。デフォルトではnginx pidが書き込まれます/usr/local/nginx/logs/nginx.pidが、configで上書きできます。nginx.configPIDを保存する場所を確認してください。


1

少なくともDebianでは、nginx起動スクリプトに次のことを行うリロード機能があります。

reload)
  log_daemon_msg "Reloading $DESC configuration" "$NAME"
  test_nginx_config
  start-stop-daemon --stop --signal HUP --quiet --pidfile $PID \
   --oknodo --exec $DAEMON
  log_end_msg $?
  ;;

あなたがする必要があるのは、を呼び出すのではservice nginx reloadなく、を呼び出すrestartことだけのようtest_nginx_configです。


service nginx reload構成が正常にテストされたかどうか、または再ロードされたかどうかについては、何の表示も行いません。
Dan Dascalescu、2015年

test_nginx_configその場合、何をしますか?
Daenney、2015

1
どちらもポイントがあると思います。service nginx reloadコマンドラインでは十分ですが、stderr出力をキャプチャして、トラブルシューティングのためにスクリプトに戻すことが必要な場合があります。nginx -tどのファイルに無効なパラメータがあり、どの行にあるかがわかります。
アナスティム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.