要約:30秒で解決する方法
この警告は、同じ server_name が同じポートに対して複数の設定ファイルに記述されている場合に発生します。Nginxは単純に最初に読み込んだファイルを採用し、それ以外のインスタンスを無視します。
- 重複箇所を見つける:
sudo grep -ri "example.com" /etc/nginx/ - 不要な
server_nameエントリを削除するか、ファイルを統合します。 - 構文をチェックする:
sudo nginx -t - 変更を適用する:
sudo systemctl reload nginx
なぜNginxは設定を無視するのか
Nginxを交通整理員(トラフィックコントローラー)と考えてみてください。Nginxは server_name ディレクティブを使用して、どのフォルダやプロキシがリクエストを処理すべきかを決定します。もし example.com を2つの異なる場所に定義してしまうと、Nginxは混乱してしまいます。
Nginxは、単一のドメインを同時に2つの異なるロジックブロックにマッピングすることはできません。動作を継続するために、Nginxは最初に遭遇した設定を選択します。通常は /etc/nginx/sites-enabled/ 内でアルファベット順に最初に来るものです。その後、他の設定は破棄されます。これが、最新の更新内容がブラウザに反映されない理由です。
よくあるケース
- コピペによる見落とし:
site-a.confをコピーしてsite-b.confを作成したが、ファイル内のドメインを更新し忘れた。 - デフォルトファイルとの競合: 設定フォルダ内の
defaultまたは000-defaultファイルが、新しいファイルに移動しようとしているドメインをまだ保持している。 - バックアップファイルの干渉: Nginxがスキャンするディレクトリに
mysite.conf.bakファイルを残してしまった。nginx.confで*.confを読み込む設定になっている場合、アクティブなファイルとバックアップファイルの両方が読み込まれます。 - ポートの重複: リダイレクトを設定しようとして、誤ってポート443 (SSL) に対して同じドメインを2回定義してしまった。
ステップバイステップのトラブルシューティング
1. 重複箇所を素早く特定する
すべてのファイルを手動で開いて時間を無駄にしないでください。grep を使って設定ディレクトリ全体を検索しましょう。-r フラグは再帰的に検索し、-i は大文字と小文字を区別しません。
# 特定のドメインを検索
sudo grep -ri "example.com" /etc/nginx/
競合が発生している場合の典型的な出力は以下のようになります:
/etc/nginx/sites-enabled/prod-site.conf: server_name example.com;
/etc/nginx/sites-enabled/old-site.conf: server_name example.com;
この場合、old-site.conf が本番用ファイルからトラフィックを奪っている原因です。
2. デフォルトのキャッチオールを確認する
grepの結果にドメインが2回表示されない場合は、デフォルトサーバーがワイルドカードとして機能していないか確認してください。以下のコマンドを実行して、デフォルトサーバーの設定を確認します:
grep -r "default_server" /etc/nginx/sites-enabled/
3. 競合を解消する
ドメインを奪い合っている2つのファイルが見つかったら、選択肢は2つあります:
オプションA:古い設定を削除する
もし old-site.conf が以前の設定の残骸であれば、シンボリックリンクを削除してNginxが読み込まないようにします:
sudo rm /etc/nginx/sites-enabled/old-site.conf
オプションB:エイリアスを統合する
1つのサイトで複数の名前に対応させたい場合は、それらすべてを1つの server ブロックに記述します。1行の中でスペースで区切って記述してください:
server {
listen 443 ssl;
server_name example.com www.example.com dev.example.com;
# ... 残りの設定
}
4. テストとリロード
変更を適用する前に、必ず検証を行ってください。セミコロンが1つ抜けているだけで、Webサーバー全体がダウンする可能性があります。Nginxの内蔵テスターを実行しましょう:
sudo nginx -t
出力に test is successful と表示されたら、サービスをリロードします。リロードは現在の接続を切断しないため、再起動よりも安全です:
sudo systemctl reload nginx
Docker特有の問題
公式の nginx:alpine や nginx:latest イメージを使用する場合、デフォルトの設定が /etc/nginx/conf.d/default.conf にあらかじめ組み込まれていることがよくあります。デフォルト設定を上書きせずに独自のファイルをそのディレクトリにマウントすると、すぐにこの競合が発生します。
実行中のコンテナ内で競合を見つけるには、以下を使用します:
docker exec -it grep -r "example.com" /etc/nginx/
これを解決するには、Dockerfileでデフォルト設定を削除するか、自分のファイルを直接 /etc/nginx/conf.d/default.conf の上にマウントするようにします。
修正が機能しているか確認する方法
アクティブな設定にカスタムのトラッキングヘッダーを追加することで、Nginxが正しいファイルを使用していることを証明できます:
server {
server_name example.com;
add_header X-Config-Status "Correct-File-Loaded";
# ...
}
リロード後、curl でレスポンスヘッダーを確認します:
curl -I https://example.com
もし X-Config-Status: Correct-File-Loaded が表示されれば、競合は無事に解消されています。

