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

nginx proxy_cache: ограничить параллельные запросы к бэкэнду

Я использую nginx в качестве обратного прокси-сервера для моих бэкэндов. Конфигурация довольно проста, например ядро просто:

upstream myservice {
    server 127.0.0.1:80;
    server 123.123.123.123:80;
}

location / {
    proxy_pass  http://myservice;
    proxy_set_header Host myservice;
}

Теперь мой сервис в вычислительном отношении очень тяжелый, и я хотел бы, чтобы nginx ограничивал количество активных параллельных (одновременных) запросов к одному бэкэнду восходящего потока, например, 10.

Я заглянул в limit_req модуль, однако этот модуль, кажется, фокусируется только на входящих запросах в минуту. Я специально хотел бы ограничить количество активный бэкэнд-соединения; т.е. учитывать, вернулись ли запросы или нет. Это вообще возможно?

В Varnish это можно сделать, например,

backend cpu1 {
  .host = "127.0.0.1";
  .port = "80";
  .max_connections = 20;
}

Однако для этого мне нужно использовать nginx.

Взгляните на limit_conn модуль. Хотя все примеры, которые я нашел, касались ограничения удаленным IP-адресом, если вы передадите константу limit_conn_zone вместо удаленного IP-адреса, вы ограничитесь общим количеством подключений к серверу.

Что-то вроде этого:

upstream myservice {
    server 127.0.0.1:80;
    server 123.123.123.123:80;
}

set $const 1;
limit_conn_zone $const zone=one:1m;

location / {
    limit_conn one 10;
    proxy_pass  http://myservice;
    proxy_set_header Host myservice;
}

Редактировать: Похоже, этот модуль доступен только в более поздних версиях nginx (возможно,> = v1.1.8). Вам может потребоваться скомпилировать из исходного кода, если вы хотите использовать эту опцию и имеете старую версию nginx.

Изменить 2: Если ваш nginx выполняет только обязанности прокси, взгляните на worker_connections

Я думаю, что вам нужны следующие параметры конфигурации:

proxy_cache_use_stale updating;
proxy_cache_lock on;

Это обслуживает устаревшие элементы из кеша и выпускает обновления из бэкэнда. Итак, когда ваш сервер серверной части страницы через 2 секунды, клиент уже получил старый ресурс из кеша.

Второй блокирует один элемент из кеша, в то время как уже выполняется запрос обновления кэша к бэкэнду, поэтому нет параллельных запросов для одного элемента кеша.

Это должно быть намного лучше, чем жесткие ограничения прокси.

Если вам по-прежнему нужны жесткие ограничения прокси для подключений, вы можете запустить nginx в бэкэнд и ограничить скорость подключений или запросов там. В противном случае вы можете попробовать установить ограничение на количество подключений с помощью iptables, которое должно работать намного лучше, чем в nginx.