前段时间把阿汤博客从虚拟主机迁移到了服务器,一同迁移的还有其他两个网站,开始几天没啥问题,但是过了几天,网站就会出现打不开的情况。
一开始没在意,重启了Apache服务就正常了,但是接下来一段时间频繁出现无法打开的情况,有时候两三天,有时候四五天。
出现故障的时候监听Apache错误日志,发现大量的child pid xxx exit signal Segmentation fault (11)信息。
但是此时测试80和443端口正常,访问PHP探针页面也可以正常访问,但是就是页面无法访问,一些css、js文件访问报404错误。
网上查了查,有人说child pid xxx exit signal Segmentation fault (11)是因为进程内存泄露导致的,需要调整Apache参数,MaxConnectionsPerChild不能设置为0 。
MaxConnectionsPerChild : 进程生命周期内,处理的最大请求数目。达到该数目后,进程将死掉。如果设置为0,表示没有限制。该参数的意义在于,避免了可能存在的内存泄露带来的系统问题。
但是我的Apache此参数并不是0,我也尝试改小一些,测试了两天还是会出现无法访问的情况。
然后网上又找到一些可能会导致此问题的原因:
1. 使用mmcache模块在linux x86-64上有问题
2. 由于php编译安装过程有问题,或者apache+php安装完成后,PHP又重新编译安装过,同时apache也重新编译就会产生这种现象.建议保留httpd.conf和相关配置文件后,重新安装一遍apache+PHP,注意先后顺序,如果还是会有这个提示,请更换php版本重装。
3. php的模块zend_extension和extension冲突。
4. 由于使用了APC造成的,这是这类op-code缓存优化软件共同的问题.建议用最新版本试试(http://pecl.php.net/package/APC).一旦出现,只能重起apache。
5. /tmp目录文件太多,删除后正常。
6. 配置模式为worker, 改为prefork。
7. ZendOptimizer-3.3.0 与 jdk1.7.0冲突。
8. web访问的某些特殊文件造成的,检查access_log可以看到,删除文件。
9. PHP启用了eaccelerator模块导致。
10. apahce启用了cache导致。
11. 配置文件模块冲突之类的原因。
通过一条条排查,并没有符合条件的原因。
由于故障属于偶发,排查找原因非常困难,而且此类故障原因太多。
一开始想着通过站点监控接口回调,触发脚本重启Apache服务,但是发现每次故障监控返回的都是状态200,没有触发监控。
于是就想着换nginx试试,毕竟好多年没用过Apache,对一些Apache报错和问题有些陌生了。
其实阿汤博客迁移到服务器的时候,就打算用nginx的,但是想着要去重写几个网站伪静态太麻烦就放弃了,但是没想到省了一时的麻烦,换来后面无休止的折腾。
然后花了半天时间把伪静态规则换成nginx的,然后就是替换ssl证书,本地测试成功以后,线上进行替换操作。
Apache伪静态转nginx伪静态,网上有很多工具,但是有些转换工具还是有问题的,还是需要本地多测试,不要盲目在线上操作。
WordPress的nginx伪静态规则还是比较简单的,网上有两种方案,这里贴一下我使用的WordPress的nginx伪静态规则:
if ($http_host !~ "^www.amd5.cn$"){ rewrite ^(.*)$ http://www.amd5.cn/$1 redirect; } try_files $uri $uri/ /index.php?$args; rewrite /wp-admin$ $scheme://$host$uri/ permanent;
切换到nginx运行到现在已经一周多了,一切稳定,未出现过无法访问的情况。