NginxのリロードまたはサービStoptime時の「invalid PID number」エラーを修正する

intermediate Nginx2026-05-16| Ubuntu 20.04/22.04、Debian 11/12、CentOS 7/8、Nginx 1.18+、systemd

Error Message

nginx: [error] invalid PID number "" in "/run/nginx.pid"
#nginx#pid#reload#systemd#service

エラーの内容

nginx -s reload または systemctl reload nginx を実行すると、次のエラーが表示されます:

nginx: [error] invalid PID number "" in "/run/nginx.pid"

または、次のようなエラーになる場合もあります:

nginx: [error] invalid PID number "" in "/var/run/nginx.pid"

サービスがまだ動いている場合も、完全に停止している場合もあります。いずれにせよ、リロードや停止コマンドが機能しない状態です。

何が起きているのか

NginxはマスタープロセスのPIDをファイル(通常は /run/nginx.pid)に記録しています。リロードや停止シグナルを送ると、Nginxはそのファイルからどのプロセスにシグナルを送るかを読み取ります。このエラーは、次の3つのいずれかを意味します:

  • PIDファイルは存在しているが、空(ゼロバイト)になっている
  • PIDファイルに数値ではなく無効な内容が書き込まれている
  • PIDファイルが完全に存在しないが、Nginxが参照しようとしている

主な原因は4つです:異常終了、起動失敗、システム再起動(tmpfsの /run ディレクトリが消去される)、または起動時のレースコンディションです。

ステップ1:実際の動作状況を確認する

何かを変更する前に、Nginxが動いているかどうかを確認します:

ps aux | grep nginx | grep -v grep

次の対処法は、確認結果によって異なります。

シナリオA:Nginxが動いている場合

マスタープロセスとワーカープロセスが表示されている場合、Nginx自体は正常です。PIDファイルが壊れたか消去されただけです。実際のPIDを取得してファイルを再作成します:

# マスタープロセスのPIDを取得
ps aux | grep 'nginx: master' | grep -v grep | awk '{print $2}'

# PIDファイルに書き込む
sudo sh -c 'echo $(ps aux | grep "nginx: master" | grep -v grep | awk "{print \$2}") > /run/nginx.pid'

# ファイルの内容を確認
cat /run/nginx.pid

その後、リロードを再試行します:

sudo nginx -s reload

シナリオB:Nginxが動いていない場合

PIDファイルは残骸です。削除してから起動し直します:

# 古いPIDファイルを削除
sudo rm -f /run/nginx.pid

# Nginxを起動
sudo systemctl start nginx

ステップ2:確実な修正方法 — systemctlを使う

systemdベースのディストリビューション(Ubuntu 16+、Debian 8+、CentOS 7+)を使用している場合、管理されたサービスに対して直接 nginx -s reload を呼び出す習慣はやめましょう。systemdに任せてください:

# 設定をリロード(グレースフル、ゼロダウンタイム)
sudo systemctl reload nginx

# リロードがうまくいかない場合は再起動
sudo systemctl restart nginx

生のシグナル方式と異なり、systemctlは実際のプロセス状態を追跡するため、PIDファイルの正確さにのみ依存しません。

ステップ3:根本原因の修正 — 再起動時にPIDファイルが消える問題

UbuntuやDebianでは、/run はtmpfsです。再起動のたびに消去されます。Nginxが起動途中で失敗した場合(設定エラーやポートの競合など)、PIDファイルを書き込んだ後に終了し、空のファイルだけが残ってプロセスが動いていない状態になることがあります。

起動ログを確認します:

sudo journalctl -u nginx --since "30 minutes ago" --no-pager

設定エラーやポートの競合(ポート80がすでに使用されているなど)がここに表示されます。それらを先に修正してから、設定を検証します:

sudo nginx -t

設定テストが通過すると、次のように表示されます:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

これが通過するまで次の手順に進まないでください。

ステップ4:PIDファイルのパスが設定と一致しているか確認する

NginxはPIDファイルの場所を設定で宣言しています。そのパスとsystemdが期待するパスが一致しないと、このエラーが繰り返し発生します。設定の内容を確認します:

grep -i pid /etc/nginx/nginx.conf

一般的な出力:

pid /run/nginx.pid;

そのパスが存在し、書き込み可能かどうかを確認します:

# /run 以下のnginx関連ファイルを一覧表示
ls -la /run/ | grep nginx

# PIDファイルが存在する場合、12345のような数値が含まれているはず
cat /run/nginx.pid

設定によっては /run/nginx.pid の代わりに /var/run/nginx.pid を参照している場合があります。最近のシステムでは通常これらは同じシンボリックリンクですが、確認しておきましょう:

ls -la /var/run | grep nginx
# 通常は次のように表示される: /var/run -> /run

ステップ5:繰り返し発生する場合 — systemdユニットを修正する

古いディストリビューションのパッケージでは、Nginxのsystemdユニットに PIDFile ディレクティブが正しく設定されていないことがあります。アクティブなユニットファイルを確認します:

sudo systemctl cat nginx

次の行を確認します:

PIDFile=/run/nginx.pid
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'

PIDFilenginx.conf の設定と一致しない場合は、不一致を修正します。最も確実な方法はsystemdのオーバーライドを使うことで、パッケージ更新後も設定が保持されます:

sudo systemctl edit nginx

正しいパスを追加します:

[Service]
PIDFile=/run/nginx.pid

その後、systemdをリロードして再起動します:

sudo systemctl daemon-reload
sudo systemctl restart nginx

修正の確認

# PIDファイルに有効な数値が含まれているか確認
cat /run/nginx.pid
# 期待値: 1234 のような数値

# サービスがアクティブか確認
sudo systemctl status nginx
# 確認ポイント: Active: active (running)

# リロードが正常に動作するか確認
sudo systemctl reload nginx
# 出力なし = 成功

# ワーカーが起動しているか確認
ps aux | grep nginx | grep -v grep

クイックリファレンス:状況別の対処法

  • PIDファイルが空で、Nginxが動いている: 実際のマスターPIDでPIDファイルを再作成してからリロード
  • PIDファイルが空で、Nginxが動いていない: PIDファイルを削除し、nginx -t を実行してから起動
  • 再起動のたびに発生する: journalctl で起動エラーを確認 — 起動時に何かが失敗している
  • 設定パスの不一致: nginx.conf のPIDパスをsystemdユニットの PIDFile ディレクティブに合わせる

非rootユーザーまたはDockerで動かしている場合

Nginxプロセスが /run/nginx.pid への書き込み権限を持っていない可能性があります。プロセスが実際に書き込めるパスにPIDファイルを移動します:

pid /tmp/nginx.pid;

新しいパスに合わせて、systemdまたはinitスクリプトも更新してください。この変更にはリロードではなく、完全な再起動が必要です。Nginxは新しいPIDパスへの書き込みを、クリーンな再起動後からのみ開始します。

Related Error Notes