У мене є кілька серверів, які працюють на одній машині, деякі лише з http, деякі з http і https. Існує кілька блоків серверів, визначених в окремих файлах, які входять в основний конфігураційний файл.
Я створив сервер "за замовчуванням" для http, який буде обслуговувати загальну "сторінку обслуговування" для запитів, які не відповідають жодному з інших імен серверів у інших файлах конфігурації. Сервер http за замовчуванням працює, як очікувалося, він використовує ім'я_сервера "_", і воно з'являється першим у списку включень (тому що я помітив, що у випадку дублювання імен_сервер на всіх серверах використовується те, що з'являється першим). Це чудово працює.
Я б очікував того самого точного блоку сервера (лише переключення "прослухати 80 за замовчуванням_сервер" на "прослухати 443 за замовчуванням_сервер", а також замість того, щоб обслуговувати сторінку "повернути 444"), однак це не так. Натомість з'ясовується, що новий сервер https за замовчуванням насправді перехоплює всі вхідні з'єднання https та призводить до їх відмови, хоча інші блоки серверів мають більш відповідні імена_сервера для вхідних запитів. Видалення нового сервера https за замовчуванням призведе до відновлення напівправильної поведінки: всі веб-сайти з https завантажуватимуться правильно; але веб-сайти без https усі будуть перенаправлені на перший https-сервер у файлах включення (які згідно з документами, якщо не з'являється "default_server", тоді перший серверний блок, який з'явиться, буде "за замовчуванням").
Отже, моє запитання полягає в тому, який правильний спосіб визначити "сервер за замовчуванням" в 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;
}
}
Хтось із вас бачить, що тут може бути не так?