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

Глобальная установка ipv6only = off

После обновления мой сервер nginx доступен только через IPv6, а не IPv4, в то время как моя конфигурация содержала

listen   [::]:80 default_server;

Теперь я изменил это на

listen   [::]:80 default_server ipv6only=off;

и сервер снова доступен через IPv4. Эти швы связаны с изменениями в nginx 1.3.4 (раздел «Изменения в nginx 1.3.4»).

Поскольку у меня более одной конфигурации сервера на одной машине, я хотел бы установить ipv6only=off глобально есть ли возможность это сделать?

Я только что прошел через это при обновлении с 1.0 до 1.4.

Поскольку только один слушатель фактически привязан к любому данному порту, достаточно указать ipv6only=off в кто угодно вашей listen директивы.

Итак, по умолчанию server блоков, у меня есть:

    listen [::]:80 ipv6only=off default_server;

и

    listen [::]:443 ipv6only=off default_server;

Все остальные server блоки просто указывают оригинал listen директивы. И это работает; любой виртуальный хост доступен через IPv4 или IPv6.

Вы также можете добавить его в все из них, но на самом деле это не обязательно. Достаточно добавить его к любому из них.

Однако, поскольку ipv6only= flag предназначен только для Linux, я больше не использую эту конструкцию. В моих текущих директивах явно указаны как IPv4, так и IPv6, например:

listen [::]:80 default_server;
listen 80 default_server;

Альтернативой ответу @Michael Hampton (но вам нужно коснуться всех файлов) является вставка

listen 80;      # listen for IPv4
listen [::]:80; # listen for IPv6

для всех серверов.


Странно то, что вставка listen [::]:80 ipv6only=off для более чем одного сервера приводит к

nginx: [emerg] duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/default.conf:3

И смесь listen 80; и ipv6only=off (на разных серверах) приводит к

nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()