Nginxの「bind() to 0.0.0.0:80 failed (98: Address already in use)」エラーの修正方法

beginner Nginx2026-03-21| Linux (Ubuntu, Debian, CentOS), Nginx 1.18+

Error Message

bind() to 0.0.0.0:80 failed (98: Address already in use)
#nginx#ポート#bind

何が起きているか

Nginxが起動を拒否し、エラーログ(またはsystemctl status nginx)に次のようなメッセージが表示されます:

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()

ポート80はすでに使用中です。一度に1つのプロセスしかポートを保持できないため、Nginxは即座に起動を諦めます。

よくある原因:

  • 以前のNginxプロセスがクラッシュしたか、正常にシャットダウンしなかった — まだポートを保持している。
  • Apache、Caddy、または別のWebサーバーが先にポート80を取得している。
  • Node.js、Python、または他のアプリがポート80で直接起動されている。
  • 死んだプロセスを指す古い/run/nginx.pidファイルにより、systemdが2つ目のNginxインスタンスを起動してしまった。

ステップ1 — ポート80を使用しているプロセスを特定する

推測はやめましょう。まずこれらのコマンドのいずれかを実行してください。

ssを使う(推奨)

sudo ss -tlnp | grep ':80'

出力例:

LISTEN  0  511  0.0.0.0:80  0.0.0.0:*  users:(("nginx",pid=12345,fd=6))

最後の列にプロセス名とPIDが表示されます — これだけあれば十分です。

lsofを使う

sudo lsof -i :80
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   12345     root    6u  IPv4  98765      0t0  TCP *:http (LISTEN)
nginx   12346 www-data    6u  IPv4  98765      0t0  TCP *:http (LISTEN)

fuserを使う

sudo fuser 80/tcp

PIDだけが表示されます。-vを追加するとプロセス名も一緒に表示されます:

sudo fuser -v 80/tcp

ステップ2 — 原因に応じて対処する

ケースA: 別のNginxインスタンスがすでに動いている

最もよくある原因です。同じポートを奪い合う2つのNginxワーカーが存在しています — 通常はsystemd管理のサーバーでsudo nginxを直接実行したことが原因です。

まずクリーンな方法を試してください:

sudo systemctl stop nginx

systemctlではすでに停止済みと表示されるが、プロセスはまだ生きている場合はPIDで強制終了します:

sudo kill 12345

まだ止まらない場合は強制終了します:

sudo kill -9 12345

古いPIDファイルを削除します:

sudo rm -f /run/nginx.pid

Nginxを起動します:

sudo systemctl start nginx

ケースB: Apacheがポート80で動いている

ApacheとNginxはどちらもデフォルトでポート80を使用します — 共有はできません。まずApacheを停止します:

sudo systemctl stop apache2      # Debian/Ubuntu
sudo systemctl stop httpd        # CentOS/RHEL

このサーバーでApacheを使用しない場合は、再起動後に自動起動しないよう無効化します:

sudo systemctl disable apache2

Nginxを起動します:

sudo systemctl start nginx

ケースC: 別のアプリ(Node.js、Pythonなど)がポート80を使用している

ステップ1で取得したPIDを使って、実際に何が動いているか確認します:

sudo ps -p 12345 -o comm=

2つの対処方法があります:

  • そのアプリを停止して、Nginxをリバースプロキシとして前段に配置する — ほとんどのスタックで標準的な構成です。
  • そのアプリを別のポート(例:3000や8000)に移して、Nginx経由でプロキシする。

プロセスを直接終了します:

sudo kill 12345

または、サービスとして管理されている場合はそちらから停止します:

sudo systemctl stop myapp

ステップ3 — 再発を防ぐ

常にsystemctlを使い、nginxコマンドを直接実行しない

sudo nginxを直接実行するとsystemdのプロセス管理をバイパスします。これが、Nginxを停止したつもりでも孤立プロセスがポート80を保持し続ける原因です。

以下の4つのコマンドだけを使いましょう:

sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl reload nginx   # グレースフルな設定の再読み込み、ダウンタイムなし
sudo systemctl restart nginx

Nginxを有効化してsystemdに適切に管理させる

sudo systemctl enable nginx

サービス設定全体を確認したい場合:

sudo systemctl cat nginx

[Service]セクションにExecStartPre=/usr/sbin/nginx -tが含まれているか確認してください。これがあれば、設定ファイルの構文エラーはNginxがポートをバインドしようとする前に素早く検出されます。

同じサーバーでApacheとNginxの両方を動かす場合

Apacheをポート8080に移してNginxを前段に配置します。/etc/apache2/ports.confで:

Listen 8080

次にNginxのサーバーブロックで:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

ステップ4 — 修正を確認する

Nginxが正常に起動しているか確認します:

sudo systemctl status nginx

Active: active (running)と表示されていることを確認します。次にポート80がNginxによって保持されていることを確認します:

sudo ss -tlnp | grep ':80'
LISTEN  0  511  0.0.0.0:80  0.0.0.0:*  users:(("nginx",pid=9876,fd=6))

最後にHTTPテストで確認します:

curl -I http://localhost

HTTP/1.1 200 OKが返ってくれば、ポートは解放されNginxが正常に動作しています。完了です。

クイックリファレンス

# 1. ポート80を使用しているプロセスを特定する
sudo ss -tlnp | grep ':80'

# 2. 競合しているプロセスを停止する(例:apache)
sudo systemctl stop apache2

# 3. 必要に応じて古いPIDファイルを削除する
sudo rm -f /run/nginx.pid

# 4. Nginxを起動する
sudo systemctl start nginx

# 5. 動作確認
sudo systemctl status nginx
curl -I http://localhost

Related Error Notes