17

1 つの nginx conf ファイルに約 1300 の vhosts があります。すべて次のレイアウトを使用します (それらは vhost ファイル内で次々にリストされます)。

今私の問題は、ブラウザが時々 site2 を site1 にリダイレクトすることです。何らかの理由で、ドメイン名が一致しません。

nginx は常に vhosts ファイルの最初のサイトにリダイレクトしているようです。

この問題が何であるかを知っている人はいますか?

server {
    listen   80;

    server_name site1.com;
    rewrite ^(.*) http://www.site1.com$1 permanent;
}

server {
    listen   80;

    root /srv/www/site/public_html/src/public/;
    error_log /srv/www/site/logs/error.log;
    index index.php;

   server_name www.site1.com;

    location / {
        if (!-e $request_filename) {
            rewrite ^.*$ /index.php last;
        }
    }

    location ~ .(php|phtml)$ {
        try_files $uri $uri/ /index.php;
        fastcgi_param SCRIPT_FILENAME /srv/www/site/public_html/src/public$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

server {
    listen   80;

    server_name site2.com;
    rewrite ^(.*) http://www.site2.com$1 permanent;
}

server {
    listen   80;

    root /srv/www/site/public_html/src/public/;
    error_log /srv/www/site/logs/error.log;
    index index.php;

   server_name www.site2.com;

    location / {
        if (!-e $request_filename) {
            rewrite ^.*$ /index.php last;
        }
    }

    location ~ .(php|phtml)$ {
        try_files $uri $uri/ /index.php;
        fastcgi_param SCRIPT_FILENAME /srv/www/site/public_html/src/public$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

編集おそらくもう1つ言及することは、nginx -s reloadで2分ごとにこのすべての仮想ホストをリロードすることです。

最初のテストでは、リダイレクトはリロード時にのみ発生するように見えます...さらにいくつかのテストを行う予定ですが、これは役立つ可能性があります..

4

1 に答える 1

19

参照 (nginx がリクエストを処理する方法): http://nginx.org/en/docs/http/request_processing.html

この構成では、nginx はリクエストのヘッダー フィールド「Host」のみをテストして、リクエストをルーティングするサーバーを決定します。その値がどのサーバー名とも一致しない場合、またはリクエストにこのヘッダー フィールドがまったく含まれていない場合、nginx はリクエストをこのポートのデフォルト サーバーにルーティングします。

デフォルト サーバーは最初のサーバーです。これは、nginx の標準的なデフォルトの動作です。

これらの不正なリクエストのホスト ヘッダーを確認していただけますか?

また、明示的なデフォルト サーバーを作成してこれらの不正なリクエストをすべてキャッチし、調査のためにリクエスト情報 (つまり、$http_host) を別のエラー ログ ファイルに記録することもできます。

server {
    listen       80  default_server;
    server_name  _;
    error_log /path/to/the/default_server_error.log;

    return       444;
}

[更新]あなたがやってnginx -s reloadいるように、そのnginx confファイルに非常に多くのドメインがある場合、次のことが可能です:

リロードは次のように機能します

新しい構成での新しいワーカー プロセスの開始、古いワーカー プロセスの正常なシャットダウン

そのため、古い労働者と新しい労働者がしばらく共存することができました。たとえば、構成ファイルに新しいサーバー ブロック (新しいドメイン名を持つ) を追加すると、リロード時に、新しいワーカーには新しいドメインがあり、古いものにはありません。リクエストが古いワーカー プロセスによって送信されると、不明なホストとして扱われ、デフォルト サーバーによって処理されます。

あなたはそれが2分ごとに行われると言った。走れますか

ps aux |grep nginx

各ワーカーが実行されている時間を確認しますか?2 分をはるかに超える場合、リロードが期待どおりに機能しない可能性があります。

于 2013-04-03T23:14:27.513 に答える