记又一次通过查看日志解决服务器500内部错误(xmlrpc.php)

自从上次调整了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