Как я могу настроить NGINX + PHP5-FPM для резервирования слотов подключения для определенного диапазона IP?

Во время некоторых редких пиковых нагрузок на моем сервере заканчиваются доступные дочерние PHP5 FPM (я не могу увеличить это число, не рискуя исчерпать память). Для меня несколько приемлемо, если конечный пользователь получает сообщение 503 или 504 в редком случае, но есть определенные запросы клиентов API к моему серверу, которые я хотел бы убедиться, что они всегда доступны для определенных диапазонов IP-адресов.

Можно ли как-то указать ограничение на пропуск fastcgi через запросы от определенных диапазонов IP, а затем разрешить дополнительные 5-10 «зарезервированных слотов подключения» для запросов из другого диапазона IP? Это то, о чем я думаю:

php5-fpm max children: 100
max fastcgi connections for standard IP range: 90
max fastcgi connections for "priority" IP range: 100

По существу резервирование тех последних 10 дочерних процессов для определенных клиентов.

Я думал о попытке использовать worker_connections / worker_processes за эти пределы, но с их context являющийся events нет ли способа их изменить по запросу IP?

2

Решение

Вы можете добавить другой пул и настроить nginx, чтобы использовать его для зарезервированных IP-адресов.
Недостатком является то, что клиенты из этого диапазона IP-адресов не могут использовать «общий» пул, что может быть неприемлемо в некоторых случаях.

В основном, если вы копируете:

cp /etc/php5/fpm/pool.d/www.conf /etc/php5/fpm/pool.d/www-special.conf

изменить сокет:

sed -i 's/listen = \/var\/run\/php5-fpm.sock/listen = \/var\/run\/php5-fpm-special.sock/g' \
/etc/php5/fpm/pool.d/www-special.conf

и настроить pm.max_children до 90 и 10 в каждом файле:

sed -i 's/pm.max_children = .\+/pm.max_children = 90/g' \
/etc/php5/fpm/pool.d/www.conf

sed -i 's/pm.max_children = .\+/pm.max_children = 10/g' \
/etc/php5/fpm/pool.d/www-special.conf

Вы можете использовать новый пул для выбранного диапазона IP в конфигурации nginx (не забудьте перезапустить service php5-fpm restart).

Например. с гео модуль, вы можете определить $socket в /etc/nginx/conf.d/geo.conf как:

geo $socket {
default unix:/var/run/php5-fpm.sock;
10.0.0.0/8 unix:/var/run/php5-fpm-special.sock;
}

А потом обновить fastcgi_pass Директивы использовать его:

sed -i 's/fastcgi_pass unix:\/var\/run\/php5-fpm.sock;/fastcgi_pass $socket;/g' \
/etc/nginx/sites-available/default
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]