Возможная ошибка в Apache2
Я только что потратил целых 8 часов, отслеживая это, и до сих пор не совсем понимаю, что происходит, поэтому я надеюсь, что кто-нибудь сможет объяснить мне это или подтвердить, что это ошибка, чтобы я мог отправить заявку разработчикам Apache, чтобы пусть знают.
У меня есть веб-сервер Ubuntu 20.04.2 LTS/Apache 2.4.41/mod_wsgi 4.6.8/Django 3.1, на котором недавно начались периодические проблемы с кодированием фрагментов. Я получал «ERR_INCOMPLETE_CHUNKED_ENCODING» в консоли разработчика Chrome. Это затронуло только особенно большой статический файл .js (~220 КБ), поэтому я воспринял это как объяснение того, почему был затронут только этот файл, и попробовал все известные исправления, которые смог найти.
Самым многообещающим было отключение кодирования gzip для этого файла, что, по крайней мере, изменило ошибку, но вместо этого я просто получил «ERR_CONTENT_LENGTH_MISMATCH». В этот момент я понял, что объем загружаемого файла .js различался в зависимости от попытки запроса. Используя Wireshark для отслеживания пакетов, кажется, что сервер иногда просто переставал отвечать раньше времени, поэтому мой клиент закрыл соединение и сообщил о несоответствии длины контента. Каждый раз в синюю луну весь файл .js загружался правильно, но в большинстве случаев это не загружалось, и без него страница не загружалась должным образом.
Итак, переходя к делу, я наконец обнаружил, что причиной, по-видимому, является отключение тайм-аута сервера по умолчанию. У меня было установлено:
Timeout -1
... в apache2.conf, чтобы отключить этот тайм-аут для решения более ранней проблемы (да, это не обязательно лучшее решение с точки зрения безопасности, но это система только для внутреннего использования, и это было наиболее эффективное решение на тот момент) . Установка обратного значения на любое обычное значение (например, 300 по умолчанию) устранила проблему с кодированием фрагментов.
Я понятия не имею, почему это решило мою проблему, поэтому я решил посмотреть, знает ли кто-нибудь здесь, почему это могло вызвать такое поведение, которое я видел - в противном случае я открою сообщение об ошибке с помощью Apache, чтобы посмотреть, смогу ли я кого-нибудь спасти. еще одна беда, через которую я прошел.
Единственное, о чем я могу думать, это наличие отдельной настройки тайм-аута для передачи кодирования фрагментов и-1
псевдоним для отключения глобального тайм-аута каким-то образом неправильно влияет на тайм-аут нижнего уровня? В любом случае – любое направление ценится.
Спасибо.
1 ответ
Согласно документации Apache HTTPd, директива Timeout указывается в секундах. Нет упоминания о том, что -1 является магическим значением для отключения тайм-аута.
Возможно, установка тайм-аута на -1 уменьшит эффективный тайм-аут до минимально возможного значения, которое слишком мало для правильной работы httpd.