Назад | Перейти на главную страницу

Apache 2.4 отправляет 502 ошибки, когда бэкэнд отправляет 401 при загрузке больших файлов

Использование Apache 2.4.25 (Windows) и внутреннего сервера Tomcat 8 (Windows).

У нас есть клиентское программное обеспечение, которое загружает файлы с помощью HTTPS в сеансе с аутентификацией, который передается через Apache в Tomcat. Однако, если сеанс с проверкой подлинности не используется (или время сеанса истекло), внутренний сервер Tomcat отправляет ответ HTTP 401. Однако вместо этого Apache возвращает клиенту ошибку 502.

Журнал доступа Tomcat:

127.0.0.1 - - [21/Apr/2017:18:30:38 +0000] "POST /upload/10507.wav HTTP/1.1" 401 39

Журнал доступа Apache:

10.8.21.23 - - [21/Apr/2017:18:30:27 +0000] "POST /upload/10507.wav HTTP/1.1" 502 232 14030

Журнал ошибок Apache:

[Fri Apr 21 18:30:39.770715 2017] [proxy:error] [pid 33652:tid 120896] (OS 10053)An established connection was aborted by the software in your host machine.  : [client 10.8.21.23:62863] AH01084: pass request body failed to 127.0.0.1:8888 (127.0.0.1)
[Fri Apr 21 18:30:39.770715 2017] [proxy_http:error] [pid 33652:tid 120896] [client 10.8.21.23:62863] AH01097: pass request body failed to 127.0.0.1:8888 (127.0.0.1) from 10.8.21.23 ()

Этот вопрос имеет симптом, аналогичный следующему случаю и ошибке, но с другой ошибкой в ​​журналах:

Я безуспешно пробовал различные комбинации следующих переменных среды:

По запросам с меньшим телом он проксирует 401, как и ожидалось. При больших запросах (> 1 МБ или около того, но не согласованно) вместо этого он отправляет 502. Внутренняя обработка не должна читать все тело, прежде чем решить, существует ли сеанс или нет, поэтому она может запустить 401, как только прочитает заголовок. С файлами размером более 10 МБ его можно воспроизводить в 100% случаев, даже если выполняется проксирование на локальный внутренний сервер.

Предполагается, что это происходит, когда Apache не полностью прочитал весь запрос до получения ответа 401. Он рассматривает это как «ошибку прокси», а не передает «правильный» ответ 401.

Мы пробовали использовать другой балансировщик нагрузки (AWS ELB), и он при любых обстоятельствах отправляет обратно 401, поэтому я сомневаюсь, что отправка 502 является ожидаемым поведением.

Есть ли какие-то переменные среды Apache, которые мне не хватает, чтобы попробовать? Это ошибка Apache?

Исправление заключалось в изменении конфигурации Tomcat для maxSwallowSize, в которой Tomcat проглатывает байты перед отправкой ответа.

https://tomcat.apache.org/tomcat-8.0-doc/config/http.html

maxSwallowSize

Максимальное количество байтов тела запроса (исключая накладные расходы на кодирование передачи), которые будут проглочены Tomcat для прерванной загрузки. Прерванная загрузка - это когда Tomcat знает, что тело запроса будет проигнорировано, но клиент все равно его отправляет. Если Tomcat не проглотит тело, клиент вряд ли увидит ответ. Если не указано иное, будет использоваться значение по умолчанию 2097152 (2 мегабайта). Значение меньше нуля указывает, что ограничение не должно применяться.

Ошибка в apache https://bz.apache.org/bugzilla/show_bug.cgi?id=60330 Надеюсь исправят в версии 2.4.40