早上突然发现网站出现 502 Bad Gateway 的 Nginx 提示,我以为是 Apache 服务宕掉了,进入 Plesk 后台,在服务管理里面,发现 Apache 和 Nginx 服务都是运行中,并且把这两个服务重启之后,故障依旧。
我网上搜了一下,发现 fail2ban 会导致此错误,我查看了 fail2ban,发现本机的内网 IP 地址被 plesk-apache-badbot 拦截了。
解决方法很简单,把 IP 添加到“可信任的 IP 地址”即可。
稍微研究了一番,发现 plesk-apache-badbot 是分析网站的访问日志,然后阻止垃圾邮件和网络爬虫,我们可以在“管理过滤器”里面看到具体的规则,发现规则里面有好几条与搜狗蜘蛛有关的,但与这次遇到的问题应该没有关系。
问题来了,如果匹配了蜘蛛,那么阻止的应该是蜘蛛的 IP,怎么会把本机的内网 IP 给屏蔽了?发现 plesk-apache-badbot 不仅仅分析了网站的访问日志(/var/www/vhosts/system/*/logs/*access*log),还分析了 Apache 的访问日志(/var/log/httpd/*access_log),原来,直接访问服务器的外网 IP 地址,会在 Apache 的访问日志中增加一条访问记录,IP 记录为服务器的内网 IP 地址,因此我怀疑是一些扫描器,伪装成蜘蛛,扫描了我的 IP,然后被 plesk-apache-badbot 匹配,就被屏蔽了。
那么另外一个问题又来了,Plesk 前端是 Nginx,再把请求给 Apache,直接访问服务器的 IP,到底是 Apache 还是 Nginx 进行回应?
通过 curl -I
查看到,server 是 nginx,那么,是不是在直接 IP 访问的时候,nginx 没有把源 IP 传递给 Apache 导致的呢?
查看了 nginx 的 access log (/var/log/nginx/access.log),发现日志中记录的是访问者的 IP,那怀疑,nginx 在请求 Apache 的时候,没有把源 IP 传递给 Apache,而是把自己的 IP 传递给了 Apache 了。
不知道我的分析是否正确,还是 Plesk 的 bug,目前的解决办法就是把 IP 添加到“可信任的 IP 地址”。对于直接访问 IP 的情况,在 Plesk 安全设置文章中有介绍,可以隐藏真实情况,伪装成 Windows 的服务器。