Случайный HTTP 408 в запросах POST, и тело не передается
Некоторое время назад мы заметили число HTTP 408 в журнале подключений nginx. Все такие запросы являются POST-запросами со временем запроса, равным nginx client_body_timeout. Мы собрали дамп tcp и расшифровали tls-трафик. Похоже, что клиент запускает запрос, отправляет заголовки с указанным ненулевым заголовком content-length, но затем после разделителя между заголовками и телом данные вообще не передаются со стороны клиента. Nginx вежливо ждет любых данных и по истечении периода, равного client_body_timeout, аккуратно закрывает соединение. Кто-нибудь может пояснить, в чем может быть причина такого поведения? Некоторая дополнительная информация:
- Версия nginx — 1.20.2, и проблема сохраняется в течение года или более.
- Проблема спорадическая. Зависимости от ежедневных пиков нагрузки нет, но похоже, что у одних клиентов такая ошибка возникает чаще, чем у других.
- Среднее ежедневное количество HTTP 408 составляет около 1 тыс. на 110 млн от общего числа запросов POST.
- Проблема сохраняется на разных хостах, с разными экземплярами nginx и разными сервисами.
- Мы попытались перенаправить трафик через amazon alb, но проблема не устранена.
- Запросы, которые приводят к HTTP 408, отправляются через Firefox, Chrome и наши приложения для iOS и Android.
- Мы не можем воспроизвести проблему с помощью тестов, даже генерируя большое количество идентичных клиентским запросам, отправленным через jmeter.
- Проблема очень мало влияет на работу клиента, так как у нас нет жалоб на эти ошибки.
1 ответ
У нас такая же проблема. В нашем случаеnginx
сервер возвращаетHTTP 408
код при полученииHTTPS POST
запрос с большим заголовком (20 Кб), но с телом нулевой длины - тот же запрос с меньшим заголовком работает корректно. Добавление только 1 char body(' ') решило проблему в нашем случае, но я не совсем понимаю причину.