同じマシンで複数のサーバーを実行していますが、一部はhttpのみ、一部はhttpとhttpsの両方を使用しています。メインの設定ファイルに含まれる個別のファイルで定義されたいくつかのサーバーブロックがあります。
他の構成ファイルの他のserver_namesと一致しない要求に汎用の「メンテナンスページ」を提供するhttp用の「デフォルト」サーバーをセットアップしました。httpのデフォルトサーバーは期待どおりに動作し、server_name "_"を使用し、インクルードのリストの最初に表示されます(サーバー間でserver_namesが重複している場合は、最初に表示されるものが使用されます)。これはうまく機能します。
同じサーバーブロック( "listen 80 default_server"を "listen 443 default_server"に切り替え、ページ "return 444"を提供する代わりに)を期待していますが、そうではありません。代わりに、新しいデフォルトhttpsサーバーが実際にすべての着信https接続を取得して失敗しているように見えますが、他のサーバーブロックには着信要求に対してより適切なserver_nameがあります。新しいデフォルトのhttpsサーバーを削除すると、半正しい動作が再開されます。httpsのあるWebサイトはすべて正しく読み込まれます。ただし、httpsのないWebサイトはすべて、インクルードファイルの最初のhttpsサーバーにルーティングされます(ドキュメントによると、「default_server」が表示されない場合、最初に表示されるサーバーブロックは「default」になります)。
だから私の質問は、ssl接続のためにnginxで「デフォルトサーバー」を定義する正しい方法は何ですか?なぜ「default_server」を明示的に設定すると貪欲になり、すべての接続を取得するのに対して、nginxに暗黙的に「デフォルトサーバー」を決定させると、期待どおりに動作します(間違ったサーバーがデフォルトとして設定され、他の実サーバーが正しく動作します)?
これが私の「デフォルトサーバー」です。Httpは、他のサーバーを壊すことなく機能します。Httpsは他のサーバーを破壊し、すべてを消費します。
server {
listen 443 ssl default_server;
server_name _;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
return 444;
}
server {
listen *:80 default_server;
server_name _;
charset utf-8;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
root /home/path/to/templates;
location / {
return 503;
}
error_page 503 @maintenance;
location @maintenance {
rewrite ^(.*)$ /maintenance.html break;
}
}
ここで何が間違っているのか見ている人はいますか?