第一个请求不会终止(无FIN)uWSGI + nginx

时间:2019-03-10 15:18:16

标签: python nginx flask uwsgi

我将nginx用作uWSGI服务器(烧瓶应用程序)之前的反向代理。

由于内存泄漏,请在多次调用后使用--max-requests重新加载worker。

问题如下:当一个工作人员刚刚重新启动/启动时,它收到的第一个请求仍然挂在uWSGI和NGINX之间,flask应用程序内部的处理时间很正常,而且很快,但是客户端一直等到{{1 }}被触发。

使用tcpdump查看请求(nginx为XXX.14,uWSGI为XXX.11):tcpdump communcation between nginx XXX.14 and uWSGI XXX.11

您可以在时间列中看到它挂起了300秒(uwsgi_send_timeout),即使NGINX收到了HTTP请求... uWSGI只是没有发送[FIN]数据包来表明连接已关闭。然后,NGINX触发超时并关闭会话。

最终客户端收到截断的响应。状态码为200。这非常令人沮丧。

这种情况发生在每次重新加载工作程序时,无论第一个请求有多大,都只会出现一次。

有人可以解决此问题吗?我配置错误了吗?

uwsgi.ini

uwsgi_send_timeout

nginx-server.conf

[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

1 个答案:

答案 0 :(得分:0)

出于某些奇怪的原因,在nginx配置中添加参数uwsgi_buffering off;解决了该问题。

我仍然不明白为什么,但是现在这可以解决我的问题。如果有人有有效的解释,请不要犹豫。

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;
    }