エラーメッセージ
Nginx を起動または再起動しようとした際、正常に終了せず、ターミナルに大量のテキストが表示されることがあります。通常、以下のような内容です。
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
原因について
Linux のネットワーク制御は厳格です。一度に特定のポートを使用できるアプリケーションは1つだけです。ポート80は HTTP トラフィックの標準的な経路です。Nginx がその経路を開こうとしたときに、すでに他のプロセスが使用している場合、起動を断念します。
通常、原因(占有者)は以下のいずれかです。
- クラッシュ後に正常に終了しなかった、ゴースト化した Nginx プロセス。
- バックグラウンドで実行中の Apache (httpd)(新規 VPS インストール時によく見られます)。
- ホストのポート80をコンテナにマッピングしている Docker コンテナや Node.js アプリ。
- 設定ファイル内での
listen 80;ディレクティブの重複。
ステップ1:原因の特定
現在ポートを占有しているプロセス ID (PID) を見つける必要があります。最近の Linux システムでは、ss コマンドを使用するのが最も早い方法です。
ss を使用する場合(推奨)
sudo ss -tulpn | grep :80
以下のような出力が表示されます。
tcp LISTEN 0 511 *:80 *:* users:(("apache2",pid=1234,fd=4))
lsof を使用する場合
lsof を使用したい場合は、以下のコマンドを実行します。
sudo lsof -i :80
COMMAND 列と PID 列を確認することで、原因を特定できます。例えば、PID 1234 の apache2 が表示されていれば、それがボトルネックです。
ステップ2:競合プロセスの停止
名前または PID が判明したら、Nginx のためにパスを解放する必要があります。
Apache またはその他のサービスを停止する
Apache がポートを占有している場合は、停止した上で、再起動後に自動実行されないよう無効化します。
# Ubuntu/Debian の場合
sudo systemctl stop apache2
sudo systemctl disable apache2
# CentOS/RHEL の場合
sudo systemctl stop httpd
sudo systemctl disable httpd
孤立した Nginx プロセスの強制終了
Nginx がハングアップし、「ゾンビ」プロセスが残ることがあります。以下のコマンド1つで、すべての Nginx 関連タスクを強制終了できます。
sudo killall -9 nginx
注意:このコマンドは状態を保存せずにすべての Nginx プロセスを即座に終了させます。
ステップ3:設定の監査
他のソフトウェアがポート80を使用していない場合、Nginx の設定自体が競合している可能性があります。これは多くの場合、/etc/nginx/sites-enabled/ 内の2つの異なるサイト設定ファイルが、どちらも default_server を指定しようとしたときに発生します。
まず、構文エラーがないか確認します。
sudo nginx -t
設定ディレクトリ内で、ポート80の宣言が重複していないか検索します。以下のコマンドを実行して、そのポートを使用しようとしているすべてのファイルを確認します。
grep -r "listen 80" /etc/nginx/sites-enabled/
同じ IP とポートの組み合わせにバインドしようとしているブロックが複数存在しないことを確認してください。
ステップ4:Nginx の起動
ポートが解放されれば、Nginx は問題なく起動するはずです。
sudo systemctl start nginx
確認
ステータスを再確認して、起動状態を維持しているか確かめます。緑色のテキストで active (running) と表示されるはずです。
sudo systemctl status nginx
また、現在 Nginx がポートを所有していることを確認できます。
sudo ss -tulpn | grep :80
今後のためのヒント
- Apache のアンインストール: 不要な場合は、
sudo apt purge apache2を実行することで、自動起動を完全に防ぐことができます。 - Docker の確認: Docker を使用している場合は、
docker psを確認してください。-p 80:8080のようにマッピングされたコンテナは、ホストの Nginx をブロックします。 - テストの自動化: Nginx を再起動する前に、必ず
nginx -tを実行してください。これにより、単純なタイポによるダウンタイムを防ぐことができます。

