В настоящее время я настраиваю свой сервер 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
.