Digamos que eu tenha uma configuração simples do nginx que converse com um back-end do uwsgi:
server {
listen 9900 default_server;
listen [::]:9900 default_server;
location / {
include uwsgi_params;
uwsgi_pass unix:/tmp/service-foo.sock;
}
}
Esse serviço tem um certo subconjunto de URLs ( /renderer/...
) que são sempre muito lentas e, sob carga pesada, o site inteiro fica inativo.
O que eu quero é substituir isso por duas cópias do backend, assim:
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;
}
}
... minha expectativa ingênua era de que isso solucionaria o problema, permitindo que as solicitações /renderer/...
fossem atendidas lentamente, uma de cada vez, enquanto o restante do site permanecesse responsivo.
No entanto, não funcionou.
Parece que o nginx está atendendo pedidos em ambos os locais do mesmo processo e, eventualmente, o servidor apenas bloqueia com todas as solicitações na segunda instância do uwsgi, e o primeiro exemplo do uwsgi não faz nada.
Eu li sobre a diretiva nginx thread_pool
que parece quase exatamente o que eu quero (ou seja, um conjunto de threads reservado específico para a localização do renderizador), mas isso não parece ser suportado pelo uwsgi, é apenas para arquivo io.
Existe alguma maneira de fazer o que eu quero no nível nginx?