关于一例子cpu100%的处理方法

背景:

一家网站,帝国程序CMS,网站发布内容数据较多,症状是8核心cpu常常都满载

top 查看的情况是 php-cgi 进程满载,判断可能是1)访问量大或者被攻击,2)php代码问题

网站经过CDN,按理说,不应该造成大量的访问,出现问题完全是php代码访问造成,

本来服务器运行的是 spawn-cgi 来启动的php-cgi进程 , 后来改为php-fpm 也仍然是cpu满载,判断问题在php程序,开启 php-fpm 的slow.log 功能,把运行缓慢的php代码,记录起来立刻发现了问题!!!

根据slow.log 的情况,发现是一些更新网页代码,被当作 script 脚本 在网页里面,而那个更新脚本运行缓慢,当大量用户来的时候,造成了cpu满载,经过更换脚本名称,cpu立刻下降到正常水平。

解决方案:

把一些更新操作用linux的定时任务去完成,从而避免了放到网页里面。

关于最近网络攻击防护的总结

一些服务器出问题,如服务器死机,如网站瘫痪,如被挂木马

整体思路是 如果正在攻击的服务器,就查看当前的 webserver 的log ,根据特征进行屏蔽

有的是 user-agent 一致 有的是 ip 一致,有的是 refer 一致

apache的相应设置可以做如下调整

BrowserMatchNoCase 特征1 bad_bot
BrowserMatchNoCase 特征2 bad_bot
Order Deny,Allow
Deny from env=bad_bot

可以写到 .htaccess 或者配置文件里面
关于特征字串有几点要说的 就是括号和加号 需要加\ 斜线
比如
"Mozilla/5.0 \(compatible; Googlebot/2.1; \+http://www.google.com/bot.html\)" 
才可以
同样也可以用rewrite 方法来对付这些
RewriteCond %{HTTP_USER_AGENT} "特征串1"
RewriteRule ^(.*)$ http://127.0.0.1
RewriteCond %{HTTP_USER_AGENT} "特征串2"
RewriteRule ^(.*)$ http://127.0.0.1
用的参数很多
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritecond

针对对特定user-agent 的apahce,nginx攻击的防护

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} “^特征字符串正则表达式$”
RewriteRule ^(.*)$ http://127.0.0.1

 

nginx 的配置如下

if ( $http_user_agent = “特征串”) { return 444; };
或者
if ( $http_user_agent ~* “特征串”) { return 444; }

注意特征串如果这正则情况下  斜线 / 括号 () 都是要加斜线的