带有nginx负载均衡长请求的PHP-FPM可以阻止所有其他请求

我有三台服务器,负载平衡器运行nginx,并将PHP请求上传到运行php-fpm的两台服务器之一。

实际上,我试图首先testing并发性,因此每个PHP-FPM服务器上的php脚本显示开始和结束时间以及主机名,并且在启动时间被回显之后,它使用100%CPU 5秒钟回应结束时间。

两个服务器都不能同时对4个并发请求命中100%CPU,并且时间戳显示它们连续服务,这让我觉得nginx和fastcgi会阻塞所有并发连接。

使用100个并发连接运行ab可以在一个PHP-FPM服务器上(全部10个可用)处理所有进程,而另一个服务器完全无所事事。

nginx conf是:

upstream backend { server 192.168.1.60:9000; server 192.168.1.61:9000; } server { listen 80; server_name localhost; access_log /var/log/nginx/localhost.access.log; location / { root /var/www; index index.php; } location ~ .php$ { fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_pass backend; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name; include fastcgi_params; } } 

FCGI不要通过networking; 尽可能使用常规的ol'HTTP。 你正在进入考验不足的水域。

无论如何,我真的不build议使用nginx作为负载平衡器。 这个工作真的不是最好的(甚至是“足够好”的)工具。 我认为最好的select是Linux虚拟服务器 ,因为它对于TCP连接是透明的,而且速度很快,但是如果出于某种原因离开桌面,至less使用haproxy

我build议你做相反的事情。 将此服务器作为负载平衡器,并仅在后端执行FPMconfiguration。 如果nginx和fpm在通过套接字或本地主机进行交互的同一服务器上,则FastCGI的效果更好,所以它的设置如下所示:

  ---- backend 1 with nginx + php fpm server with two backends | ---- backend 2 with nginx + php fpm 

那样的话,如果有阻塞其中一个后端的东西,它不会影响到第二个,负载平衡器将继续为它提供服务。 即使使用dynamic设置,也要确保调整fpm儿童的数量。

如果您确实需要将其转换为FastCGI服务器而不是nginx + php-fpm框,则可以尝试在此处findnginx的公平模块。 插件评估每个后端的响应时间并分别旋转。 请注意,这将需要您重新编译nginx。

如果你不想这样做,至less要确保你没有使用ip_hash指令,因为当你请求一个基准时(因为源IP总是相同的)你不会旋转,并尝试使用least_conn (在nginx> = 1.2.2)。 更多信息在这里 。 最后,调整你的nginx标准,使用fastcgi_next_upstreamselect下一个服务器

 fastcgi_next_upstream timeout http_503 http_500 invalid_header 

以减轻过载节点的超时。 更多的, 在这里