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

Ошибка Apache 502 при повышении прокси-сервера восходящего направления 413

У нас есть API-интерфейс Python Flask, работающий в Gunicorn под управлением apache.

ProxyPreserveHost On
<Location /api/v2>
    ProxyPass http://127.0.0.1:8090/ disablereuse=on
    SetEnv proxy-sendcl
</Location>

API-интерфейс python настроен на создание 413 если загружен файл более определенного размера. При прямом обращении к API-интерфейсу python ответ возвращается правильно, однако, когда к смеси добавляется apache, 502 возвращается без ошибок в журнале ошибок apache.

user@server:~$ curl -v -X POST   http://localhost:8090/photos -F file=@foo.txt
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8090 (#0)
> POST /photos HTTP/1.1
> Host: localhost:8090
> User-Agent: curl/7.47.0
> Accept: */*
> Content-Length: 31457564
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=------------------------5333e9e102a557ee
>
< HTTP/1.1 100 Continue
< HTTP/1.1 413 REQUEST ENTITY TOO LARGE
< Server: gunicorn/19.6.0
< Date: Fri, 21 Sep 2018 18:38:09 GMT
< Connection: close
< Content-Type: application/json
< Content-Length: 76
<
{
    "message": "The data value transmitted exceeds the capacity limit."
}
* we are done reading and this is set to close, stop send
* Closing connection 0

А вот и 502 происходит, когда apache является прокси:

$ curl -v -X POST \
  https://my.servers.com/photos \
  -F file=@file.txt
*   Trying xx.xx.xx.xxx...
* TCP_NODELAY set
* Connected to my.server.com (xx.xx.xx.xxx) port 443 (#0)
... SSL ...
> POST /api/v2/photos HTTP/1.1
> Host: my.servers.com
> User-Agent: curl/7.54.0
> Accept: */*
> Content-Length: 42716348
> Expect: 100-continue
> Content-Type: application/x-www-form-urlencoded; boundary=------------------------5bc19156b7a56f0e
>
* Done waiting for 100-continue
< HTTP/1.1 502 Bad Gateway
< Date: Fri, 21 Sep 2018 20:21:13 GMT
< Server: Apache
< Content-Length: 232
< Content-Type: text/html; charset=iso-8859-1
* HTTP error before end of send, stop sending
<
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>502 Bad Gateway</title>
</head><body>
<h1>Bad Gateway</h1>
<p>The proxy server received an invalid
response from an upstream server.<br />
</p>
</body></html>
* Closing connection 0
* TLSv1.2 (OUT), TLS alert, Client hello (1):

Что я пробовал:

Любые идеи, почему Apache не пройдет 413 вместе?

Я собираюсь перечислить проблемы, которые я вижу, в порядке появления.

Ваш сервер (на котором запущен PHP) ожидает «Content-Type: multipart / form-data». Похоже, он отправляет «Content-Type: application / json».

Ваш прокси-сервер отправляет тип содержимого «Content-Type: application / x-www-form-urlencoded» на сервер, который ожидает «Content-Type: multipart / form-data».

Мой первый вопрос: если файл правильного (приемлемого) размера отправляется через прокси-сервер Apache, правильно ли сервер (на котором запущен PHP) обрабатывает файл?

Если этого не происходит, прокси-сервер Apache увидит сообщение «Ошибка HTTP перед завершением отправки, прекратите отправку», потому что сервер (на котором запущен PHP) не распознает тип содержимого и выдаст ошибку (недопустимый ответ на основе типа контента) и представить клиенту 502 вместо передачи 413.

Устраняет ли эта строка конфигурации в прокси-сервере (вам необходимо настроить полное доменное имя для вашего пункта назначения и оптимизировать переменные) вашу проблему (после установления того, что целевой сервер правильно обрабатывает размер / форматирование графики)?

ProxyPass / http://localhost:8090/ retry=1 acquire=3000 timeout=600 Keepalive=On