Первый запрос не завершается (без FIN) uWSGI + nginx - PullRequest
1 голос
/ 10 марта 2019

Я использую nginx в качестве обратного прокси-сервера перед сервером uWSGI (флеш-приложения).

Из-за утечки памяти используйте --max-requests для перезагрузки рабочих после стольких вызовов.

Проблема заключается в следующем: когда работник только перезапускается / запускается, первый полученный запрос остаетсязависание между uWSGI и NGINX, время обработки внутри приложения фляги обычное и очень быстрое, но клиент ждет, пока не запустится uwsgi_send_timeout.

Использование tcpdump для просмотра запроса (nginx - XXX.14 и uWSGIXXX.11): tcpdump communcation between nginx XXX.14 and uWSGI XXX.11

В столбце времени видно, что он зависает на 300 секунд (uwsgi_send_timeout), несмотря на то, что NGINX получил запрос HTTP ... uWSGIпросто не отправляет пакет [FIN], чтобы сообщить, что соединение закрыто.Затем NGINX запускает тайм-аут и закрывает сеанс.

Конечный клиент получает усеченный ответ. С кодом состояния 200.что очень расстраивает.

Это происходит при каждой перезагрузке работника, только один раз, при первом запросе, независимо от размера запроса.

Есть ли у кого-нибудь решение этой проблемы?я что-то неправильно настроил?

uwsgi.ini

[uwsgi]
# Get the location of the app
module = api:app

plugin = python3
socket = :8000
manage-script-name = true
mount = /=api:app
cache2 = name=xxx,items=1024

# Had to increase buffer-size because of big authentication requests.
buffer-size = 8192

## Workers management
# Number of workers
processes = $(UWSGI_PROCESSES)
master = true
# Number of requests managed by 1 worker before reloading (reload is time expensive)
max-requests = $(UWSGI_MAX_REQUESTS)

lazy-apps = true

single-interpreter = true

nginx-server.conf

server {
    listen 443 ssl http2;
    client_max_body_size 50M;

    location @api {
        include uwsgi_params;
        uwsgi_pass api:8000;
        uwsgi_read_timeout 300;
        uwsgi_send_timeout 300;
    }

1 Ответ

0 голосов
/ 11 марта 2019

По какой-то странной причине добавление параметра uwsgi_buffering off; в конфиге nginx устранило проблему.

Я до сих пор не понимаю, почему, но сейчас это исправляет мою проблему.Если у кого-то есть веское объяснение, не стесняйтесь.

server {
    listen 443 ssl http2;
    client_max_body_size 50M;

    location @api {
        include uwsgi_params;
        uwsgi_pass api:8000;
        uwsgi_buffering off;
        uwsgi_read_timeout 300;
        uwsgi_send_timeout 300;
    }
...