Как я могу сказать, что на самом деле завершает HTTP-ответ?

376
Brad Parks

У меня есть веб-сервер, который обслуживает некоторые статические файлы. Иногда, когда сервер находится под большой нагрузкой, он отправляет частичные ответы со статусом HTTP 200.

Это проблема для моего приложения. Зачем?

  • На ответе установлены заголовки кеша, которые предназначены для длительного хранения файла, поскольку эти файлы статичны и никогда не должны изменяться.
  • Время от времени некоторые конечные пользователи получают только часть файла JavaScript с HTTP-статусом 200.
  • Этот файл кэшируется браузером и ломает мое приложение!

Я пробовал 2 разных веб-сервера (Jetty и Apache) и вижу, что проблема возникает с обоими, с балансировщиком нагрузки или без него (haproxy). Это заставляет меня думать, что это не сам веб-сервер, хотя, возможно, это ожидаемое поведение для любого веб-сервера под большой нагрузкой?

Как я могу узнать, что является причиной этой проблемы, или защититься от нее?

РЕДАКТИРОВАТЬ: Эти запросы также имеют Content-Lengthзаголовок ответа также предоставляется.

0
Насколько большой файл js? Это всегда усечено в одном и том же размере? Вы можете получить pcap от клиента, когда это произойдет? HelpingHand 6 лет назад 0
Они больше, около 4 Мб без сжатия .... разных размеров, когда они тоже отрезаны Brad Parks 6 лет назад 0

1 ответ на вопрос

0
Spiff

Вам нужен захват пакета возникающей проблемы. Может случиться так, что все ваши вещи работают нормально, но конечные пользователи имеют ошибочные браузеры или находятся за ошибочными веб-прокси, брандмауэрами или шлюзами NAT, которые усекают файл.

Возможно, вы захотите посмотреть, как ваши серверы / обратные прокси / балансировщики нагрузки обрабатывают заголовки Content-Length и Transfer-Encoding при обработке этого файла JS. Также ознакомьтесь с правилами для этих вещей в разделе 3.3.2 RFC 7230, «Длина содержимого» и некоторых из следующих разделов.