Назад | Перейти на главную страницу

Как настроить 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 обслуживает запросы в оба места из одного и того же процесса, и в конечном итоге сервер justs сидит там, блокируя все запросы, находящиеся во втором экземпляре uwsgi, а первый экземпляр uwsgi вообще ничего не делает.

Я читал о nginx thread_pool директива, которая выглядит почти так же, как я хочу (т.е. конкретный зарезервированный пул потоков для расположения рендерера), но, похоже, это не поддерживается uwsgi, это только для файла io.

Есть ли способ делать то, что я хочу на уровне nginx?