У меня есть несколько серверов, работающих на одной машине, некоторые только с http, некоторые с http и https. Есть несколько серверных блоков, определенных в отдельных файлах, которые включены в основной файл конфигурации.
Я настроил сервер «по умолчанию» для http, который будет обслуживать общую «страницу обслуживания» для запросов, которые не совпадают ни с одним из имен server_names в других файлах конфигурации. Сервер http по умолчанию работает как положено, он использует имя_сервера "_" и появляется первым в списке включений (потому что я заметил, что в случае дублирования имен серверов на разных серверах используется тот, который появляется первым). Это прекрасно работает.
Я ожидал бы такой же точный блок сервера (только переключая «listen 80 default_server» на «listen 443 default_server», а также вместо обслуживающей страницы «return 444»), однако это не так. Вместо этого кажется, что новый сервер https по умолчанию фактически захватывает все входящие соединения https и вызывает их сбой, хотя другие блоки сервера имеют более подходящие имена_сервера для входящих запросов. Удаление нового https-сервера по умолчанию приведет к возобновлению полукорректного поведения: все сайты с https будут загружаться правильно; но все веб-сайты без https будут перенаправлены на первый https-сервер во включаемых файлах (что в соответствии с документацией, если «default_server» не появляется, то первым появившимся блоком сервера будет «default»).
Итак, мой вопрос, как правильно определить «сервер по умолчанию» в nginx для ssl-соединений? Почему, когда я явно устанавливаю «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;
}
}
Кто-нибудь из вас понимает, что здесь может быть не так?