Nginx Error 504: Gateway Time-out (110: Connection timed out) — Решение
Клиент ожидает ответа от сервера, после чего получает ошибку 504 Gateway Time-out. В журнале error.log Nginx появляется запись: connect() to upstream timed out (110: Connection timed out) while connecting to upstream.
| Уровень сбоя | Характер задержки | Точка отказа |
|---|---|---|
| Сетевой фильтр (Firewall) | Пакеты SYN отбрасываются (DROP) без RST | iptables / Security Groups / pfSense |
| Маршрутизация (Routing) | Нет маршрута к IP бэкенда | Неверный Gateway / VPN-туннель упал |
| Перегрузка бэкенда | Очередь TCP backlog (listen queue) переполнена | Бэкенд физически не может принять TCP SYN |
- Задержка перед появлением ошибки длится ровно столько, сколько задано в
proxy_connect_timeout(по умолчанию 60 секунд). - Утилита
telnet <ip> <port>илиnc -zv <ip> <port>зависает без ответа.
- Проверьте прямую сетевую доступность бэкенда с хоста Nginx:
nc -zvw3 <upstream_ip> <upstream_port> # Проверьте трассировку маршрута: traceroute -n -T -p <upstream_port> <upstream_ip> - Проверьте правила межсетевого экрана на целевом сервере бэкенда:
# Убедитесь, что входящие пакеты от IP Nginx не блокируются: sudo iptables -L -n -v | grep <nginx_ip> sudo ufw status verbose - В облачных средах (AWS, GCP, Azure, Yandex Cloud) проверьте Security Groups / Network ACL: разрешен ли входящий порт бэкенда из подсети Nginx.
- Проверьте очередь переполнения TCP-сокетов (ListenDrop / ListenOverflow) на бэкенде:
netstat -s | grep -i listen # Увеличьте somaxconn при необходимости: sudo sysctl -w net.core.somaxconn=4096 - Если задержка вызвана медленным установлением сетевой сессии, скорректируйте тайм-аут в Nginx:
proxy_connect_timeout 10s; # Уменьшите, чтобы Nginx быстрее реагировал на сбои - Перезагрузите веб-сервер:
sudo nginx -s reload.
Connection timed out возникает на этапе установки TCP-соединения (3-way handshake). Если соединение установилось, но бэкенд долго генерирует ответ, возникает ошибка Operation timed out while reading response.Частые вопросы (FAQ)
Чем вызван таймаут ровно через 60 секунд?
Значение 60 секунд является стандартным тайм-аутом директивы proxy_connect_timeout в Nginx. Если бэкенд не прислал TCP SYN-ACK за это время, Nginx рвет сессию по 504 коду.
Почему при ошибке 110 порт кажется открытым через nmap?
Nmap может проверять порт по протоколу UDP или через другие сетевые интерфейсы, в то время как Nginx пытается построить TCP-сессию через конкретный IP, заблокированный файрволом.
Как снизить время ожидания клиента при отказе одной из нод?
Установите proxy_connect_timeout 3s; и настройте директиву proxy_next_upstream error timeout http_502 http_504;.
Может ли MTU вызывать Connection timed out?
Да, при проблемах с фрагментацией пакетов в VPN-туннелях (GRE/IPsec/WireGuard) большие TCP-пакеты могут молча отбрасываться (MTU Blackhole).