我有一台服务器在Linode上运行,包括Ubuntu 10.04 LTS,Nginx 0.7.65,MySQL 5.1.41和PHP 5.3.2以及PHP-FPM。
有一个WordPress博客,最近更新到WordPress 3.2.1。
我没有改变服务器(除了更新WordPress),而且运行良好,几天前我开始停机。
我试图解决这个问题,并检查error_log我看到许多超时和消息,似乎与超时。 服务器当前正在logging这种错误:
2011/07/14 10:37:35 [warn] 2539#0: *104 an upstream response is buffered to a temporary file /var/lib/nginx/fastcgi/2/00/0000000002 while reading upstream, client: 217.12.16.51, server: www.example.com, request: "GET /page/2/ HTTP/1.0", upstream: "fastcgi://127.0.0.1:9000", host: "www.example.com", referrer: "http://www.example.com/" 2011/07/14 10:40:24 [error] 2539#0: *231 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 46.24.245.181, server: www.example.com, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.example.com", referrer: "http://www.google.es/search?sourceid=chrome&ie=UTF-8&q=example"
甚至看到以前的服务器故障讨论与可能的解决scheme:编辑/etc/php/etc/php-fpm.conf并更改
request_terminate_timeout=30s
代替
;request_terminate_timeout= 0
服务器工作了几个小时,然后再次打破。 我再次编辑文件保持原样,并重新启动php-fpm( service php-fpm restart ),但没有运气:服务器工作了几分钟,一遍又一遍地回到了问题。 奇怪的是,尽pipe服务正在运行,htop显示没有CPU负载(见图),我真的不知道如何解决这个问题。
configuration文件在pastebin上
php-fpm.conf文件在这里
/etc/nginx/nginx.conf 在这里
/etc/nginx/sites-available/www.example.com 在这里
你有没有尝试,而不是“上游”在nginx.conf做:
# Pass PHP scripts to PHP-FPM location ~* \.php$ { try_files $uri /index.php; fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; }
并再次重新启动php-fpm服务器工作几分钟,一遍又一遍地回到问题
但这不是超时。 增加超时只是给了php更多的时间来处理一个请求 – 这可能掩盖了症状,但不是正确的解决scheme。
php-fpm日志应该使服务器显得困难的原因; 根据我的经验(显然在没有信息的情况下,这是一个猜测),php-fpm日志文件将包含这样的条目:
#/var/log/php5-fpm.log [19-Oct-2014 06:25:10] NOTICE: error log file re-opened [19-Oct-2014 17:46:56] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 1 children, there are 1 idle, and 5 total children ...
如果只有像上面这样的日志条目,那不是什么大问题。 如果只有几分钟或几秒钟的时间,那么php-fpm没有足够的资源来处理它所要求的负载。
这并不罕见,因为标准的dist-php-fpmconfiguration文件将包含类似这样的内容:
# /etc/php5/fpm/pool.d/www.conf pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3
这意味着php-fpm将只能并行处理最多5个请求 。
尤其是对于像wordpress这样的单个html页面,将大量后续请求(图像,css,js文件等)也传递给php – 对于大量不断增长的请求队列来说,对于任何给定的请求,它必须首先等待处理中和已经等待的请求被首先处理。 这会导致延迟(在任何浏览器分析工具中显示为等待时间),并且经常导致大量超时。
还要注意,大量的404(请求任何不存在的东西)是一个简单的方法来夸大任何服务器的限制 – 检查并修复网站正在生成的任何404。
如果问题是php-fpm运行的服务器进程太less,只需增加它们即可。 要使用的号码取决于所部署的服务器的硬件; 这里有一个build议:
# /etc/php5/fpm/pool.d/www.conf pm = dynamic pm.max_children = 20 pm.start_servers = 10 pm.min_spare_servers = 5 pm.max_spare_servers = 15
这将允许并行服务20个请求 – 并且应该缓解任何问题而不会导致服务器挣扎。
如果有疑问,在更改php-fpm config时有一个简单的规则: