Nginxが起動しない。そして、復旧。

監視モニター用の画面が起動しないので、ほかのページを確認すると、Nginxが動作していないと推測される状況でした。プロセスを確認するとNginxのプロセスは確かにいない。手動で、 Nginxを再起動しても、復旧しませんでした。

 こんな時は、慌てず原因調査します。nginxのログファイルerror.logには、つぎのとおり出ていました。再起動するたびにこれが出力されます。

[notice] 19828#9876: signal process started
[error] 19828#9876: OpenEvent(“Global\ngx_reload_16096”) failed (2: The system cannot find the file specified)

 logsディレクトリには ファイルnginx.pidが存在していて、このファイルには 16096と書かれていました。 上の” ngx_reload_16096 ”と同じ数字です。これはNginxのPIDです。tasklistでこのPIDが存在しないことを確認しました。また nginx.pid ファイルのタイムスタンプは2日前であり、かなり古い日付です。 この状況から、Nginxの終了処理が完了しないうちにOS再起動されてしまい、nginx.pidファイルが残留してしまったことが原因で、Nginxが起動できなくなってしまったと推測されます。
 ということで、 nginx.pidファイル を削除して、再起動します。

おや、再起動しない。ログメッセージはちょっと変わりました。

[error] 17420#13516: CreateFile() “XXXX/logs/nginx.pid” failed (2: The system cannot find the file specified)

おっといけません、” nginx.pidファイル を削除して ”いたつもりでしたが、 nginx.pid を開いたエディタを別名で保存した状態で開きっぱなしでした。 nginx.pid ファイルは存在しないけど、このエディタプロセスが nginx.pid のファイルディスクリプタをつかんでいる状態になっていました。 
 エディタも閉じて、Nginxを再起動して、無事に復旧しました。

ログメッセージをインターネット上で検索してみると、問題対処のためインストールしなおししている人がいました。復旧させるにはその方法もありますが、原因を特定しないと再発防止策の検討もできませんし、復旧に余計な時間がかかるかもしれません。そんなときはサービス停止の影響を最小化しつつ、慌てず原因調査しましょう。