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

Виртуальные хосты nginx не работают после включения IPv6

Я только что включил IPv6 на своем веб-сервере nginx 1.8.0 на основе Debian Jessie. Для этого я отредактировал свою виртуальную конфигурацию хоста:

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 в серверном блоке, он будет работать так же, как и должен.

В 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 для увеличения количества серверов. соединения параллельно).

Проблема может быть решена путем А) использования разных сертификатов для доменов, Б) использования одного и того же IPv6-адреса для доменов или В) отправкой кода состояния 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-адрес в директиве listen, не отключает IPv4 по умолчанию.