如何配置 NGINX + PHP5-FPM 为特定 IP 范围保留连接槽?
How can I configure NGINX + PHP5-FPM to reserve connection slots for a specific IP range?
在一些罕见的高峰使用期间,我的服务器用完了可用的 PHP5 FPM 可用子级(我不能进一步增加这个数量而不冒 运行 内存不足的风险)。如果最终用户在极少数情况下收到 503 或 504 消息,这对我来说是可以接受的,但是有特定客户端 API 对我的服务器的请求,我想确保某些 IP 地址始终可以访问这些请求范围。
我有什么方法可以指定对来自特定 IP 范围的请求的 fastcgi 传递的限制,然后允许来自另一个 IP 范围的请求额外的 5-10 "reserved connection slots"?这就是我的想法:
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 范围的客户端无法使用 "common" 池,这在某些用例中可能是不可接受的。
基本上,如果你复制:
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
您可以在 nginx 配置中为选定的 IP 范围使用新池(不要忘记重新启动 service php5-fpm restart
)。
例如使用 geo 模块,您可以将 /etc/nginx/conf.d/geo.conf
中的 $socket
定义为:
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
在一些罕见的高峰使用期间,我的服务器用完了可用的 PHP5 FPM 可用子级(我不能进一步增加这个数量而不冒 运行 内存不足的风险)。如果最终用户在极少数情况下收到 503 或 504 消息,这对我来说是可以接受的,但是有特定客户端 API 对我的服务器的请求,我想确保某些 IP 地址始终可以访问这些请求范围。
我有什么方法可以指定对来自特定 IP 范围的请求的 fastcgi 传递的限制,然后允许来自另一个 IP 范围的请求额外的 5-10 "reserved connection slots"?这就是我的想法:
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 范围的客户端无法使用 "common" 池,这在某些用例中可能是不可接受的。
基本上,如果你复制:
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
您可以在 nginx 配置中为选定的 IP 范围使用新池(不要忘记重新启动 service php5-fpm restart
)。
例如使用 geo 模块,您可以将 /etc/nginx/conf.d/geo.conf
中的 $socket
定义为:
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