Виртуальные хосты 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.

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