假设我有一个简单的 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 级别做我想做的事情?