Nginx服务器CPU负载高的排查及解决方法

工作使我快乐,这句话说出来我自己都不信,工作中总会有解决不完的问题,往往前一个Bug解决了,后一个Bug就接踵而来,我们不是在解决Bug,就是在解决Bug的路上。但是,也正因为这种不断的解决问题,不断的突破,才对这份工作有了乐趣,并为之努力。
其实对于每一个项目来说,她就像是我们的“孩子”一样,总想让他变得好一点,再好一点…

背景

为了杜绝不良网名对我们的服务器IP进行直接访问,我在nginx配置那里做了一些“小小的”调整,如下:

server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name _;

rewrite ^(.*)https://zzzdc.com permanent;
}

大家估计也看出来了,就是我想让不明地址、IP访问都跳转到我们主站上。

表现

重启nginx服务后,我们服务器上所有存在的网站访问就出问题了。具体表现为:只要访问任何一个存放在服务器上的网站,服务器的CPU立马高负载(15~20%),导致再次访问时会进入一直pedding状态。
这可不行啊,要知道我们所有的网站都是在百度上投放信息流广告的,一旦网站出现问题,百度就会据登广告,这将会给广告商带来大大的损失,于是我放下了手头的工作,马上进行了排查。

过程

首先,我以为是近期更新网站时代码里某一处出了错误,于是我关掉了进行更新过的插件,然而,问题依旧存在;
然后,不是代码的问题,那可能是php-fpm进程太多导致的?查看了一下php-fpm的错误日志,都是一些Notice,并没有Erroor,所以这里也可以排除掉;
那么,再就是用户量太大?看一下Zabbix监控吧,发现CPU负载从早上10.30开始一直高负荷;那再看一下网站流量吧,从前一天晚上11点开始后就有大量的流量进来,也就是用户量激增到平时的十多倍。
昨晚11点干啥了?就是改nginx的配置了啊,那改了哪一处呢?病原在这儿:

rewrite ^(.*)https://zzzdc.com permanent;

我理解的是他把无效域名和IP都转发到了我们的主战,从而引来了大量的不速之客(大流量),占完了CPU资源,导致后面进来的用户就会pedding状态,把这里改一下:

server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name _;

return 444
}

总结

工作使我快乐,善待每一次线上版本的修改及理清处理问题的排查思路,今天就到这儿了。