Во время некоторых редких пиковых нагрузок на моем сервере заканчиваются доступные дочерние 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?
Вы можете добавить другой пул и настроить 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
Других решений пока нет …