Nginx的php-fpm池被阻止并停止响应

我有一些请求页面没有得到回应请求花费很长时间来处理的问题。

我有nginx设置使用php-fpm。 我有两个PHP-FPM设置池。 一个普通的网页请求池,一个池来提供图像和其他大型文件。

从我的php-fpmconfiguration文件:

[www] listen = var/run/php54/php-fpm-www.sock pm = dynamic pm.max_children = 20 pm.start_servers = 4 pm.min_spare_servers = 4 pm.max_spare_servers = 20 pm.max_requests = 200 [www-images] listen = var/run/php54/php-fpm-images.sock pm = dynamic pm.max_children = 5 pm.start_servers = 1 pm.min_spare_servers = 1 pm.max_spare_servers = 2 pm.max_requests = 40 

Nginxconfiguration为使用这两个独立的池,请求存储在Amazon S3中的图像通过“www-images”池重新调整为所需大小。 从我的nginxconfiguration文件:

 location ~* ^/proxy { try_files $uri @404; fastcgi_pass unix:/opt/local/var/run/php54/php-fpm-images.sock; include /opt/local/etc/nginx/fastcgi.conf; } location / { try_files $uri /routing.php?$args; fastcgi_pass unix:/opt/local/var/run/php54/php-fpm-www.sock; include /opt/local/etc/nginx/fastcgi.conf; } 

因为我正在testing一个可怕的互联网连接,这些请求将在PHP中超时,这是预期的。

当读取来自上游的响应头时,客户端:127.0.0.1,服务器:example.com,请求:上游超时(60:操作超时) “GET /proxy/hugeimage.png HTTP / 1.1”,上游:“fastcgi:// unix:/opt/local/var/run/php54/php-fpm-images.sock:”,主机:“example.com” ,推荐人:“ http://example.com/pictures ”

什么是不期望的,我想解决的是,任何应该到“www”池的请求都是由于nginx没有得到来自PHP-FPM的响应而超时。

2013/01/20 15:50:06 [error] 77#0:* 532上游超时(60:操作超时),从上游读取响应头时,client:127.0.0.1,server:example.com,request: “GET / pictures HTTP / 1.1”,上游:“fastcgi:// unix:/opt/local/var/run/php54/php-fpm-www.sock:”,主机:“example.com”

几分钟后,请求“www”池再次开始工作,而我没有采取任何行动。

我认为使用单独的池应该意味着,即使一个池有长时间请求的问题,另一个池应该保持不受影响。

所以我的问题是, 我如何隔离这两个池,以便一个池被超时请求所淹没,而不会影响另一个池。

为了澄清,我想通过devise来限制通过“www-images”池一次可以进行的请求的数量。 尽pipe在实践中这个限制几乎不可能达到(由于从S3下载到服务器的文件的caching),如果存在一个不寻常的情况,那个池到达极限,我希望www pool继续运行,因为这是网站function实际在哪里。

我发现了两件事情:

  1. 添加session_write_close(); 到任何长时间运行的PHP脚本,因为会话数据被locking以防止并发写入,只有一个脚本可以随时在会话上操作。
  2. 对于任何可能加载缓慢的图像,请确保从不同于您提供网页和Ajax调用的域中加载它们,因为Web浏览器会将请求排列到同一个域,请求激活。

虽然这些是两个独立的东西,但是它们对向“www”池的请求阻塞的效果相同。