如何配置 nginx 以防止其阻塞缓慢的 uwsgi 后端服务?

如何配置 nginx 以防止其阻塞缓慢的 uwsgi 后端服务?

假设我有一个简单的 nginx 配置,可以与 uwsgi 后端对话:

server {
    listen 9900 default_server;
    listen [::]:9900 default_server;
    location / {
            include         uwsgi_params;
            uwsgi_pass      unix:/tmp/service-foo.sock;
    }
}

该服务有一部分 URL(/renderer/...)总是运行速度极慢,在负载过大的情况下,整个网站都会瘫痪。

我想要用后端的两个副本替换它,如下所示:

server {
    listen 9900 default_server;
    listen [::]:9900 default_server;

    location / {
            include         uwsgi_params;
            uwsgi_pass      unix:/tmp/service-foo.sock;
    }
    location ~ ^/renderer/[0-9]+/ {
            include         uwsgi_params;
            uwsgi_pass      unix:/tmp/service-renderer.sock;
            uwsgi_read_timeout      30s;
            uwsgi_send_timeout      30s;
            uwsgi_request_buffering on;
    }
}

...我天真地期望这可以解决问题,通过允许/renderer/...请求一次缓慢地得到处理,同时网站的其余部分保持响应。

然而,它没有起作用。

看起来 nginx 从同一个进程向两个位置提供请求,最终服务器只是坐在那里阻塞,所有请求都位于第二个 uwsgi 实例中,而第一个 uwsgi 实例什么也不做。

我阅读了有关 nginxthread_pool指令的信息,它看起来几乎和我想要的完全一样(即,为渲染器位置保留一个特定的线程池),但这似乎不受 uwsgi 支持,它只是用于文件 io。

有没有什么方法可以在 nginx 级别做我想做的事情?

相关内容