Назад | Перейти на главную страницу

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 не возвращает ошибок.
Где синтаксическая ошибка, которую я заметил?

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

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

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