Случайный 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(' ') решило проблему в нашем случае, но я не совсем понимаю причину.

Другие вопросы по тегам