前段时间wordpress登陆后点击导航栏的目录分类按钮就会出现页面502错误,在网上查找了大量的帖子,但都没有找到能够解决的办法,最后一个查看错误日志,偶然发现了错误的原因,并解决,以本篇文章记录,如果有相同问题的朋友可以参考,或许能够多一条思路。
一、PHP5.2版本问题
刚发现页面502问题时查阅了网上的文章,基本上都说是Wdcp面板+nginx+php5.2版本引起的wordpress不兼容问题,最关键原因是php版本太低。因为这是一个技术达人写的文章,所以转载量巨大,从而导致很多像我一样的技术小白以为502很大程度上都是因为这个原因造成的。所以我也升级了php版本,从php5.2.17升级到了5.3.27,但问题依然存在,因此排除了这个可能性。
以下是网上相关文章,基本上都大同小异:
LNMP的制作者军哥说,
只有在centos 6 下 php 5.2.17 + wordpress 3.8.1下会502php 5.3下没问题
但实际上,我现在的wordpress版本也出现了同样的问题,所以应该是PHP5.2的原因!
提醒使用LNMP一键安装的朋友们,如果你想不出现502 Bad Gateway错误,建议安装PHP 5.3版本吧!!
二、将unix套接字改成tcp/ip
对于这种修改方法的原理一直没有弄懂,但修改后问题依然存在。
具体方法如下:
修改/usr/local/php/etc/php-fpm.cnf将< value name=”“listen_address””> /tmp/nginx.socket< /value>里面的
/tmp/nginx.socket
修改成
127.0.0.1:9000
同时将/usr/local/nginx/conf/nginx.conf 及其/usr/local/nginx/conf/vhost/ 下面的虚拟主机配置里的
fastcgi_pass unix:/tmp/php-cgi.sock;
修改成
fastcgi_pass 127.0.0.1:9000;
之后,重新启动LNMP。
三、将libsqlite3.so.0.8.6改名
这种方法的原理是libsqlite3.so.0.8.6文件出错才导致的502错误,因此修改文件后缀,从而解决问题,但我通过这种方法依然没有解决问题。
以下为修改方法:
32位的修改如下
mv /usr/lib/libsqlite3.so.0.8.6 /usr/lib/libsqlite3.so.0.8.6.bak
64位的修改如下
mv /usr/lib64/libsqlite3.so.0.8.6 /usr/lib64/libsqlite3.so.0.8.6.bak
四、增加php-cgi进程数
虽然我个人修改php-cgi进程数并没有解决问题,但我依然觉得这个比较有用,根据主机性能优化配置也很有用。
下面为修改方法:
在安装好使用过程中出现502问题,一般是因为默认php-cgi进程是5个,可能因为php-cgi进程不够用而造成502,需要修改/usr/local/php/etc/php-fpm.conf 将其中的max_children值适当增加。
这个根据自己主机情况而定,一般一个进程大约耗费20m内存,但也要耗费其他资源,所以不能无限的接近内存上限。一般建议1G内存最多设置15个,2G内存最多设置40个,4G内存最多设置100个。这些数据都来自于网上教程,我个人并没有全部尝试,且网上教程推荐根据自己的主机情况从小到大挨着尝试,一直到最佳状态。我是2G主机,设置30个运行稳定,并没有尝试40个。
五、php.ini里设置max_execution_time
修改修改/usr/local/php/etc/php.ini文件的max_execution_time,就是进程执行的最大超时时间,理论上如果主机性能足够好可以设置成0,即永远执行,但当错误进程一直执行而得不到释放时也可能导致502错误,因此需要根据主机性能来设置。我个人2核2G主机设置为300秒。
同时需要说明的是eaccelerator配置项一定要放在Zend Optimizer配置之前,否则也可能引起502 Bad Gateway。
六、修改nginx.conf文件的fastcgi_buffers 和 fastcgi_buffer_size 两个值控制
以下为网上教程,我也是按照这个教程设置好的,很详细。
先简单的说一下 Nginx 的 buffer 机制,对于来自 FastCGI Server 的 Response,Nginx 将其缓冲到内存中,然后依次发送到客户端浏览器。缓冲区的大小由 fastcgi_buffers 和 fastcgi_buffer_size 两个值控制。 比如如下配置:
fastcgi_buffers 8 4K;
fastcgi_buffer_size 4K;
fastcgi_buffers 控制 nginx 最多创建 8 个大小为 4K 的缓冲区,而 fastcgi_buffer_size 则是处理 Response 时第一个缓冲区的大小,不包含在前者中。所以总计能创建的最大内存缓冲区大小是 8*4K+4K = 36k。而这些缓冲区是根据实际的 Response 大小动态生成的,并不是一次性创建的。比如一个 8K 的页面,Nginx 会创建 2*4K 共 2 个 buffers。 当 Response 小于等于 36k 时,所有数据当然全部在内存中处理。如果 Response 大于 36k 呢?fastcgi_temp 的作用就在于此。多出来的数据会被临时写入到文件中,放在这个目录下面。同时你会在 error.log 中看到一条类似 warning。
显然,缓冲区设置的太小的话,Nginx 会频繁读写硬盘,对性能有很大的影响,但也不是越大越好,没意义,呵呵!
我的主机nginx.conf中原来并没有这两行代码,所以当也买你超过缓冲大小的时候就出现了502错误,在nginx.conf中加入以下代码即可解决问题,当然代码中的数值可以根据自己的主机进行调节,从小到大挨着试,直到解决问题:
fastcgi_buffer_size 512k;
fastcgi_buffers 6 512k;
fastcgi_busy_buffers_size 512k;
fastcgi_temp_file_write_size 512k;
fastcgi_intercept_errors on;
七、其他问题
1、插件冲突也可能导致502错误,因此最简单的办法就是先关闭所有插件试试,但有时关闭插件依然不能避免插件冲突,这时可以FTP登录,将/wp-content/plugins/的plugins文件夹改个名,然后再看是不是好了,如果好了就有可能是插件问题,将插件逐一移动到plugins文件夹并启用,看是那个插件问题。
2、日志文件过大也有可能导致502错误,因此查看下日志文件的大小也很有必要,具体查看方法百度吧。但根据网上帖子的经验应该日志文件超过1G才会出现502,但这个只是经验,并不完全正确。
3、磁盘空间不足也会出现502错误,需要清理磁盘,后者增加磁盘空间。
4、wordpress主题配置有错误也有可能导致502,这一错误可以通过更换主题来检测,但这个方法并不一定有用,就拿我的网站问题来说,更换主题后502错误立马消失,但最终的错误却不是因为主题本身,而是因为使用主题后页面变得太大,超过了nginx的缓冲区大小。
5、据说伪静态规则写法错误也会出现502错误,但这个问题比较好判断,因为这种502在不使用插件和任一主题的情况下都会出现,这种502错误直接更换伪静态规则即可。
6、数据库表错误也会出现502错误,这个需要查看错误日志文件确定。
八、应该先详细的查看系统日志
无论是什么原因导致的502都应该详细的查看系统日志,日志里会记录502错误的原因,如果看不懂可以问别人或者百度解决,这一点是我解决问题后才总结出来的。也许这就是菜鸟的学费,为这个502折腾了很久,也学会了不少东西,在将要放弃折腾的时候却找到了原因,就是根据一条日志警告知道的。
九、菜鸟可以选择LAMP环境
相对而言wordpress在LAMP环境下问题较少,不用太为服务器环境折腾,我也是当初选择服务器环境时查看论坛说是LNMP环境运行效率更高才选择的,其实并不会出现能够感觉的到的区别,如果真的因为环境问题影响效率了直接升级服务器硬件就行了。但是对于已经选择LNMP的人来说并不建议切换成LAMP,因为切换后同样会出现问题,而这种问题排除起来同样很麻烦。
linux服务器需要学习的东西很多,需要投入大量的精力来完善自己的知识,如果流量小还是购买虚拟机比较方便,环境已经配置好,不用自己再折腾。
当然对于使用wordpress人来说有相当一部分都是陶醉于折腾之中,虽然这不会产生一分钱的收益,但也同样乐此不疲。主题、插件、服务器环境都需要不断的摸索,与其说是乐趣在于写博客,还不如说是在不断学习中寻找自我突破的满足,就像大多数人的博客一样,日访问量不会突破100IP,但却依然坚持各种优化,只为让博客看起来更讨自己喜欢。