自从上次调整了php的参数后,Forece 的 WordPress 博客几乎就再也没出现过500错误了,不过这两天自己疯狂收到服务器宕机的错误,于是又一次大排查开始了。经过重重排查,最终发现了原来是 xmlrpc.php 这个文件搞的鬼。这里写一下排查记录。
主要问题是,网站可以偶尔打开,但是90%的情况下会出现500错误,偶尔能正常打开网站,但是10秒多钟的加载时间是无法忍受的!下边开始排查:
排查方法:
1、首先查看了服务器的内存情况,用 putty 链接上服务器后,查看内存状况,发现还有很多未使用内存,也就是说和上次内存耗尽的情况出现的 500 错误不一样。照上次一样,调整php的连接参数,无效。
2、重启 lnmp 服务 + 重启服务器的情况一样,没有任何改善。
3、查看php日志,发现这条记录,不过不管如何增加 pm.start_server 都无法改善问题,日志路径 /usr/local/php/var/log (Forece 使用的是lnmp,所以有可能和其他版本的PHP位置不一样。请根据自己情况自行寻找)
[19-Oct-2018 14:05:31] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 0 idle, and 45 total children
4、打开php中的slow log(慢记录),如果脚本超长时间,就可以自动记录到日志文件,打开方法如下:
request_slowlog_timeout = 5 slowlog = var/log/slow.log php_admin_value[error_log] = /usr/local/php/var/log/php_errors.log
然后就发现,每条记录都带这么一句:
[19-Oct-2018 14:05:32] [pool www] pid 28463 script_filename = /home/wwwroot/default/xmlrpc.php
5、网上搜寻了下关键词 xmlrpc.php + 500 错误,然后就出现了一大堆解决办法。看来问题就在这里了。
解决方案:
1. 屏蔽XML-RPC(pingback)的功能
在functions.php中添加
add_filter('xmlrpc_enabled', '__return_false');
2. 阻止pingback端口
在functions.php中添加
add_filter( 'xmlrpc_methods', 'remove_xmlrpc_pingback_ping' ); function remove_xmlrpc_pingback_ping( $methods ) { unset( $methods['pingback.ping'] ); return $methods; }
3. nginx服务器屏蔽xmlrpc.php文件
location ~* /xmlrpc.php { deny all; }
4. 通过.htaccess屏蔽xmlrpc.php文件的访问
# protect xmlrpc Order Deny,Allow Deny from all
Forece 测试了上边的几种方法,发现第四种屏蔽后,网站就无法访问了,而 Nginx 的就没事。所以 Forece 的 Appache 上边的就只在 function 中屏蔽了,而 nginx 直接用的服务器配置文件屏蔽。其实测试的时候,把 xmlrpc.php 改名后,也可以解决这个问题,不过网上有人说删除这个文件后,可能会造成 wordpress 无法正常工作。我也没试过,不过多一事不如少一事。
最后附上所有的 Log 地址:
其实所有的Log地址都可以在配置文件中找到:
可以用 find 命令找这些配置文件,如:
find / -name nginx.conf
/usr/local/nginx/conf/nginx.conf
/usr/local/php/etc/php-fpm.conf
/etc/my.cnf
Nginx:
access_log /home/wwwlogs/access.log
error log /home/wwwlogs/nginx_error.log
PHP-FPM:
/usr/local/php/var/log/php_errors.log
/usr/local/php/var/log/slow.log
MySQL:
/usr/local/mysql/var/主机名.err
MySQL 的慢日志同样需要修改my.cnf 配置文件才可以开启
修改my.cnf文件,增加或修改参数slow_query_log 和slow_query_log_file后,然后重启MySQL服务器,如下所示
slow_query_log =2 slow_query_log_file=/usr/local/mysql/var/mysql_slow.log
再附一个 LNMP 所有文件的地址:
https://lnmp.org/faq/lnmp-software-list.html