说一下我服务器的环境,linux+nginx+php+mysql,除了php使用的是5.2的版本,其他的基本都是使用最新的。安装方式采用我写的通过rpm包安装最新版php+mysql+nginx方式安装,不过实际使用的时候遇到了502及504之类的错误,还让我一兄弟认为nginx不稳定(咱自己水平不行,nginx背黑锅@#$%^&),其实不然,这里跟大家分享下解决办法过程。
502和504错误是很不同的,504错误是gateway timeout,一般是由于nginx的fastcgi参数设置问题,502是gateway bad,一般是由于php出现问题导致。所以说我个人还是很喜欢这个组合的,因为nginx/php/mysql之间层次分明,有明显的界限,很容易找到问题所在,然后进行相应的处理就行了。
1.504错误的解决办法
默认情况下nginx设置的astcgi_buffers太小,只需要设置的大一些就能解决问题。一般第一次使用nginx都会遇到这个问题,都是默认配置惹的祸。
astcgi_buffers 8 128k
上面的配置就可以解决。
2.502错误的解决办法
502错误的原因有很多,这个需要分析。我采用的是php-fpm,所有可以查看其日志找原因。日志文件的目录可以到/etc/php-fpm.conf里面查看,默认是/var/log/php-fpm.log。
可以使用service php-fpm status查看php-fpm的状态,一般都是死掉了,因此才会出现502的错误。查看上面提到的日志,日志文件竟然达到 了2G。删除日志,重启服务器并查看状态,恢复正常。
过几天,服务器又频繁的502错误了,还是查看日志文件,大小没有问题(其实上一次太草率,日志文件这么大肯定是有原因的,说明php报错很多),tail打开文件看下,里面有很多的警告,如下:
[NOTICE] fpm_children_bury(), line 215: child 2932 (pool default) exited with code 0 after 622.944289 seconds from start
祭起法宝,把错误放google里面搜索,研究一翻基本都是说默认ulimit限制导致的。查看服务器设置unlimit -n,是1024;然后查看php-fpm.conf的rlimit_files设置,也是1024.修改之:
注意,ulimit的设置有很多办法,可能系统不同有些不管用,因此要确认是否修改成功。这里的修改算是比较万能切有效的:
编辑/etc/security/limits.conf,添加以下代码后保存。重启使用ulimit -n查看修改是否有效。
* soft nofile 65535
* hard nofile 65535
上一步修成功后,把php-fpm.conf的rlimit_files也改成上面的数字,我顺便把max_requests也改了,这个数据根据你空余的内存算,一个进程基本占20m左右,能多开就多开。
接下来就是观察了,如果顺利,50x的错误就从此说byebye了……
ps:经观察,确实不管用……咋办?先检测我的设置是否起作用,在网站目录新建一php文件,代码为
echo ·ulimit -n·
通过浏览url来确定php运行环境句柄限制到底是多少,结果发现是1024,明显的是之前的设置不起作用。经过n次尝试后,最后还是在/etc/init.d/php-fpm文件里面,直接添加ulimit -HSn 65535语句解决。希望这次彻底搞定了因为文件句柄限制导致的502错误。