Cloudflare выдаёт ошибку 522 после переноса сайта на VPS
После переноса сайта на новый VPS Cloudflare может вместо страницы показать Error 522: Connection timed out. Владелец сервера при этом спокойно заходит по SSH, видит запущенный Nginx и делает естественный вывод: VPS работает, значит проблема где-то в Cloudflare. Но доступный SSH подтверждает только работу порта 22. Он ничего не говорит о том, может ли Cloudflare установить соединение с веб-сервером по HTTP или HTTPS.

Ошибка 522 возникает на участке между Cloudflare и origin-сервером. После миграции причин здесь хватает: в DNS остался старый IP, забыта AAAA-запись, порт 443 закрыт firewall, Nginx слушает только локальный интерфейс, Fail2ban режет адреса Cloudflare или новый VPS перестал нормально принимать новые TCP-соединения.
Поэтому менять подряд SSL Mode, очищать кеш Cloudflare и перезапускать WordPress почти бесполезно. Диагностика должна идти по цепочке: DNS → прямой доступ к origin → порты → firewall → Nginx/Apache → логи → ресурсы и TCP-соединения VPS. На каждом этапе нужен проверяемый результат. Не угадали причину, а подтвердили её.
Ниже разберём именно такой сценарий: сайт уже перенесли на новый VPS, DNS переключили, а Cloudflare отвечает 522.
Что означает ошибка Cloudflare 522 после переноса сайта на VPS
Cloudflare 522 означает timeout на участке Cloudflare → origin-сервер. Cloudflare не удаётся вовремя завершить соединение с VPS: проблема может возникать уже при установлении TCP-соединения или после его установления, когда origin не продолжает обмен данными так, как ожидается.
При включённом проксировании браузер посетителя соединяется не напрямую с вашим VPS. Сначала запрос принимает edge-сервер Cloudflare, а затем Cloudflare открывает отдельное соединение с origin. Если новый VPS не отвечает на попытку подключения, firewall молча отбрасывает пакеты или сервер под нагрузкой перестал нормально принимать новые соединения, посетитель видит 522.
При 522 сначала проверяется origin. WordPress, плагины, тема и база данных находятся дальше по цепочке. Если TCP-соединение до Nginx ещё не установилось, запрос до PHP вообще не дошёл.
Обычно здесь и возникает путаница: SSH работает, панель VPS открывается, systemctl status nginx показывает active (running), а сайт через Cloudflare всё равно недоступен. Все эти факты могут быть правдой одновременно. Nginx способен слушать только localhost, 443 может фильтроваться внешним firewall, а Cloudflare вообще может обращаться к старому origin.
| Симптом | Что уже можно предположить | Что проверять дальше |
|---|---|---|
| 522 постоянно сразу после переноса | Новый origin недоступен или указан неверно | Origin IP, A/AAAA, 80/443, firewall, Nginx/Apache |
| SSH работает, сайт нет | VPS доступен по TCP/22, но HTTP/HTTPS ещё не проверены | LISTEN и внешний доступ к 80/443 |
| Origin напрямую работает, через Cloudflare 522 | Проблема проявляется на пути Cloudflare → VPS | Firewall, Fail2ban, ACL, Cloudflare IP ranges |
| 522 появляется только периодически | Origin способен отвечать, но иногда перестаёт принимать или обслуживать соединения | CPU, RAM, I/O, workers, backlog, conntrack, сеть |
Если origin не открывается напрямую, Cloudflare пока можно убрать из списка подозреваемых. Если тот же origin стабильно отвечает напрямую, но 522 появляется только с Proxy ON, круг поиска уже значительно уже.
На какой IP Cloudflare сейчас отправляет запросы сайта
Сайт уже перенесли, в панели нового VPS всё выглядит нормально, но 522 появился сразу после переключения DNS. Первым делом откройте Cloudflare → DNS → Records и проверьте содержимое A и AAAA именно там.
Для записи со статусом Proxied публичный DNS-ответ не показывает реальный origin IP. Клиент получает адреса Cloudflare. Поэтому результат обычного dig example.com A нельзя сравнивать с IP VPS и делать вывод, что Cloudflare обращается именно туда.
Публичные DNS-запросы всё равно полезны:
dig example.com A
dig example.com AAAA
dig www.example.com A
dig www.example.com AAAA
Они показывают, как домен видит обычный DNS-клиент, позволяют проверить наличие IPv4/IPv6 на публичной стороне Cloudflare и обнаружить неожиданные записи для www. Но origin для проксируемой записи смотрите в панели Cloudflare.
Proxy status = Proxied: реальный A/AAAA origin проверяем в Cloudflare DNS dashboard. Proxy status = DNS only: публичный DNS уже должен указывать непосредственно на origin или на CNAME-цепочку, которая к нему приводит.
В Windows вместо dig можно использовать:
nslookup example.com
nslookup www.example.com
Отдельно стоит проверить, кто вообще обслуживает DNS-зону:
dig +short NS example.com
Если домен делегирован на nameserver Cloudflare, изменение A-записи в старой DNS-панели регистратора ничего не даст. Рабочая зона находится в Cloudflare.
| Hostname | Тип | Что проверяем в Cloudflare | Типичная ошибка после миграции |
|---|---|---|---|
| example.com | A | IPv4 нового VPS | Остался IPv4 старого сервера |
| www.example.com | A или CNAME | Новый VPS или корректная ссылка на основной hostname | www остался на старой инфраструктуре |
| example.com | AAAA | Реальный рабочий IPv6 origin, если он используется | В записи остался старый IPv6 |
| www.example.com | AAAA | Рабочий IPv6 либо отсутствие ненужной записи | IPv4 перенесли, IPv6 забыли |
Здесь нужен конкретный результат: вы знаете реальный IPv4 и, если используется, IPv6 origin для каждого проксируемого hostname. Не адреса Cloudflare из публичного dig, а именно адрес сервера, к которому Cloudflare должен подключаться.
Почему старая AAAA-запись может давать 522, даже если A-запись правильная
При миграции нужно отдельно проверить IPv6 origin. Корректный A-record не исправит ситуацию, если в Cloudflare осталась AAAA-запись со старым или недоступным IPv6.
Есть три разных IPv6-участка, которые легко перепутать:
- IPv6 между компьютером посетителя и Cloudflare;
- IPv6-адреса edge-инфраструктуры Cloudflare, которые видны в публичном DNS;
- IPv6 вашего origin VPS, сохранённый в DNS-записи Cloudflare.
Для Proxied-записи команда:
curl -6 -I https://example.com/
проверяет соединение вашего компьютера с Cloudflare по IPv6. Она не доказывает, что Cloudflare может подключиться по IPv6 к новому VPS. Аналогично публичный dig example.com AAAA при включённом proxy показывает Cloudflare, а не скрытый origin.
Сначала посмотрите значение AAAA в Cloudflare → DNS → Records. Затем на VPS убедитесь, что такой IPv6 действительно назначен:
ip -6 addr
ip -6 route
Если origin должен обслуживать IPv6, проверьте его напрямую с машины, у которой есть рабочий IPv6-доступ. Для HTTPS можно сохранить hostname и SNI через --resolve:
curl -6 --resolve example.com:443:[ORIGIN_IPV6] https://example.com/ -I
Где ORIGIN_IPV6 — реальный IPv6 нового VPS из Cloudflare DNS dashboard, например:
curl -6 --resolve example.com:443:[2001:db8::10] https://example.com/ -I
Дополнительно проверьте, слушает ли веб-сервер IPv6:
ss -lntp | grep -E ':80|:443'
В Nginx при реальной необходимости IPv6 обычно присутствуют соответствующие IPv6-listen директивы. Но не меняйте конфигурацию вслепую: в некоторых архитектурах IPv6 вообще не используется для origin, и это нормально.
Если новый VPS не имеет рабочего IPv6, а в Cloudflare сохранилась старая AAAA origin-запись, правильнее удалить или исправить именно её. Не оставляйте неработающий IPv6 «на всякий случай» и не используйте успешный curl -6 к проксируемому домену как доказательство исправности origin.
Ситуация должна свестись к одному из двух вариантов: AAAA в Cloudflare указывает на проверенный IPv6 нового VPS либо AAAA отсутствует, потому что origin работает только по IPv4.
Как за две минуты проверить новый VPS без Cloudflare
Самый полезный тест при 522 — обратиться к новому origin напрямую, сохранив правильное имя сайта. Он показывает, способен ли VPS обслужить домен без участия Cloudflare.
Обычный запрос по IP даёт только базовую информацию:
curl -I http://SERVER_IP
Если сервер отвечает, это лучше, чем timeout, но тест неполный. На одном IP может находиться несколько сайтов, а Nginx и Apache выбирают virtual host по имени домена. Запрос к голому IP способен открыть заглушку, default site или другой проект.
Проверка origin через curl с Host
Заголовок Host позволяет обратиться по IP нового VPS, но попросить веб-сервер обслужить конкретный домен.
curl -I -H "Host: example.com" http://SERVER_IP
Нормальный результат — HTTP-ответ от нужного virtual host. Это может быть 200, 301 или 302. Сам код зависит от конфигурации сайта. Главное, чтобы соединение не зависало и ответ приходил именно от нового сервера.
Если вместо сайта появляется стандартная страница Nginx или заглушка панели, сеть уже работает, но virtual host настроен неправильно. Это хороший симптом: искать нужно выше TCP-уровня.
Проверка HTTPS через curl --resolve
Для HTTPS удобнее использовать curl --resolve: команда подменяет IP только для конкретного запроса, сохраняя hostname для TLS и virtual host.
curl --resolve example.com:443:SERVER_IP https://example.com/ -I
Так можно проверить новый сервер ещё до изменения публичного DNS. Если команда получает нормальный ответ, новый origin умеет обслуживать HTTPS для указанного домена. Если соединение зависает или отклоняется, причина находится на VPS, в сети или firewall.
Для более подробного вывода:
curl -v --resolve example.com:443:SERVER_IP https://example.com/
Ещё один вариант — временная запись в локальном файле hosts:
SERVER_IP example.com
SERVER_IP www.example.com
После этого браузер на вашем компьютере будет обращаться к новому VPS для указанных доменов, не дожидаясь изменений публичного DNS. Такой тест особенно удобен во время миграции.
Если curl --resolve стабильно получает страницу с нового VPS, origin уже прошёл одну из главных проверок. Если команда не соединяется, SSL Mode и кеш Cloudflare пока не трогаем. Здесь Cloudflare ещё не главный подозреваемый.
Открыты ли на новом VPS порты 80 и 443
SSH есть. Nginx active. В браузере всё равно 522. В такой ситуации смотрим, кто на самом деле слушает 80 и 443 и можно ли подключиться к этим портам из Интернета.
На самом VPS проверьте LISTEN:
ss -lntp | grep -E ':80|:443'
Пример:
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
Сервис слушает IPv4-интерфейсы. А строка:
LISTEN 0 511 127.0.0.1:443 0.0.0.0:*
означает, что этот конкретный сокет доступен только локально. Cloudflare напрямую к 127.0.0.1 подключиться не сможет.
LISTEN есть, но доступен ли порт извне
Проверку внешней доступности нельзя делать только с самого VPS. Локальный curl подтверждает работу сервиса внутри машины, но не проверяет firewall провайдера, security group и внешний маршрут.
Запустите тест с рабочего компьютера, другого VPS или любой машины вне проверяемого сервера:
nc -vz SERVER_IP 80
nc -vz SERVER_IP 443
Либо сразу HTTP/HTTPS-тест:
curl -I -H "Host: example.com" http://SERVER_IP
curl --resolve example.com:443:SERVER_IP https://example.com/ -I
Если ss показывает LISTEN, локальный запрос с VPS работает, а внешний nc или curl получает timeout, конфигурацию PHP пока можно не трогать. Ищите фильтрацию между Интернетом и сокетом веб-сервера.
Внутри Linux проверьте используемый firewall.
UFW:
ufw status
firewalld:
firewall-cmd --list-all
nftables:
nft list ruleset
iptables:
iptables -L -n -v
И не забудьте о внешнем firewall в панели VPS-провайдера. Такая схема встречается регулярно: Nginx слушает 0.0.0.0:443, UFW разрешает HTTPS, локальный curl проходит, а внешний security group всё ещё разрешает только SSH.
| Что видно | Что это означает | Следующий шаг |
|---|---|---|
| Нет LISTEN на 80/443 | Веб-сервис не принимает соединения на нужном порту | Проверить Nginx/Apache и virtual host |
| LISTEN только на 127.0.0.1 | Сокет доступен только локально | Проверить bind/listen и архитектуру веб-стека |
| LISTEN есть, локальный curl работает, внешний timeout | Проблема находится между внешней сетью и веб-сервисом | Проверить UFW, nftables, security group, firewall провайдера |
| 80 работает, 443 нет | Проблема локализована на HTTPS-порту | Проверить 443, SSL virtual host и firewall |
| Внешний TCP проходит, но сайт отвечает неправильно | Сетевой вход работает | Проверить virtual host, TLS и upstream |
LISTEN есть. Внешнего доступа всё ещё может не быть. Для уверенного диагноза нужны оба подтверждения.
Не блокирует ли firewall IP-адреса Cloudflare
Если origin стабильно работает напрямую, а после включения Cloudflare Proxy снова появляется 522, проверяйте фильтрацию трафика от Cloudflare. Обычный клиент до VPS доходит, а edge Cloudflare — нет.
Причиной может быть не только UFW или nftables. После миграции встречаются старые правила iptables, Fail2ban, CSF/LFD, ACL, rate limiting в Nginx, защита панели и внешний firewall провайдера.
Проверьте Fail2ban:
fail2ban-client status
Для конкретного jail:
fail2ban-client status JAIL_NAME
Для nftables:
nft list ruleset
Для iptables особенно полезны счётчики:
iptables -L -n -v
Воспроизведите 522 и сразу снова посмотрите правила. Если счётчик DROP растёт в момент запроса, дальше гадать уже незачем: найден реальный участок фильтрации.
Не отключайте firewall целиком как постоянное решение. Найдите конкретное правило и разрешите актуальные сети Cloudflare на используемых HTTP/HTTPS-портах. Список сетей Cloudflare должен браться из актуальной официальной документации, а не из старой статьи или сохранённого конфигурационного файла.
Особенно внимательно проверьте правила, перенесённые со старого сервера. Например, 443 мог быть разрешён только старому reverse proxy или нескольким административным IP. С вашего компьютера direct-origin тест пройдёт, если ваш IP разрешён, а Cloudflare продолжит получать timeout.
Удобно выполнить три действия одновременно:
- Открыть сайт с включённым Cloudflare proxy и воспроизвести 522.
- Проверить тот же origin через
curl --resolve. - Смотреть счётчики firewall, access.log и сетевые пакеты.
Direct origin работает, а Cloudflare не появляется даже на сетевом уровне — ищем ACL, firewall или маршрут. Запросы Cloudflare доходят до Nginx — поднимаемся выше по стеку.
Слушает ли Nginx или Apache правильный IP и виртуальный хост
Открытого TCP-порта недостаточно: Nginx или Apache должен принять запрос именно для нужного hostname. После миграции virtual host может быть не активирован, server_name указан неверно или HTTPS-конфигурация не загружена.
Для Nginx начните с:
nginx -t
Если синтаксис корректен, посмотрите фактически загруженную конфигурацию:
nginx -T
В блоке нужного сайта проверьте:
server_name example.com www.example.com;listen 80;, если используется HTTP;listen 443 ssl;для HTTPS;- путь к сертификату;
- upstream или FastCGI-настройки, если запрос передаётся дальше.
Для Apache:
apachectl configtest
Состояние сервисов:
systemctl status nginx
systemctl status apache2
systemctl status httpd
Название Apache-службы зависит от дистрибутива, поэтому одна из последних двух команд может отсутствовать.
Характерный сценарий после переноса: по IP открывается стандартная страница Nginx или заглушка панели. TCP уже работает. HTTP тоже. Но конкретный сайт ещё не попадает в свой virtual host.
Проверка:
curl -I -H "Host: example.com" http://SERVER_IP
Если приходит другой сайт, ищите конфликт server_name, default server или неправильную привязку домена в панели.
В связке Nginx + Apache нужно учитывать архитектуру. Nginx может слушать внешние 80/443, а Apache — только 127.0.0.1:8080. Это нормально: внешний запрос принимает Nginx и уже локально передаёт его Apache.
Не исправляйте любой 127.0.0.1 только потому, что увидели localhost. Внешний LISTEN нужен фронтовому сервису. Внутренний Apache, PHP-FPM или приложение вполне могут работать через localhost или Unix socket.
После изменения конфигурации снова выполните nginx -t или apachectl configtest, перечитайте конфигурацию штатным способом и повторите curl --resolve. Получили нужный virtual host — идём дальше.
Как по логам понять, доходит ли запрос Cloudflare до VPS
Access/error logs и tcpdump позволяют отделить сетевой 522 от проблемы внутри веб-стека. Смысл проверки простой: до какого именно слоя дошёл запрос.
Для Nginx откройте access.log и error.log:
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
Затем воспроизведите 522. Пути к логам зависят от дистрибутива, панели и конфигурации virtual host. В ISPmanager, FASTPANEL, cPanel или ручной конфигурации логи сайта могут находиться в другом каталоге.
Если access.log остаётся пустым
Пустой access.log означает, что полноценный HTTP-запрос до этого Nginx не дошёл. Это ещё не доказывает вину firewall, но WordPress и PHP здесь почти наверняка рано проверять. Запрос до них ещё не дошёл.
Посмотрите системный журнал:
journalctl -u nginx --since "10 minutes ago"
Для Apache:
journalctl -u apache2 --since "10 minutes ago"
journalctl -u httpd --since "10 minutes ago"
Теперь опустимся на уровень TCP:
tcpdump -nn 'tcp port 80 or tcp port 443'
Одного факта «пакеты есть» мало. Смотрите последовательность.
- SYN приходит на VPS, SYN-ACK уходит обратно. Сервер хотя бы отвечает на попытку установить TCP-соединение.
- SYN приходит много раз, но SYN-ACK от сервера не видно. Проверяйте локальный firewall, перегрузку сетевого стека и способность сервера принимать новые соединения.
- SYN-ACK уходит, но подтверждения от клиента нет, видны повторные передачи. Возможна проблема обратного маршрута или фильтрация где-то между сторонами.
- TCP handshake проходит, затем соединение зависает. Сетевой вход уже работает, нужно смотреть TLS, веб-сервер и дальнейшую обработку.
Это уже не «Cloudflare где-то не отвечает», а конкретная стадия соединения.
Если запрос появляется в access.log
Строка в access.log означает, что HTTP-запрос дошёл до веб-сервера. Теперь ищите проблему в Nginx/Apache, upstream, PHP-FPM, приложении или ресурсах VPS.
Смотрите HTTP-код, время ответа, upstream и error.log. Если Nginx регулярно перезапускается:
systemctl status nginx
journalctl -u nginx
| Наблюдение | Что оно говорит | Куда идти дальше |
|---|---|---|
| Нет пакетов в tcpdump | Соединение не доходит до VPS | Origin IP, внешний firewall, сеть, маршрут |
| SYN приходит, ответа VPS нет | Сервер не отвечает на попытку TCP-подключения | Firewall, backlog, перегрузка, сетевой стек |
| SYN и SYN-ACK есть, затем повторные передачи | Ответ сервера уходит, но соединение не продолжается нормально | Обратный маршрут, фильтрация, сеть |
| TCP устанавливается, access.log пуст | Проблема возникает до полноценного HTTP-запроса | TLS, Nginx LISTEN, системные логи |
| Строка есть в access.log | Веб-сервер получил HTTP-запрос | Nginx/Apache, upstream, ресурсы |
| В error.log ошибки upstream | Фронтенд работает, сбой находится глубже | Apache, PHP-FPM, приложение |
Если подозрение остаётся на сети, можно дополнительно проверить маршрут с внешней машины:
mtr -rwzc 20 SERVER_IP
или:
traceroute SERVER_IP
Такой тест не доказывает, каким именно маршрутом Cloudflare идёт к origin, и ICMP может фильтроваться. Но устойчивые потери или обрыв маршрута помогают понять, что проблема не обязательно находится внутри Nginx.
Может ли перегруженный VPS вызывать Cloudflare 522
Да. Origin может быть технически включён, но принимать новые соединения настолько медленно или нестабильно, что Cloudflare получает 522. Особенно характерен плавающий сценарий: несколько минут сайт работает, затем начинаются timeout, после чего всё восстанавливается без изменения DNS.
Постоянный и периодический 522 — разные сценарии
Если 522 появился сразу после миграции и воспроизводится постоянно, сначала проверяйте IP, AAAA, 80/443, firewall и веб-сервер. Если ошибка приходит волнами, ресурсы и лимиты становятся намного интереснее.
Базовая проверка:
uptime
top
free -m
vmstat 1
df -h
uptime покажет load average, top — процессы и CPU, free -m — память и swap. В vmstat 1 смотрите несколько строк подряд: так легче заметить стабильный I/O wait или активную работу swap.
Проверьте OOM:
dmesg | grep -i -E 'oom|killed process'
Если ядро убивало Nginx, Apache, PHP-FPM или другой процесс рядом со временем возникновения 522, это уже серьёзная зацепка.
Состояние сервисов:
systemctl status nginx
systemctl status php-fpm
У PHP-FPM unit часто содержит версию, например php8.2-fpm, поэтому точное имя нужно смотреть в конкретной системе.
Когда CPU и RAM в норме, но новые соединения всё равно не принимаются
Бывает другой сценарий: CPU свободен, RAM хватает, диск не захлёбывается, но новые TCP-соединения всё равно начинают теряться. Тогда проблема может быть не в «мощности VPS», а в лимитах соединений.
Начните с общей статистики сокетов:
ss -s
Посмотрите, сколько соединений застряло в SYN-RECV:
ss -ant state syn-recv
Несколько таких соединений сами по себе ничего не доказывают. Но если во время 522 список резко растёт и новые подключения перестают проходить, стоит проверить backlog, защиту от SYN flood и общую способность сервера принимать соединения.
Текущий предел backlog:
sysctl net.core.somaxconn
Если используется conntrack, можно сравнить текущее число отслеживаемых соединений с лимитом:
sysctl net.netfilter.nf_conntrack_count
sysctl net.netfilter.nf_conntrack_max
На системах без соответствующего netfilter-модуля этих параметров может не быть. Это нормально.
Для Nginx полезно проверить лимит соединений worker:
nginx -T 2>&1 | grep -n worker_connections
И лимит открытых файлов для systemd-сервиса:
systemctl show nginx -p LimitNOFILE
Не меняйте эти значения только потому, что нашли их в статье. Сначала нужен симптом: лимит реально достигается, в логах есть соответствующие ошибки или число соединений упирается в предел.
| Симптом | Что смотреть | Возможная причина |
|---|---|---|
| 522 только в часы нагрузки | CPU, load average, connections | Не хватает CPU или workers |
| Сайт зависает, затем оживает | RAM, swap, OOM | Дефицит памяти |
| CPU низкий, ответы всё равно долгие | vmstat, I/O wait | Проблема диска или хранилища |
| CPU/RAM нормальные, SYN-RECV быстро растёт | ss, backlog, firewall | Новые TCP-соединения не успевают устанавливаться |
| Число conntrack близко к максимуму | nf_conntrack_count / nf_conntrack_max | Таблица отслеживания соединений заполнена |
| Nginx работает, но новых соединений слишком много | worker_connections, file limits, error.log | Лимиты веб-сервера или файловых дескрипторов |
| Статика работает, динамика зависает | PHP-FPM, upstream, приложение | Проблема уже глубже фронтового Nginx |
Не делайте вывод по одной цифре. Высокий load average не всегда означает упор в CPU, десяток SYN-RECV не означает переполненный backlog, а большой conntrack не проблема, пока он не приблизился к реальному лимиту. Нужны совпадающие симптомы и время появления 522.
Почему смена SSL-режима Cloudflare обычно не исправляет 522
Переключение Flexible, Full и Full (strict) не исправит ситуацию, в которой Cloudflare не может нормально установить соединение с origin. Сначала должен работать сетевой путь до 443, затем Nginx и только после этого имеет смысл разбирать TLS.
После миграции владелец сайта видит 522 и начинает переключать SSL/TLS Mode. В итоге меняется поведение редиректов и HTTPS, но закрытый 443 или firewall остаётся на месте.
Проверьте HTTPS напрямую:
curl -vk --resolve example.com:443:SERVER_IP https://example.com/
-v показывает этапы соединения, а -k временно отключает проверку доверия к сертификату для диагностики. Это не способ исправить SSL.
Отдельный TLS-тест:
openssl s_client -connect SERVER_IP:443 -servername example.com
TCP к 443 вообще не устанавливается? Сертификат пока ни при чём. Возвращаемся к LISTEN, firewall и сети.
TCP устанавливается, но приходит неправильный сертификат или другой virtual host — теперь смотрим SNI, HTTPS-конфигурацию и сертификат origin.
Рабочая последовательность такая: 443 доступен → Nginx принимает соединение → TLS работает для нужного hostname → сайт отвечает по HTTPS → проверяется режим Cloudflare SSL/TLS.
Лучше добиться корректного HTTPS непосредственно на новом VPS и только потом возвращать Cloudflare в цепочку.
Как временно отключить Cloudflare proxy и не спутать диагностику с решением
DNS only полезен как диагностический режим, но сам по себе не исправляет 522. Серое облако убирает reverse proxy Cloudflare из пути и отправляет клиента напрямую к origin.
Если Proxy ON даёт 522, а DNS only начинает работать, круг поиска резко сузился. Origin способен принимать прямые подключения, но что-то ломается именно в проксированной цепочке.
Это ещё не означает, что неисправен Cloudflare. Возможны:
- блокировка сетей Cloudflare на VPS;
- Fail2ban или CSF;
- ACL у провайдера;
- rate limiting;
- внешняя защита;
- ошибка в настройках origin.
| Proxy ON | DNS only | curl --resolve | Куда смотреть |
|---|---|---|---|
| 522 | Не работает | Не работает | VPS, 80/443, firewall, Nginx/Apache |
| 522 | Работает | Работает | Доступ Cloudflare к origin, firewall, ACL |
| 522 | HTTP работает, HTTPS нет | HTTPS не работает | 443, TLS virtual host, firewall |
| Работает | Работает | Работает | Базовая цепочка исправна |
Если не хочется менять публичный Proxy status, curl --resolve часто даёт достаточно информации и не затрагивает остальных посетителей.
При DNS only реальный IP origin публикуется в DNS. Если VPS специально принимает HTTP/HTTPS только от Cloudflare, такой тест нужно проводить осознанно и при необходимости временно разрешить свой диагностический IP.
DNS only заработал — это диагностический результат. Оставлять серое облако навсегда только потому, что «так открывается», не стоит: первопричина останется.
В каком порядке проверять Cloudflare 522 после миграции, чтобы не менять настройки наугад
При 522 после миграции идите от DNS к сети, затем к веб-серверу и только потом к приложению. Если одновременно поменять firewall, SSL Mode, Nginx и DNS, сайт может заработать, но причина останется неизвестной.
- Зафиксируйте реальный IP нового VPS. IPv4 и, если используется, IPv6 origin.
- Проверьте A/AAAA в Cloudflare DNS dashboard. Для Proxied-записей не путайте публичные адреса Cloudflare с origin.
- Проверьте origin через
curl --resolve. Если он напрямую не отвечает, Cloudflare пока исключаем из поиска. - Посмотрите LISTEN на 80/443. Команда
ss -lntpдолжна показать фронтовый веб-сервис. - Проверьте порт извне. Локальный curl на VPS не заменяет внешний тест.
- Проверьте системный и внешний firewall. UFW, firewalld, nftables, iptables, security group.
- Сравните DNS only и Proxy ON. Если напрямую работает, а через Cloudflare нет, ищите фильтрацию Cloudflare → origin.
- Откройте access/error logs. Нужно понять, дошёл ли запрос до Nginx/Apache.
- При необходимости включите tcpdump. Смотрите не только наличие пакетов, но SYN, SYN-ACK и повторные передачи.
- При плавающем 522 проверьте ресурсы и TCP-лимиты. CPU, RAM, I/O, OOM, connections, backlog, conntrack, workers.
- Если остаётся подозрение на сеть, сравните внешний маршрут. mtr/traceroute — вспомогательный сигнал, а не доказательство пути Cloudflare.
- Только после подтверждения TCP-пути разбирайте TLS. SSL Mode не должен быть первой настройкой при timeout.
| Команда | Что проверяет | Какой вопрос закрывает |
|---|---|---|
dig +short NS example.com |
Authoritative DNS | Где реально обслуживается зона |
curl --resolve ... |
Origin напрямую | Работает ли новый VPS без Cloudflare |
ss -lntp |
Слушающие сокеты | Кто принимает 80/443 |
nc -vz SERVER_IP 443 |
Внешний TCP-доступ | Можно ли подключиться к 443 извне |
nginx -t |
Конфигурацию Nginx | Можно ли корректно загрузить конфигурацию |
apachectl configtest |
Конфигурацию Apache | Нет ли синтаксической ошибки VirtualHost |
journalctl |
Системные журналы | Не падает ли сервис |
tcpdump |
TCP-пакеты | Доходит ли SYN и отвечает ли VPS |
ss -s |
Состояние соединений | Нет ли проблем с количеством сокетов |
top, free -m, vmstat 1 |
Ресурсы | Не упирается ли origin в CPU, RAM или I/O |
curl --resolve не проходит — остаёмся на VPS. Проходит, но Proxy ON даёт 522 — проверяем доступ Cloudflare. SYN приходит, SYN-ACK не уходит — смотрим сервер и firewall. HTTP уже появился в access.log — сетевой этап пройден, можно идти к веб-стеку.
Что проверить перед повторным включением Cloudflare
Возвращать Proxy лучше после того, как новый origin стабильно проходит прямые проверки по HTTP и HTTPS. Иначе Cloudflare снова добавит промежуточный слой в ещё не исправленную схему.
Перед включением проверьте:
- A-запись в Cloudflare содержит IPv4 нового VPS.
- www ведёт на правильный сервер или корректный CNAME.
- AAAA содержит проверенный IPv6 origin либо отсутствует, если origin работает только по IPv4.
- Вы не принимаете публичные A/AAAA Proxied-записи за адрес origin.
curl --resolveполучает ответ от нового VPS.- 80 доступен извне, если используется HTTP.
- 443 доступен извне для HTTPS.
- Nginx или Apache принимает соединения на правильном интерфейсе.
nginx -tилиapachectl configtestпроходит без ошибок.- Системный и внешний firewall не режут нужный трафик.
- Fail2ban, CSF и ACL не блокируют сети Cloudflare.
- При тесте в tcpdump видно нормальное установление TCP-соединения.
- VPS не упирается в CPU, RAM, I/O, backlog, conntrack или лимиты workers.
- HTTPS для нужного hostname корректно работает непосредственно на origin.
Включите Proxy и снова откройте основной домен, www, HTTPS и хотя бы один внутренний URL. Одновременно посмотрите access.log и error.log. Если запросы через Cloudflare приходят на новый VPS и сервер отвечает стабильно, основная цепочка восстановлена.
Контрольная цепочка: правильный origin в Cloudflare DNS → прямой curl --resolve работает → 80/443 доступны извне → firewall пропускает нужный трафик → Nginx/Apache обслуживает правильный hostname → TCP и логи подтверждают прохождение запросов → Proxy ON работает без 522.
Если 522 вернётся позже, используйте уже известные контрольные точки. Прямой origin по-прежнему отвечает, но пакеты Cloudflare не появляются на сервере — смотрим сеть и фильтрацию. SYN приходит, а сервер перестал отвечать — проверяем firewall и TCP-лимиты. Запрос есть в access.log — идём к Nginx, upstream и ресурсам.
Миграцию можно считать нормально завершённой, когда новый VPS стабильно отвечает напрямую и через Cloudflare, а повторный тест показывает один и тот же рабочий origin, открытые порты и нормальное прохождение соединения без 522.


