NGINX использует другой серверный блок по умолчанию

В настоящее время я настраиваю свой сервер nginx, и я столкнулся с проблемой, из-за которой я, похоже, не могу найти проблему, которую сделал, даже после нескольких часов исследований.
Я запускаю Debian 9 с PHP 7.2-fpm на NGINX.
Итак, я настроил следующие серверные блоки для разных поддоменов:

sites-enabled
- www.example.com    #this config covers both www.example.com and example.com
- pfa.example.com    #this config covers pfa.example.com

Вот содержимое этих файлов (я удалил конфигурацию по умолчанию из сайтов с включенной поддержкой, я оставил ее резервную копию на сайтах, доступных):
www.example.com

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://www.example.com$request_uri;
}
server {
    listen 443 ssl http2; # managed by Certbot
    listen [::]:443 ssl http2; # managed by Certbot
    server_name www.example.com;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_dhparam /etc/letsencrypt/live/www.example.com/dh.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/www.example.com/chain.pem;
    resolver 8.8.8.8;

    root /var/www/www.example.com/html/;
    index index.php index.html index.htm;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header x-xss-protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    }
}

Вызов обоих example.com а также www.example.com работает отлично (перенаправляет на https и показывает содержимое /var/www/www.example.com/html/).
Это конфиг pfa.example.com:

server {
    listen 80 http2;
    listen [::]:80 http2;
    server_name pfa.example.com;
    return 301 https://pfa.example.com$request_uri;
}
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name pfa.example.com;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/pfa.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/pfa.example.com/privkey.pem; # managed by Certbot
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_dhparam /etc/letsencrypt/live/pfa.example.com/dh.pem;

    ssl_protocols TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    ssl_prefer_server_ciphers on;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/pfa.example.com/chain.pem;
    resolver 8.8.8.8;

    root /var/www/html/;
    index index.php index.html index.htm;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header x-xss-protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    }
}

Я настроил dh.pem 2048-битные ключи через openssl для обоих доменов.
Вызов этой страницы тоже работает как задумано.

Вот моя проблема: при вызове случайной страницы как abc.example.com, он будет использовать конфиг pfa.example.com в качестве конфигурации по умолчанию. Я проверил объявления сервера миллион раз, я не могу понять, как сервер блокирует pfa.example.com может быть ошибочно пойман (это даже работает для sdfsdfjikdsfjsdfhjsd.example.com). Это раздражает не только потенциальных посетителей, но и меня, поскольку при вызове страницы https://abc.example.com, он попытается использовать конфигурацию ssl для pfa.example.com, что приводит к ошибке.
nginx -t не возвращает ошибок.
Где ошибка синтаксиса, которую я наблюдал?

РЕДАКТИРОВАТЬ: я удалил конфигурацию vhost по умолчанию, потому что это позволит 443 трафика пройти pfa.example.com в любом случае. Поскольку у меня есть резервная копия конфигурации по умолчанию, я могу легко добавить ее обратно. После этого мне все еще нужно решение для возврата ошибки 404 на трафик ssl для несуществующих поддоменов. Любая помощь приветствуется.

1 ответ

Решение

В nginx всегда есть vhost по умолчанию. Это может быть явно настроено с помощью default вариант для listen директивы. Если опущено, nginx будет использовать первый объявленный vhost, поскольку он анализирует его конфигурацию по умолчанию. Похоже, что pfa.example.com произошел первым.

Вы можете увидеть фактический заказ в окончательном присоединенном конфиге, выполнив nginx -T,

Другие вопросы по тегам