Nginx
May 2010 28

Nginx + IPv6

Недавно написал топик про поддержку IPv6 в Windows 7/Vista/XP (это тут). Захотелось сделать поддержку IPv6 на своём сервере, где хостируются сайты, в итоге вот что получилось.

Сервер у меня под FreeBSD, использовал HE.net для получения IPv6 адреса на сервере, вот конфиг настройки этого туннеля в /etc/rc.conf:

ipv6_gateway_enable="YES"
ipv6_enable="YES"
gif_interfaces="gif0"
gifconfig_gif0="ВАШ_IP_СЕРВЕРА 72.52.104.74"
ipv6_ifconfig_gif0="2001:470:1f04:***::2"  #Выданный вам IPv6
ipv6_defaultrouter="2001:470:1f04:***::1" #Это адрес сервера HE.net в IPv6.

Теперь встал вопрос о поддержки веб-сервера, адресации IPv6. У меня используется связка nginx + apache 2.2, вот выдержка server в конфиге nginx:

server {
    listen 80 default;
    listen [::]:80 default;
    server_name _;
        location /nginx_status {
                stub_status on;
                access_log   off;
                allow all;
        }
    location / {
        proxy_pass http://127.0.0.1:81;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        client_max_body_size       10m;
        client_body_buffer_size    128k;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_send_lowat           12000;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
         }
        location ~* \.(jpeg|jpg|gif|png|css|js|pdf|txt|tar|tar.gz|zip|ico|swf|rss)$ {
                root /usr/local/www/static/$host;
                access_log off;
                expires off;
                }
}

Как видите, была добавлена строка listen [::]:80 default;. Это даст возможность вашему nginx слушать все IPv6 адреса.

По умолчанию такую запись можно добавить в одну секцию server. Подразумевается, наверное, то что в IPv6 каждый сайт будет на своём IPv6 адресе.

Для того, чтобы на каждом server {} был свой IPv6 адрес, нужно добавить listen [2001:470:1f04:***::3]:80. Естественно, цеплять такие адреса надо alias для вашего основного интерфейса.

Затем вам необходимо внести запись в ДНС ваших доменов, которые хостируются.

Запись я внёс такую:

*                 IN               AAAA             2001:470:1f04:***::2

Т.к. у меня все домены на одном сервере и я особо не заморачивался с выдачей каждому сайту IPv6, сделал просто:

IPv6 Network -----------> IPv6 ServerIP ---------> проксирование на 127.0.0.1 IPv4 (где крутится Apache с обычными настройками для IPv4).

Итого, прописав это, я получил доступность всех моих доменов из сети IPv6.

К каждому домену в ServerAlias апача прописал поддомен ipv6.имя_домера.ru. Ну и создал символьные ссылки для домена в своей конструкции (см root /usr/local/www/static/$host;). В этой папке у меня символьные ссылки для всех доменов и поддоменов на моём сервере.

P.S. Скорей бы многие хостинг провайдеры и хостинг панели стали поддерживать IPv6 из коробки. Большинство доменов могли бы работать и там и там, тогда и переход на IPv6 будет не столь болезненным.

P.S. Появился трафик IPv6 на сайтах, наверное, из-за добавление в каталоги сайтов, которые поддерживают IPv6.
+30
13.8k 51
Comments 21
Top of the day