虽然开了 360CDN,但是对于搜索引擎的访问,360 是直接回源的,所以蜘蛛的狂暴抓取压力就全部到了 vps 上了,CPU 负载直接飙至 14+,top 里面 php-fpm 进程好生壮观,吓…
想了下,决定给本地来个静态缓存,让蜘蛛只能爬静态页面,减少 php-fpm 负载。首先装了一个 Hyper Cache 插件,发现新版的居然可以生成纯静态页面了,还挺欣喜的!观察了半小时,发现 html 是生成了,但是 php-fpm 占用依然很高!奇怪啊…
纳闷了半天,突然想起来,nginx 本身不带 Mod rewrite,那这 Hyper Cache 的静态重定向都是靠 php 实现的咯?我去,那前端访问还是把压力集中在 php 上了。
想起了一起用过的 wp-super-cache 是有 Mod rewrite 模式的,于是又换成 WP Super Cache 试了下,突然醒悟,Nginx 并没有 Apache 的 Rewrite_mod 模块。网上看了下前人总结的教程,通过在配置文件里面加入规则实现了和 Mod rewrite 一样的功能:
只要将以下代码中的 2~57 行添加到网站对应的 nginx location 中即可:
location / { # 如果请求的文件已存在,直接返回 if (-f $request_filename) { break; } set $supercache_file ''; set $supercache_uri $request_uri; set $supercache 1; set $ihttp_host ''; if ($request_method = POST) { set $supercache 0; } # 仅在访问文章永久链接时使用静态文件,请求中带参数则不使用静态缓存 set $qs 0; if ($query_string) { set $qs 1; } # 不过从 twitter, facebook, feedburner 链接点过来的,总是带参数,这些访问仍然可以使用静态文件 if ($query_string ~* "^utm_source=([^&]+)&utm_medium([^&]+)&utm_campaign=([^&]+)(&utm_content=([^&]+))?$") { set $qs 0; set $supercache_uri $document_uri; } #deactivate on high load if ($qs = 1) { set $supercache 0; } # 针对已登录用户(发表过评论),可以不静态化。在访问量高峰时可注释掉 if ($http_cookie ~* "comment_author_|wordpress|wp-postpass_" ) { set $supercache 0; } # 支持移动设备,访问移动版本的网页缓存 if ($http_user_agent ~* '(iphone|ipod|aspen|incognito|webmate|android|dream|cupcake|froyo|blackberry9500|blackberry9520|blackberry9530|blackberry9550|blackberry 9800|webos|s8000|bada)') { set $ihttp_host '-mobile'; } # 指定静态缓存文件的路径 if ($supercache = 0) { set $supercache_uri ''; } if ($supercache_uri ~ ^(.+)$) { set $supercache_file /wp-content/cache/supercache/$http_host$1/index${ihttp_host}.html; } # 只有当缓存文件存在时,才进行 rewrite if (-f $document_root$supercache_file) { #rewrite ^(.*)$ $supercache_file break; rewrite ^ $supercache_file last; } # 所有其他请求,转给 wordpress 处理 if (!-e $request_filename) { rewrite . /index.php last; }
(代码出处:http://www.gongzi.org/nginxstartwp-super-cache-mod_rewrite.html)
由于我用的多说,所以其中 30~33 行是屏蔽的,直接全部展示缓存好了。
然后在回到 WP Super Cache 设置界面,跟往常一行开启 Mod rewrite 缓存模式即可,虽然插件会提示 Mod rewrite 模块丢失,但并不影响缓存页面的访问:
要验证效果,很简单,直接访问文章页面,查看源代码即可:
好了,这下百度蜘蛛再狂暴,也只能吃服务器的“残羹冷炙”了。