Виртуальные хосты nginx не работают после включения IPv6
Я только что включил IPv6 на своем веб-сервере nginx 1.8.0 на основе Debian Jessie. Для этого я отредактировал свой Virtual Host-Config:
server {
listen 80;
listen [2001:1608:10:160:34::2]:80;
server_name dominicpratt.de www.dominicpratt.de;
return 301 https://dominicpratt.de$request_uri;
}
server {
listen 443;
listen [2001:1608:10:160:34::2]:443;
server_name dominicpratt.de www.dominicpratt.de;
root /var/www/dominicpratt.de;
index index.html index.htm index.php;
access_log /var/log/nginx/dominicpratt.de_access.log;
ssl on;
ssl_certificate /etc/nginx/ssl/dominicpratt.de/combined.pem;
ssl_certificate_key /etc/nginx/ssl/dominicpratt.de/wildcard.key;
location / {
try_files $uri $uri/ /index.php?q=$request_uri;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm-www.sock;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
fastcgi_index index.php;
include fastcgi_params;
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
}
}
Теперь мой сайт dominicpratt.de работает нормально, а мои поддомены - нет. Они перенаправляют на dominicpratt.de - пример: rss.dominicpratt.de и следующий конфиг:
server {
listen 80;
listen [2001:1608:10:160:34::5]:80;
server_name rss.dominicpratt.de;
return 301 https://rss.dominicpratt.de$request_uri;
}
server {
listen 443;
listen [2001:1608:10:160:34::5]:443;
server_name rss.dominicpratt.de;
root /var/www/rss.dominicpratt.de;
index index.html index.htm index.php;
access_log /var/log/nginx/rss.dominicpratt.de_access.log;
ssl on;
ssl_certificate /etc/nginx/ssl/dominicpratt.de/combined.pem;
ssl_certificate_key /etc/nginx/ssl/dominicpratt.de/wildcard.key;
location / {
try_files $uri $uri/ /index.php?q=$request_uri;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm-www.sock;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
fastcgi_index index.php;
include fastcgi_params;
}
}
Я не могу связаться с https://rss.dominicpratt.de/ и всеми другими поддоменами. Если я удаляю или закомментирую строки прослушивания IPv6 в блоке сервера, он будет работать так же, как и должен.
2 ответа
В Nginx 1.8.0 была ошибка [1] (исправлена в 1.8.1), которая включала SPDY/h2 по умолчанию. В браузерах http/2 попытайтесь открыть только одно соединение на сервер [2]. Firefox делает это очень агрессивно [3]. Он повторно использует IPv6-соединения через имена хостов, даже если IPv6-адреса не совпадают (но IPv4-адреса совпадают и сертификаты совпадают). С подстановочными сертификатами это может привести к наблюдаемой проблеме [4], где обслуживается контент не того домена.
В этом случае браузер пытается отменить удаление поддоменов для оптимизации скорости, ошибочно полагая, что разные поддомены были созданы только для оптимизации скорости в http/1 (т. Е. С использованием stattic1.example.com и static2.example.com для получения большего количества серверов). соединения параллельно).
Проблема может быть решена с помощью A) использования разных сертификатов для доменов, B) использования одного и того же IPv6-адреса для доменов или C) путем отправки http-кода состояния 421[5] для ошибочных запросов.
Попробуйте добавить ipv6only=on
на ваш listen
Директива для адреса IPv6 выглядит так:
listen [2001:1608:10:160:34::5]:80 ipv6only=on;
...
listen [2001:1608:10:160:34::5]:443 ipv6only=on;
Тот факт, что вы указали адрес IPv6 в директиве прослушивания, по умолчанию не отключает IPv4.