[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"/ru/kb/how-to/vps/podklyuchenie-ipv6-k-sajtu-i-api-c-dostupom-ipv4KbData":3},{"page":4,"pages":129,"recommendedPages":130,"category":70,"categoryTree":70,"total":16,"currentOrder":158,"activeManualCategoryId":70,"tag":-1},{"route":5,"uuid":8,"title":9,"excerpt":10,"content":11,"view_count":12,"published_at":13,"modified_at":14,"like":15,"category":18,"hero_image":63,"seo_metadata":64,"schema_org_metadata":68,"open_graph_metadata":71,"sections":72,"tags":114,"breadcrumbs":115,"images":122},{"language":6,"path":7},"ru","/kb/how-to/vps/podklyuchenie-ipv6-k-sajtu-i-api-c-dostupom-ipv4","b2967b11-a4a7-8cd8-045c-e6af7a7137bd","Публикуем сайт и API по IPv6: dual stack без риска для текущих пользователей","В этой статье мы разберем, как настроить уже работающий сайт и его API для приема подключений по IPv6 без потери доступности по IPv4. Также мы рассмотрим, как проверить доступность IPv6 на сервере, какие изменения потребуются в конфигурации Nginx, Apache и их связки и как добавить AAAA-запись в DNS.","\n\u003Cp>В этой статье мы разберем, как настроить уже работающий сайт и его API для приема подключений по IPv6 без потери доступности по IPv4. Также мы рассмотрим, как проверить доступность IPv6 на сервере, какие изменения потребуются в конфигурации Nginx, Apache и их связки и как добавить AAAA-запись в DNS.\u003C/p>\n\n\n\n\u003Ch2 id=\"chto-takoe-ipv6-i-dual-stack\">Что такое IPv6 и dual stack\u003C/h2>\n\n\n\n\u003Cp>IPv6 – версия протокола, разработанная на смену IPv4. Основное отличие – длина адреса: 128 бит вместо 32, что дает практически неограниченное адресное пространство. Адрес записывается шестнадцатеричными группами, разделенными двоеточиями, например: \u003Ccode>2001:db8:1a2b:3c4d::1\u003C/code>.\u003C/p>\n\n\n\n\u003Cp>Dual stack – режим, при котором сервер одновременно принимает подключения по обоим протоколам. У домена настроены две записи: A с адресом IPv4 и AAAA с адресом IPv6, веб-сервер слушает оба протокола, а клиент при подключении выбирает подходящий самостоятельно.\u003C/p>\n\n\n\n\u003Cp>Протоколы работают параллельно и независимо друг от друга, поэтому доступность сайта по IPv4 не меняется. Переносить данные и править код сайта не требуется – достаточно изменений в конфигурации веб-сервера и одной записи в DNS.\u003C/p>\n\n\n\n\u003Ch2 id=\"proverka-dostupnosti-ipv6-na-servere\">Проверка доступности IPv6 на сервере\u003C/h2>\n\n\n\n\u003Cp>Подключите IPv6 в панели управления, в настройках нужного сервера в разделе «Облако». После этого подключитесь к серверу по SSH и посмотрите адреса на сетевом интерфейсе:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>ip -6 addr show dev eth0\n2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 state UP qlen 1000\n    inet6 2001:db8:1a2b:3c4d::1/64 scope global\n       valid_lft forever preferred_lft forever\n    inet6 fe80::257:24ff:fe26:65f7/64 scope link\n       valid_lft forever preferred_lft forever\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Требуется адрес с пометкой \u003Ccode>scope global\u003C/code> – это публичный адрес сервера, именно он потребуется для AAAA-записи. Адреса с пометкой \u003Ccode>scope link\u003C/code>, начинающиеся с \u003Ccode>fe80::\u003C/code>, являются служебными и в интернете не маршрутизируются.\u003C/p>\n\n\n\n\u003Cp>Префикс \u003Ccode>/64\u003C/code> означает, что серверу выделена целая подсеть, а не один адрес: ее хватит на все сайты и сервисы. Для публикации сайта по IPv6 достаточно адреса, который уже назначен на интерфейс.&nbsp;\u003C/p>\n\n\n\n\u003Cp>Если сетевой интерфейс называется иначе, посмотрите список интерфейсов командой \u003Ccode>ip -6 addr show\u003C/code> без указания устройства.\u003C/p>\n\n\n\n\u003Cp>Проверьте связность по IPv6 – для этого подойдет любой публичный адрес, например, DNS-сервер Google:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>ping -6 -c3 2001:4860:4860::8888\nPING 2001:4860:4860::8888 (2001:4860:4860::8888) 56 data bytes\n64 bytes from 2001:4860:4860::8888: icmp_seq=1 ttl=118 time=13.8 ms\n64 bytes from 2001:4860:4860::8888: icmp_seq=2 ttl=118 time=13.4 ms\n64 bytes from 2001:4860:4860::8888: icmp_seq=3 ttl=118 time=13.2 ms\n--- 2001:4860:4860::8888 ping statistics ---\n3 packets transmitted, 3 received, 0% packet loss, time 2003ms\nrtt min/avg/max/mdev = 13.228/13.472/13.802/0.241 ms\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Если адрес назначен, но \u003Ccode>ping\u003C/code> не проходит, проверьте наличие маршрута по умолчанию:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>ip -6 route show\n2001:db8:1a2b:3c4d::/64 dev eth0 proto kernel metric 256 pref medium\nfe80::/64 dev eth0 proto kernel metric 256 pref medium\ndefault via fe80::1 dev eth0 metric 1024 onlink pref medium\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>При отсутствии строки, начинающейся с \u003Ccode>default via\u003C/code>, обратитесь в поддержку: адрес выделен, но маршрутизация не настроена.\u003C/p>\n\n\n\n\u003Ch2 id=\"prioritet-ipv6-i-ipv4-dlya-ishodyashchih-soedineniy\">Приоритет IPv6 и IPv4 для исходящих соединений\u003C/h2>\n\n\n\n\u003Cp>После подключения IPv6 сервер начинает использовать его не только для приема входящих подключений, но и для собственных запросов – обращений приложений к сторонним API, загрузки обновлений, отправки почты.\u003C/p>\n\n\n\n\u003Cp>Порядок определяет системная библиотека: адреса назначения сортируются по правилам RFC 6724. В стандартной конфигурации glibc встроенные правила дают IPv6 более высокий приоритет, чем IPv4. Посмотреть фактический порядок можно командой:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>getent ahosts example.ru\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Например:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>2001:db8:1a2b:3c4d::1 STREAM example.ru\n2001:db8:1a2b:3c4d::1 DGRAM\n2001:db8:1a2b:3c4d::1 RAW\n81.200.119.100 STREAM\n81.200.119.100 DGRAM\n81.200.119.100 RAW\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Адрес, стоящий первым, будет первым в списке адресов, переданном приложению. Гарантии, что приложение установит соединение именно с ним, это не дает: приложение может выбирать адрес самостоятельно или явно указывать протокол. Но если исходящий IPv6 работает нестабильно, часть запросов может завершаться ошибкой, притом что сайт по-прежнему открывается по IPv4.\u003C/p>\n\n\n\n\u003Cp>Приоритет настраивается в файле \u003Ccode>/etc/gai.conf\u003C/code>. По умолчанию он состоит из комментариев, поэтому используются встроенные значения. Если в файл добавить собственные правила \u003Ccode>precedence\u003C/code>, они заменят встроенную таблицу приоритетов целиком. Поэтому при изменении таблицы остальные нужные значения необходимо указать в файле явно.\u003C/p>\n\n\n\n\u003Cp>Отдельная таблица меток, которую показывает команда \u003Ccode>ip addrlabel list\u003C/code>, относится к выбору адреса-источника и не определяет порядок адресов назначения.\u003C/p>\n\n\n\n\u003Cp>Настройка касается только исходящих соединений сервера. По какому протоколу к сайту подключаются посетители, она не определяет.\u003C/p>\n\n\n\n\u003Cp>Дальнейшие действия зависят от того, какой веб-сервер обслуживает сайт. Перейдите к соответствующему разделу: «Настройка Nginx», «Настройка Apache» или «Настройка связки Nginx и Apache».\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-alert alert-block alert-block-info\">\u003Cdiv class=\"alert-block-title\">Обратите внимание!\u003C/div>\u003Cdiv class=\"alert-block-content\">Фильтрация трафика для IPv4 и IPv6 настраивается отдельно: правила, ограничивающие доступ по IPv4, на подключения по IPv6 не распространяются. Если на сервере используется UFW или другой файрвол, настройте для IPv6 такие же ограничения до публикации AAAA-записи. Иначе службы, закрытые от внешнего доступа по IPv4, окажутся доступны по новому протоколу.\u003C/div>\u003C/div>\n\n\n\n\u003Ch2 id=\"nastroyka-nginx\">Настройка Nginx\u003C/h2>\n\n\n\n\u003Cp>Откройте конфигурационный файл сайта, он находится в каталоге \u003Ccode>/etc/nginx/sites-available/\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>sudo nano /etc/nginx/sites-available/example.conf\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Конфигурация сайта, работающего только по IPv4, имеет примерно следующий вид:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>server {\n    listen 80;\n    server_name example.ru;\n    root /var/www/example/public;\n    index index.html;\n    location /api/ {\n        fastcgi_pass unix:/run/php/php8.3-fpm.sock;\n        fastcgi_param SCRIPT_FILENAME /var/www/example/api/index.php;\n        include fastcgi_params;\n    }\n}\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Добавьте в блок server строку \u003Ccode>listen [::]:80;\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>server {\n    listen 80;\n    listen [::]:80;\n    server_name example.ru;\n    root /var/www/example/public;\n    index index.html;\n    location /api/ {\n        fastcgi_pass unix:/run/php/php8.3-fpm.sock;\n        fastcgi_param SCRIPT_FILENAME /var/www/example/api/index.php;\n        include fastcgi_params;\n    }\n}\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Назначение директив:\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>listen 80\u003C/code> – прием подключений по IPv4 на 80 порту, эта строка остается без изменений;\u003C/li>\u003Cli>\u003Ccode>listen [::]:80\u003C/code> – прием подключений по IPv6 на том же порту;\u003C/li>\u003Cli>\u003Ccode>[::]\u003C/code> – обозначение всех адресов IPv6 сервера, аналог 0.0.0.0 при подключении через IPv4. Квадратные скобки отделяют адрес от номера порта: в адресе IPv6 двоеточия уже используются как разделители групп.\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Больше ничего менять не требуется: блоки \u003Ccode>location\u003C/code>, обработка API и остальная логика остаются без изменений – они не зависят от протокола, по которому пришел запрос.\u003C/p>\n\n\n\n\u003Cp>Если на сайте установлен SSL-сертификат, аналогичную строку нужно добавить и в блок, отвечающий за 443 порт:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>server {\n    listen 443 ssl;\n    listen [::]:443 ssl;\n    server_name example.ru;\n    ...\n}\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Пропуск этого шага – частая причина ситуации, когда по IPv6 сайт открывается по HTTP, но не открывается по HTTPS.\u003C/p>\n\n\n\n\u003Cp>Проверьте конфигурацию и перезапустите Nginx:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>sudo nginx -t\nsudo systemctl restart nginx\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-alert alert-block alert-block-info\">\u003Cdiv class=\"alert-block-title\">Обратите внимание!\u003C/div>\u003Cdiv class=\"alert-block-content\">При изменении директив \u003Ccode>listen\u003C/code> используйте \u003Ccode>restart\u003C/code>, а не \u003Ccode>reload\u003C/code>. Перезагрузка конфигурации не всегда пересоздает сетевые сокеты: рабочие процессы могут продолжать использовать прежние. Перезапуск занимает доли секунды, но в этот момент сайт недоступен по обоим протоколам, поэтому выполняйте его только после успешной проверки конфигурации командой \u003Ccode>nginx -t\u003C/code>.\u003C/div>\u003C/div>\n\n\n\n\u003Cp>Проверьте, что сервер слушает оба протокола:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>sudo ss -tlnp | grep :80\nLISTEN 0      511          0.0.0.0:80        0.0.0.0:*    users:((\"nginx\",pid=44444,fd=5),(\"nginx\",pid=44443,fd=5))\nLISTEN 0      511             [::]:80           [::]:*    users:((\"nginx\",pid=44444,fd=6),(\"nginx\",pid=44443,fd=6))\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Две строки – два сокета: \u003Ccode>0.0.0.0:80\u003C/code> для IPv4 и \u003Ccode>[::]:80\u003C/code> для IPv6.\u003C/p>\n\n\n\n\u003Cp>Проверьте работу сайта и API по обоим протоколам, указав путь к своему API вместо \u003Ccode>/api/\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>curl -4 http://127.0.0.1/\ncurl -6 http://[::1]/\ncurl -4 http://127.0.0.1/api/\ncurl -6 http://[::1]/api/\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Ответы, полученные по IPv4 и IPv6, должны совпадать.&nbsp;\u003C/p>\n\n\n\n\u003Cp>Адрес \u003Ccode>[::1]\u003C/code> – это локальная петля IPv6, аналог \u003Ccode>127.0.0.1\u003C/code>. Такая проверка подтверждает, что сокет создан и приложение отвечает по обоим протоколам, но не проверяет доступность сервера извне. Доступность по публичному адресу проверяется в разделе «Настройка DNS: AAAA-запись».\u003C/p>\n\n\n\n\u003Cp>Ниже приведен пример тестового сайта – гостевой книги, обслуживаемой Nginx. Приложение выводит IP-адрес, с которого осуществлялось подключение, а также протокол текущего подключения и используемый веб-сервер, а каждая запись помечается протоколом, по которому она была добавлена:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-image image-block\">\u003Cimg src=\"https://cp.beget.com/shared/SMqi6UXu3WsAWXjTT8cqSb41AN-BxdzX/image3-1.png\" alt=\"пример Nginx\">\u003C/div>\n\n\n\n\u003Cp>Записи, добавленные по IPv4 и IPv6, попадают в один общий список – это один и тот же сайт, доступный по двум протоколам.\u003C/p>\n\n\n\n\u003Ch2 id=\"nastroyka-apache\">Настройка Apache\u003C/h2>\n\n\n\n\u003Cp>В Ubuntu и Debian пакет Apache собран с поддержкой IPv4-mapped адресов: директива \u003Ccode>Listen 80\u003C/code> без указания конкретного адреса создает сокет, принимающий подключения по обоим протоколам. Проверьте, собран ли Apache таким образом:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>sudo apache2ctl -V | grep APR\nServer loaded:  APR 1.7.2, APR-UTIL 1.6.3, PCRE 10.42 2022-12-11\nCompiled using: APR 1.7.2, APR-UTIL 1.6.3, PCRE 10.42 2022-12-11\n -D APR_HAS_SENDFILE\n -D APR_HAS_MMAP\n -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Строка \u003Ccode>IPv4-mapped addresses enabled\u003C/code> означает, что поддержка IPv6 и IPv4 доступна. Она применяется только в том случае, если в конфигурации не указан конкретный адрес для прослушивания. Поэтому следующим шагом откройте файл \u003Ccode>ports.conf\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>sudo nano /etc/apache2/ports.conf\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Стандартное содержимое файла имеет следующий вид:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>Listen 80\n&lt;IfModule ssl_module&gt;\n\tListen 443\n&lt;/IfModule&gt;\n&lt;IfModule mod_gnutls.c&gt;\n\tListen 443\n&lt;/IfModule&gt;\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Адрес в директиве \u003Ccode>Listen\u003C/code> не указан, поэтому сокет уже принимает подключения по обоим протоколам – изменения не требуются. Убедитесь в этом:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>sudo ss -tlnp -6 | grep :80\nLISTEN 0      511                *:80              *:*    users:((\"apache2\",pid=45179,fd=4),(\"apache2\",pid=45178,fd=4),(\"apache2\",pid=45177,fd=4),(\"apache2\",pid=45176,fd=4),(\"apache2\",pid=45175,fd=4),(\"apache2\",pid=45173,fd=4))\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Адрес * означает, что сокет принимает подключения на всех адресах сервера. Это и есть сокет IPv6 с поддержкой IPv4-mapped адресов: он обслуживает оба протокола.\u003C/p>\n\n\n\n\u003Cp>Проверьте работу сайта и API по обоим протоколам, указав путь к своему API вместо /api/:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>curl -4 http://127.0.0.1/\ncurl -6 http://[::1]/\ncurl -4 http://127.0.0.1/api/\ncurl -6 http://[::1]/api/\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Ответы, полученные по IPv4 и IPv6, должны совпадать.&nbsp;\u003C/p>\n\n\n\n\u003Cp>Пример того же тестового сайта, обслуживаемого Apache:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-image image-block\">\u003Cimg src=\"https://cp.beget.com/shared/bjZQkZhWbhR0YMw9FYFuyI3LrIMIZTKJ/image2-1.png\" alt=\"пример Apache\">\u003C/div>\n\n\n\n\u003Ch3 id=\"esli-v-direktive-listen-ukazan-adres-ipv4\">Если в директиве Listen указан адрес IPv4\u003C/h3>\n\n\n\n\u003Cp>Если в файле \u003Ccode>ports.conf\u003C/code> адрес указан явно, сокет создается только для IPv4:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>Listen 0.0.0.0:80\n&lt;IfModule ssl_module&gt;\n\tListen 0.0.0.0:443\n&lt;/IfModule&gt;\n&lt;IfModule mod_gnutls.c&gt;\n\tListen 443\n&lt;/IfModule&gt;\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>В этом случае команда \u003Ccode>sudo ss -tlnp -6 | grep :80\u003C/code> вернет пустой результат. Добавьте директиву \u003Ccode>Listen [::]:80\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>Listen 0.0.0.0:80\nListen [::]:80\n&lt;IfModule ssl_module&gt;\n\tListen 0.0.0.0:443\n\tListen [::]:443\n&lt;/IfModule&gt;\n&lt;IfModule mod_gnutls.c&gt;\n\tListen 443\n&lt;/IfModule&gt;\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Обратите внимание, что директива \u003Ccode>Listen [::]:443\u003C/code> добавлена по тому же принципу: в блоке \u003Ccode>&lt;IfModule ssl_module&gt;\u003C/code> адрес указан явно, поэтому для IPv6 нужна отдельная строка. Если в вашем файле директива записана без адреса (\u003Ccode>Listen 443\u003C/code>), она уже принимает подключения по обоим протоколам, и добавлять ничего не нужно.\u003C/p>\n\n\n\n\u003Cp>Проверьте конфигурацию и перезапустите Apache:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>sudo apache2ctl configtest\nsudo systemctl restart apache2\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Убедитесь, что созданы сокеты для обоих протоколов:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>sudo ss -tlnp | grep :80\nLISTEN 0      511          0.0.0.0:80        0.0.0.0:*    users:((\"apache2\",pid=45179,fd=4))\nLISTEN 0      511             [::]:80           [::]:*    users:((\"apache2\",pid=45179,fd=6)\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>В отличие от конфигурации с директивой \u003Ccode>Listen 80\u003C/code>, здесь создаются два отдельных сокета – по одному на каждый протокол.\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-alert alert-block alert-block-info\">\u003Cdiv class=\"alert-block-title\">Обратите внимание!\u003C/div>\u003Cdiv class=\"alert-block-content\">Если при перезапуске появляется ошибка \u003Ccode>Address already in use\u003C/code>, значит в файле указана директива \u003Ccode>Listen 80\u003C/code> без адреса, и сокет уже принимает оба протокола. Удалите добавленную строку \u003Ccode>Listen [::]:80\u003C/code>.\u003C/div>\u003C/div>\n\n\n\n\u003Ch3 id=\"virtualnyy-host\">Виртуальный хост\u003C/h3>\n\n\n\n\u003Cp>Виртуальный хост изменять не требуется – конструкция \u003Ccode>&lt;VirtualHost *:80&gt;\u003C/code> подходит для обоих протоколов, а параметры \u003Ccode>DocumentRoot, Directory\u003C/code> и обработка API от протокола не зависят:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>&lt;VirtualHost *:80&gt;\n    ServerName example.ru\n    DocumentRoot /var/www/example\n&lt;/VirtualHost&gt;\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Изменения нужны только в том случае, если в виртуальном хосте указан конкретный адрес IPv4, например: \u003Ccode>&lt;VirtualHost 81.200.119.100:80&gt;\u003C/code> – в этом случае замените адрес на \u003Ccode>*\u003C/code> либо добавьте отдельный виртуальный хост с адресом IPv6.\u003C/p>\n\n\n\n\u003Ch2 id=\"nastroyka-svyazki-nginx-i-apache\">Настройка связки Nginx и Apache\u003C/h2>\n\n\n\n\u003Cp>В этой схеме Nginx принимает внешние подключения и отдает статические файлы, а Apache слушает только адрес \u003Ccode>127.0.0.1\u003C/code> и обрабатывает динамические запросы. Файл \u003Ccode>/etc/apache2/sites-available/example.conf\u003C/code> имеет примерно следующий вид:&nbsp;\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>&lt;VirtualHost 127.0.0.1:8080&gt;\n    ServerName example.ru\n    DocumentRoot /var/www/example/api\n&lt;/VirtualHost&gt;\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Поскольку Apache не принимает подключения извне, настраивать IPv6 требуется только в Nginx. Конфигурацию Apache изменять не обязательно.\u003C/p>\n\n\n\n\u003Cp>Откройте конфигурационный файл сайта:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>sudo nano /etc/nginx/sites-available/example.conf\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Добавьте строку \u003Ccode>listen [::]:80;\u003C/code> в блок \u003Ccode>server\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>server {\n    listen 80;\n    listen [::]:80;\n    server_name example.ru;\n    root /var/www/example/public;\n    index index.html;\n    location /api/ {\n        proxy_pass http://127.0.0.1:8080/;\n        proxy_set_header Host $host;\n        proxy_set_header X-Forwarded-For $remote_addr;\n    }\n}\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Если на сайте установлен SSL-сертификат, добавьте строку \u003Ccode>listen [::]:443 ssl\u003C/code>; в блок, отвечающий за 443 порт. Защищенные соединения принимает Nginx, конфигурацию Apache это не затрагивает.&nbsp;\u003C/p>\n\n\n\n\u003Cp>Проверьте конфигурацию и перезапустите Nginx:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>sudo nginx -t\nsudo systemctl restart nginx\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Проверьте, что порты распределены корректно:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>sudo ss -tlnp | grep -E ':80|:8080'\nLISTEN 0      511        127.0.0.1:8080      0.0.0.0:*    users:((\"apache2\",pid=45340,fd=3),(\"apache2\",pid=45339,fd=3),(\"apache2\",pid=45338,fd=3),(\"apache2\",pid=45337,fd=3),(\"apache2\",pid=45336,fd=3),(\"apache2\",pid=45334,fd=3))\nLISTEN 0      511          0.0.0.0:80        0.0.0.0:*    users:((\"nginx\",pid=45392,fd=5),(\"nginx\",pid=45391,fd=5))\nLISTEN 0      511             [::]:80           [::]:*    users:((\"nginx\",pid=45392,fd=6),(\"nginx\",pid=45391,fd=6))\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Nginx слушает оба протокола, Apache остается только на \u003Ccode>127.0.0.1\u003C/code>.\u003C/p>\n\n\n\n\u003Cp>Проверьте работу сайта и API по обоим протоколам, указав путь к своему API вместо \u003Ccode>/api/\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>curl -4 http://127.0.0.1/\ncurl -6 http://[::1]/\ncurl -4 http://127.0.0.1/api/\ncurl -6 http://[::1]/api/\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Ответы, полученные по IPv4 и IPv6, должны совпадать.&nbsp;\u003C/p>\n\n\n\n\u003Cp>Пример того же тестового сайта, обслуживаемого связкой Nginx и Apache:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-image image-block\">\u003Cimg src=\"https://cp.beget.com/shared/MBpDLSA1GmH8fyVZmxlG2kgzUSCzEj6M/image1-1.png\" alt=\"пример Nginx и Apache\">\u003C/div>\n\n\n\n\u003Ch3 id=\"nastroyka-soedineniya-nginx-i-apache-po-ipv6\">Настройка соединения Nginx и Apache по IPv6\u003C/h3>\n\n\n\n\u003Cp>Этот шаг необязательный. Связка работает и в текущем виде: посетители подключаются к Nginx по обоим протоколам, а до Apache запрос доходит по локальному адресу IPv4.\u003C/p>\n\n\n\n\u003Cp>Если внутренний обмен тоже нужно перевести на IPv6, меняются три файла:&nbsp;&nbsp;\u003C/p>\n\n\n\n\u003Cul>\u003Cli>адрес прослушивания в файле \u003Ccode>/etc/apache2/ports.conf\u003C/code>:\u003C/li>\u003C/ul>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>Listen [::1]:8080\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cul>\u003Cli>адрес в виртуальном хосте Apache, файл \u003Ccode>/etc/apache2/sites-available/example.conf\u003C/code>:\u003C/li>\u003C/ul>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>&lt;VirtualHost [::1]:8080&gt;\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cul>\u003Cli>адрес в директиве Nginx, файл \u003Ccode>/etc/nginx/sites-available/example.conf\u003C/code>:\u003C/li>\u003C/ul>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>proxy_pass http://[::1]:8080/;\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Перезапустите обе службы и проверьте результат – он не должен измениться:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>sudo apache2ctl configtest &amp;&amp; sudo systemctl restart apache2\nsudo nginx -t &amp;&amp; sudo systemctl restart nginx\nsudo ss -tlnp | grep -E ':80|:8080'\ncurl -6 http://[::1]/api/\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-alert alert-block alert-block-info\">\u003Cdiv class=\"alert-block-title\">Обратите внимание!\u003C/div>\u003Cdiv class=\"alert-block-content\">Убедитесь, что прежняя директива \u003Ccode>Listen 127.0.0.1:8080\u003C/code> удалена, а не оставлена рядом с новой. Иначе Apache не запустится из-за ошибки \u003Ccode>Address already in use\u003C/code>.\u003C/div>\u003C/div>\n\n\n\n\u003Ch3 id=\"peredacha-ip-posetitelya-v-prilozhenie\">Передача IP посетителя в приложение\u003C/h3>\n\n\n\n\u003Cp>В связке Nginx и Apache запрос доходит до приложения через Nginx. Поэтому в переменных \u003Ccode>$_SERVER['REMOTE_ADDR']\u003C/code> и \u003Ccode>$_SERVER['SERVER_ADDR']\u003C/code> оказывается локальный адрес – \u003Ccode>127.0.0.1\u003C/code> или \u003Ccode>::1\u003C/code>, если внутренний обмен переведен на IPv6. Они описывают соединение между Nginx и Apache, а не подключение посетителя, поэтому ни его адрес, ни протокол по ним определить нельзя.\u003C/p>\n\n\n\n\u003Cp>Адрес посетителя можно передать заголовком \u003Ccode>X-Forwarded-For\u003C/code>. Дополните блок \u003Ccode>location\u003C/code> в файле \u003Ccode>/etc/nginx/sites-available/example.conf\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>location /api/ {\n    proxy_pass http://127.0.0.1:8080/;\n    proxy_set_header Host $host;\n    proxy_set_header X-Forwarded-For $remote_addr;\n    proxy_set_header X-Forwarded-Proto $scheme;\n}\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Проверьте конфигурацию и перезапустите Nginx:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>sudo nginx -t\nsudo systemctl restart nginx\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>\u003Ccode>$remote_addr\u003C/code> содержит IP непосредственного клиента Nginx. Если Nginx принимает соединение напрямую от посетителя, в \u003Ccode>X-Forwarded-For\u003C/code> попадет его IPv4-адрес или IPv6-адрес.\u003C/p>\n\n\n\n\u003Cp>Многие приложения и фреймворки умеют работать с \u003Ccode>X-Forwarded-For\u003C/code>. Если приложению нужно различать IPv4 и IPv6, оно определяет версию по адресу из этого заголовка.\u003C/p>\n\n\n\n\u003Cp>Заголовок \u003Ccode>X-Forwarded-For\u003C/code> можно использовать и в логах Apache. Например:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>LogFormat \"%{X-Forwarded-For}i %l %u %t \\\"%r\\\" %&gt;s %b\" proxy\nCustomLog /var/log/apache2/access.log proxy\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>В таком формате Apache записывает IP посетителя из \u003Ccode>X-Forwarded-For\u003C/code>, а не адрес Nginx, через который пришел запрос.\u003C/p>\n\n\n\n\u003Cp>\u003Ccode>X-Forwarded-Proto\u003C/code> передает схему исходного запроса – \u003Ccode>http\u003C/code> или \u003Ccode>https\u003C/code>. Он нужен, например, когда HTTPS завершается на Nginx, а до Apache запрос передается по HTTP.\u003C/p>\n\n\n\n\u003Ch2 id=\"nastroyka-dns-aaaa-zapis\">Настройка DNS: AAAA-запись\u003C/h2>\n\n\n\n\u003Cp>Пока AAAA-запись не добавлена, сайт остается доступным только по IPv4 – это позволяет проверить настройки, не затрагивая текущих посетителей.\u003C/p>\n\n\n\n\u003Cp>Проверьте доступность сайта напрямую по адресам сервера, подставив свои значения:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>curl -4 http://&lt;IPv4-адрес сервера&gt;/\ncurl -6 http://[&lt;IPv6-адрес сервера&gt;]/\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Если на сайте есть API, проверьте и его, указав свой путь:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>curl -4 http://&lt;IPv4-адрес сервера&gt;/api/\ncurl -6 http://[&lt;IPv6-адрес сервера&gt;]/api/\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Команды должны вернуть одинаковый результат для обоих протоколов.\u003C/p>\n\n\n\n\u003Cp>После успешной проверки добавьте AAAA-запись в панели управления DNS-зоной сайта, в качестве значения укажите адрес IPv6 сервера – тот, который отображается в выводе команды \u003Ccode>ip -6 addr show\u003C/code> с пометкой \u003Ccode>scope global\u003C/code>.\u003C/p>\n\n\n\n\u003Cp>Запись A удалять не нужно – наличие обеих записей и есть dual stack.\u003C/p>\n\n\n\n\u003Cp>Проверьте, что записи отдаются:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>dig A example.ru +short\ndig AAAA example.ru +short\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"kak-klient-vybiraet-protokol\">Как клиент выбирает протокол\u003C/h3>\n\n\n\n\u003Cp>После публикации AAAA-записи выбор протокола происходит на стороне клиента. Получив от DNS оба адреса, браузер или приложение пробует установить соединение по обоим – с небольшим приоритетом в пользу IPv6 – и использует то, которое установилось быстрее. Если соединение по IPv6 не устанавливается, клиент переключается на IPv4. Этот механизм называется \u003Cstrong>Happy Eyeballs\u003C/strong> и не требует настройки ни на сайте, ни в API.\u003C/p>\n\n\n\n\u003Cp>Проверьте, какой протокол выбирается, командой без указания версии протокола:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>curl -v http://example.ru/ 2&gt;&amp;1 | grep \"Connected to\"\n* Connected to example.ru (2001:db8:1a2b:3c4d::1) port 80\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Механизм \u003Cstrong>Happy Eyeballs\u003C/strong> поддерживают браузеры и большинство современных библиотек, но не все клиенты. Программы, использующие простое последовательное подключение, при неисправном IPv6 будут ожидать истечения тайм-аута. Поэтому перед добавлением AAAA-записи важно убедиться, что сайт по IPv6 действительно отвечает.\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-alert alert-block alert-block-info\">\u003Cdiv class=\"alert-block-title\">Обратите внимание!\u003C/div>\u003Cdiv class=\"alert-block-content\">Если при проверке в браузере сайт открывается по IPv4, это может быть связано с отсутствием поддержки IPv6 у вашего интернет-провайдера. Проверить поддержку можно, например, на сайте \u003Ca href=\"https://test-ipv6.com\">test-ipv6.com\u003C/a>.\u003C/div>\u003C/div>\n\n\n\n\u003Ch2 id=\"chastye-voprosy\">Частые вопросы\u003C/h2>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>По IPv6 сайт открывается по HTTP, но не по HTTPS\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>В блок \u003Ccode>server\u003C/code>, отвечающий за 443 порт, не добавлена строка \u003Ccode>listen [::]:443 ssl;\u003C/code>. По IPv4 при этом работают оба протокола.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>Apache не принимает подключения по IPv6, хотя в выводе apache2ctl -V есть строка IPv4-mapped addresses enabled\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>В файле \u003Ccode>ports.conf\u003C/code> адрес указан явно: \u003Ccode>Listen 0.0.0.0:80\u003C/code>. В этом случае сокет создается только для IPv4, требуется добавить директиву \u003Ccode>Listen [::]:80\u003C/code>.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>Apache не запускается после изменения ports.conf\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>Ошибка \u003Ccode>Address already in use\u003C/code> означает обратную ситуацию: директива \u003Ccode>Listen 80\u003C/code> без адреса уже создала сокет для обоих протоколов, и добавленная строка \u003Ccode>Listen [::]:80\u003C/code> дублирует его. Оставьте только \u003Ccode>Listen 80\u003C/code>.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>Команда ss -tlnp -4 не показывает Apache на 80-м порту\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>Если в \u003Ccode>ports.conf\u003C/code> указана директива \u003Ccode>Listen 80\u003C/code> без адреса, создается один сокет IPv6, принимающий подключения и по IPv4. Отсутствие отдельного сокета IPv4 в этом случае не является ошибкой.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>Изменения в конфигурации не применились\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>При изменении директив \u003Ccode>listen\u003C/code> используйте \u003Ccode>restart\u003C/code> вместо \u003Ccode>reload\u003C/code> – перезагрузка конфигурации не всегда пересоздает сетевые сокеты.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>AAAA-запись добавлена, но сайт по IPv6 недоступен\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>Проверьте, что AAAA-запись для домена уже отдается. Также убедитесь, что указанный в записи адрес назначен на сетевом интерфейсе сервера – проверьте вывод команды \u003Ccode>ip -6 addr show\u003C/code>. \u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>В логах приложения отображается адрес 127.0.0.1\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>При использовании обратного прокси не настроена передача заголовка \u003Ccode>X-Forwarded-For\u003C/code> в конфигурации Nginx.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>После подключения IPv6 служба стала доступна из интернета, хотя была закрыта файрволом\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>Фильтрация для IPv4 и IPv6 настраивается отдельно, и правила для IPv4 на подключения по IPv6 не действуют. Настройте для IPv6 такие же ограничения, как для IPv4.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>Часть посетителей жалуется на медленное открытие сайта после добавления AAAA-записи\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>Проверьте доступность сервера по IPv6 с внешнего устройства. Если IPv6 отвечает не всегда, клиенты без поддержки \u003Cstrong>Happy Eyeballs\u003C/strong> ожидают истечения тайм-аута перед переключением на IPv4. До устранения причины AAAA-запись можно временно удалить.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>Сайт был недоступен несколько секунд во время настройки\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>Команда \u003Ccode>restart\u003C/code> останавливает и запускает веб-сервер заново, и в этот момент соединения не обслуживаются. Выполняйте перезапуск только после успешной проверки конфигурации.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cp>Если возникнут вопросы, напишите нам, пожалуйста, тикет из панели управления аккаунта (раздел “\u003Ca href=\"https://cp.beget.com/support?utm_source=kb&amp;utm_medium=article&amp;utm_campaign=ipv6_dual_stack&amp;utm_content=cp_support\">Помощь и поддержка\u003C/a>”), а если вы захотите обсудить возможность подключения IPv4 или IPv6 с коллегами по цеху и сотрудниками Beget – ждем вас в нашем\u003Ca href=\"https://t.me/beget_chat\"> сообществе\u003C/a> в Telegram.\u003C/p>\n",68,"2026-09-23T11:22:17.000Z","2026-09-23T17:06:18.000Z",{"count":16,"liked":17},0,false,{"route":19,"title":21,"tags":22,"breadcrumbs":55,"uuid":56,"parent_uuid":57,"default_page_path":26,"seo_metadata":58},{"language":6,"path":20},"/kb/how-to/vps","VPS",[23,27,31,35,39,43,47,51],{"id":24,"title":21,"seo_metadata":25},"vps",{"title":26,"description":26,"header":26,"keywords":26},"",{"id":28,"title":29,"seo_metadata":30},"apache","Apache",{"title":26,"description":26,"header":26,"keywords":26},{"id":32,"title":33,"seo_metadata":34},"lets-encrypt","Let's Encrypt",{"title":26,"description":26,"header":26,"keywords":26},{"id":36,"title":37,"seo_metadata":38},"nginx","Nginx",{"title":26,"description":26,"header":26,"keywords":26},{"id":40,"title":41,"seo_metadata":42},"ssl","SSL",{"title":26,"description":26,"header":26,"keywords":26},{"id":44,"title":45,"seo_metadata":46},"vestacp","VestaCP",{"title":26,"description":26,"header":26,"keywords":26},{"id":48,"title":49,"seo_metadata":50},"perenos-sajta","Перенос сайта",{"title":26,"description":26,"header":26,"keywords":26},{"id":52,"title":53,"seo_metadata":54},"terminal","Терминал",{"title":26,"description":26,"header":26,"keywords":26},[],"957abe7d-4a90-1475-bfb0-6439507ed391","fa9a1354-631a-4206-df34-291f0db8f42a",{"title":59,"description":60,"header":61,"keywords":62},"VPS. Полезные статьи – Beget","Полезные статьи о VPS на сайте Beget","VPS. Полезные статьи","vps, вопрос ответ",{"src":26,"text":26},{"title":65,"description":66,"keywords":67},"Подключение IPv6 к сайту и API","Рассказываем, как настроить подключение к сайту и API по IPv6, без потери подключения по IPv4 | Dual stack без риска для текущих пользователей","Настройка подключения по протоколу IPv6, доступ к сайту и апи для IPv6 и IPv4",{"faq":69,"how_to":70,"product":70},[],null,{},[73,77,80,83,86,89,93,96,99,102,105,108,111],{"level":74,"name":75,"anchor":76},1,"Что такое IPv6 и dual stack","chto-takoe-ipv6-i-dual-stack",{"level":74,"name":78,"anchor":79},"Проверка доступности IPv6 на сервере","proverka-dostupnosti-ipv6-na-servere",{"level":74,"name":81,"anchor":82},"Приоритет IPv6 и IPv4 для исходящих соединений","prioritet-ipv6-i-ipv4-dlya-ishodyashchih-soedineniy",{"level":74,"name":84,"anchor":85},"Настройка Nginx","nastroyka-nginx",{"level":74,"name":87,"anchor":88},"Настройка Apache","nastroyka-apache",{"level":90,"name":91,"anchor":92},2,"Если в директиве Listen указан адрес IPv4","esli-v-direktive-listen-ukazan-adres-ipv4",{"level":90,"name":94,"anchor":95},"Виртуальный хост","virtualnyy-host",{"level":74,"name":97,"anchor":98},"Настройка связки Nginx и Apache","nastroyka-svyazki-nginx-i-apache",{"level":90,"name":100,"anchor":101},"Настройка соединения Nginx и Apache по IPv6","nastroyka-soedineniya-nginx-i-apache-po-ipv6",{"level":90,"name":103,"anchor":104},"Передача IP посетителя в приложение","peredacha-ip-posetitelya-v-prilozhenie",{"level":74,"name":106,"anchor":107},"Настройка DNS: AAAA-запись","nastroyka-dns-aaaa-zapis",{"level":90,"name":109,"anchor":110},"Как клиент выбирает протокол","kak-klient-vybiraet-protokol",{"level":74,"name":112,"anchor":113},"Частые вопросы","chastye-voprosy",[],[116,120],{"route":117,"title":119},{"language":6,"path":118},"/kb/how-to","Полезные статьи",{"route":121,"title":21},{"language":6,"path":20},[123,125,127],{"src":124},"https://cp.beget.com/shared/SMqi6UXu3WsAWXjTT8cqSb41AN-BxdzX/image3-1.png",{"src":126},"https://cp.beget.com/shared/bjZQkZhWbhR0YMw9FYFuyI3LrIMIZTKJ/image2-1.png",{"src":128},"https://cp.beget.com/shared/MBpDLSA1GmH8fyVZmxlG2kgzUSCzEj6M/image1-1.png",[],[131,140,149],{"route":132,"uuid":134,"title":135,"excerpt":26,"content":26,"view_count":16,"published_at":26,"modified_at":26,"like":70,"category":70,"hero_image":70,"seo_metadata":70,"schema_org_metadata":70,"open_graph_metadata":70,"sections":136,"tags":137,"breadcrumbs":138,"images":139},{"language":6,"path":133},"/kb/how-to/vps/simvolicheskie-ssylki-kak-sozdat-i-rabotat","94078842-b665-208c-9277-c4c9ba0c7b54","Символические ссылки: как создать и работать в Linux",[],[],[],[],{"route":141,"uuid":143,"title":144,"excerpt":26,"content":26,"view_count":16,"published_at":26,"modified_at":26,"like":70,"category":70,"hero_image":70,"seo_metadata":70,"schema_org_metadata":70,"open_graph_metadata":70,"sections":145,"tags":146,"breadcrumbs":147,"images":148},{"language":6,"path":142},"/kb/how-to/vps/video-terraria-ustanovka-i-nastrojka-servera","c2fd7014-d182-b794-e687-6448e33439fe","Видео: Terraria установка и настройка собственного игрового сервера",[],[],[],[],{"route":150,"uuid":152,"title":153,"excerpt":26,"content":26,"view_count":16,"published_at":26,"modified_at":26,"like":70,"category":70,"hero_image":70,"seo_metadata":70,"schema_org_metadata":70,"open_graph_metadata":70,"sections":154,"tags":155,"breadcrumbs":156,"images":157},{"language":6,"path":151},"/kb/how-to/vps/migracziya-bazy-dannyh-opencart-s-virtualnogo-hostinga-v-oblako","b9922b5e-08a6-5013-70d2-dc0511ab9bc0","Миграция базы данных Opencart с виртуального хостинга в облако",[],[],[],[],"popularity-desc"]