何が起きているか
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

