Коротко. «Время ожидания истекло» означает, что клиент не получил ответ за отведённое время. Причина может быть в соединении, DNS, шлюзе или приложении. Код 504 — только один из вариантов: его ставит шлюз, когда бэкенд не ответил. Смотреть нужно на цепочку и на то, где именно остановился запрос.
Как читать материал. Сначала измерьте время по этапам, потом посмотрите лимиты на каждом участке. Нейросеть помогает разобрать цифры и конфиг, но причину зависания ищите в логах и профилировщике.
Где может ждать запрос
- DNS. Имя долго не разрешается.
- Соединение. Клиент не может установить TCP-соединение.
- TLS. Долгий TLS handshake.
- CDN или прокси. Ждёт origin.
- nginx. Ждёт PHP-FPM или upstream.
- PHP. Скрипт работает дольше лимита.
- База. Запрос заблокирован или ждёт соединения.
Разные участки дают разные ошибки: браузерное ERR_CONNECTION_TIMED_OUT, ERR_EMPTY_RESPONSE или серверный 504.
Как измерить
curl умеет показывать время по этапам:
curl -o /dev/null -s -w "dns:%{time_namelookup} connect:%{time_connect} tls:%{time_appconnect} first:%{time_starttransfer} total:%{time_total}\n" https://site.ru/
Читайте так:
time_namelookup— DNS;time_connect— TCP;time_appconnect— TLS;time_starttransfer— первый байт ответа;time_total— весь запрос.
Если DNS занимает секунды, проблема в резолвере. Если соединение быстрое, а первый байт приходит поздно — зависло приложение или база.
Классический путь. Снимите тайминги для нескольких URL и сравните этапы.
С нейросетью. Отдайте таблицу замеров и попросите найти узкое место.
Вот время dns, connect, tls, first byte и total для 10 URL. Найди, на каком
этапе теряется время, и раздели страницы на группы. Не предлагай поднимать
таймаут, пока не назовёшь этап. Ответь таблицей.
Проверка. Повторите замер 2–3 раза: разовый выброс ничего не доказывает.
Лимиты, которые срабатывают первыми
| Участок | Параметр | Что означает |
|---|---|---|
| nginx → PHP | fastcgi_read_timeout |
сколько ждать ответа FPM |
| nginx → upstream | proxy_read_timeout |
сколько ждать ответа прокси |
| PHP | max_execution_time |
сколько может работать скрипт |
| База | innodb_lock_wait_timeout |
сколько запрос ждёт освобождения блокировки |
| CDN | 125 секунд у Cloudflare по умолчанию | лимит ожидания origin |
Последний пункт объясняет ошибку 524: соединение есть, но ответ не пришёл за 125 секунд.
Как исправить
| Причина | Действие |
|---|---|
| Долгий SQL-запрос | добавить индекс, переписать запрос |
| Тяжёлая выгрузка | вынести в фон и отдавать файл позже |
| Внешний API | поставить свой таймаут и повтор с паузой |
| Много одновременных запросов | ограничить очередь и увеличить пул |
| Медленный DNS | сменить резолвер или проверить зону |
| Сетевой обрыв | проверить маршрут и firewall |
Увеличение таймаута помогает, только если запрос завершается, но медленно. Если он завис, вы просто дольше ждёте ошибку.
Влияет ли это на SEO
Долгие ответы ухудшают обход: робот тратит время на ожидание и реже возвращается. Если сервер отдаёт 504 или обрывает соединение, страницы реже обходятся.
Скорость ответа влияет и на людей: посетитель уходит, не дождавшись. Поэтому таймаут — это не только техническая, но и конверсионная проблема.
Где помогает нейросеть
| Задача | Что делает модель | Что проверять руками |
|---|---|---|
| Разбор таймингов | находит узкий этап | повторные замеры |
| Анализ SQL | предлагает индексы | план запроса |
| Конфиг nginx | подбирает таймауты | синтаксис и нагрузка |
| Письмо хостеру | описывает факты | логи и время |
Частые ошибки
- Поднимать таймаут без поиска причины.
- Смотреть только общий
time_total. - Игнорировать DNS и TLS.
- Путать 504 с 502.
- Ставить бесконечный таймаут в PHP.
- Не проверять повторяемость замера.
Вопросы
Таймаут — это ошибка сервера?
Не всегда. Он может возникнуть при DNS-запросе, в сети, на CDN, в приложении или базе. Код 504 ставит шлюз, браузерное сообщение — клиент.
Чем 504 отличается от таймаута браузера?
504 — HTTP-ответ от шлюза. Браузерное сообщение означает, что ответа не дождался сам клиент. Причины могут пересекаться.
Поможет ли увеличить таймаут?
Если запрос завершается, но медленно — да. Если завис — нет.
Может ли нейросеть найти зависший запрос?
Она анализирует логи и код, но точку зависания подтверждают профилировщик и план запроса.
Связанные материалы
Источники
Официальные документы 5
- nginx: proxy_read_timeoutnginx.org
- nginx: fastcgi_read_timeoutnginx.org
- PHP: max_execution_timephp.net
- Cloudflare: Error 524developers.cloudflare.com
- curl: переменные времениcurl.se