Допустим, у меня есть простая конфигурация 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 обслуживает запросы в оба места из одного и того же процесса, и в конечном итоге сервер justs сидит там, блокируя все запросы, находящиеся во втором экземпляре uwsgi, а первый экземпляр uwsgi вообще ничего не делает.
Я читал о nginx thread_pool
директива, которая выглядит почти так же, как я хочу (т.е. конкретный зарезервированный пул потоков для расположения рендерера), но, похоже, это не поддерживается uwsgi, это только для файла io.
Есть ли способ делать то, что я хочу на уровне nginx?