执行PHP操作大文件insert mysql数据库时,出现这个错误提示
The page you are looking for is temporarily unavailable.
Please try again later.
set_time_limit(0)不限超时已经设置,并且PHP.INI中的错误提示已经打开,但还是出现上面的提示。
于是,查看nginx的错误日志,发现这个错误
2014/02/11 15:51:09 [error] 6085#0: *403 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.0.34, server: admin38.xx.com, request: "GET /osstest/fread.php?id=98 HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "admin38.xx.com:1010"
好象是超时了。。
于是 修改nginx的配置文件conf
报这个错误之后,整个服务器就不响应了,但是nginx后面的webpy程序没有任何错误,后端的数据库也很正常,从网上查了很多资料,都是说要修改proxy_read_timeout,proxy_send_timeout和proxy_buffer几个相关设置的值。
如下配置,要放在server配置节之内
large_client_header_buffers 4 16k;
client_max_body_size 30m;
client_body_buffer_size 128k;
#proxy_connect_timeout 300;
#proxy_read_timeout 300;
#proxy_send_timeout 300;
#proxy_buffer_size 64k;
#proxy_buffers 4 32k;
#proxy_busy_buffers_size 64k;
#proxy_temp_file_write_size 64k;
fastcgi_connect_timeout 300;
fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 32k;
fastcgi_busy_buffers_size 64k;
fastcgi_temp_file_write_size 64k;
你可以看到上面是proxy_和fastcgi_两种配置,就是说如果你的nginx后面是proxy,就设置proxy相关的配置,如果是fastcgi就设置fastcgi相关的配置。
这里可以设置最大,如100000,这里规定了PHP-CGI的连接、发送和读取的时间,300秒足够用了,因此我的服务器很少出现504 Gateway Time-out这个错误。最关键的是php-fpm.conf的设置,这个会直接导致502 Bad Gateway和504 Gateway Time-out。
下面我们来仔细分析一下php-fpm.conf几个重要的参数:
php-fpm.conf有两个至关重要的参数,一个是”max_children”,另一个是”request_terminate_timeout”
我的两个设置的值一个是”40″,一个是”900″,但是这个值不是通用的,而是需要自己计算的。
计算的方式如下:
如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接 将”request_terminate_timeout”设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一 点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你 给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟 -30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。
而”max_children”这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就 会很少。设置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左 右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于 我的有效内存1Gb。而如果我的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间 也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。
fastcgi_read_timeout 300s;
为防止万一,我在nginx.conf默认配置文件中也修改了最大时间。
- fastcgi_connect_timeout 100000;
- fastcgi_send_timeout 100000;
- fastcgi_read_timeout 100000;
- fastcgi_buffer_size 64k;
- fastcgi_buffers 8 64k;
- fastcgi_busy_buffers_size 64k;
- #fastcgi_temp_file_write_size 64k;
做了上面2个设置后,重启一下
/usr/local/nginx/sbin/nginx -s stop //关闭服务器
/usr/local/nginx/sbin/nginx 开启服务器
php-fpm重启
killall php-fpm
再执行(usr/local/php是php的安装目录)
/usr/local/php/sbin/php-fpm
NGINX反代理超时报错,解决方法:
server {
listen 80;
server_name *.xywy.com ;
large_client_header_buffers 4 16k;
client_max_body_size 300m;
client_body_buffer_size 128k;
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
proxy_buffer_size 64k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
........................
}