网站建设

百度蜘蛛狂暴了!再次启用本地缓存,附nginx下wp super cache的mod_rewrite规则

Jager · 9月2日 · 2014年 5210次已读

昨天突然突然觉得后台很卡,前台由于开了360cdn倒没什么感觉。于是登录vps看了下access.log和netstat,发现BaiduSpider并发100+爬我的博客!搞的好像被攻击了一样,(/ □ \)。。。

百度蜘蛛狂暴了!再次启用本地缓存,附nginx下wp super cache的mod_rewrite规则 百度蜘蛛狂暴了!再次启用本地缓存,附nginx下wp super cache的mod_rewrite规则

 

补充:今天我特意看了下昨天的百度抓取情况,又吓了一跳:

百度蜘蛛狂暴了!再次启用本地缓存,附nginx下wp super cache的mod_rewrite规则

虽然开了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模块丢失,但并不影响缓存页面的访问:

百度蜘蛛狂暴了!再次启用本地缓存,附nginx下wp super cache的mod_rewrite规则

要验证效果,很简单,直接访问文章页面,查看源代码即可:

百度蜘蛛狂暴了!再次启用本地缓存,附nginx下wp super cache的mod_rewrite规则

好了,这下百度蜘蛛再狂暴,也只能吃服务器的“残羹冷炙”了。

40 条回应
  1. ijustplay 2014-9-2 · 17:05

    你的站点速度好像有点慢诶,每次加载博客联盟-成员导航的时候都得延时

  2. ijustplay 2014-9-2 · 17:21

    已添加规则成功!

    • Jager 2014-9-2 · 19:44

      最欣赏的就是你这种执行力~

  3. 热腾网 2014-9-2 · 17:22

    看来,百度看上你了。

    • Jager 2014-9-2 · 19:44

      哈哈,但愿如此。

  4. PHP二次开发 2014-9-2 · 20:11

    要爆发了。

    • Jager 2014-9-2 · 20:16

      也可能是K站的前奏~

      • 热腾网 2014-9-2 · 20:43

        能放出来就行,又没作弊,应该不会。

        • Jager 2014-9-2 · 21:35

          这个月搬了四五次家。

          • 热腾网 2014-9-2 · 22:13

            这次玩的够凶的。会不会百度对网站的压力测试?

        • Jager 2014-9-2 · 21:35

          这个月搬了四五次家。

  5. 球球 2014-9-2 · 21:24

    百度喜欢你是好事呀

    • Jager 2014-9-2 · 21:35

      不开缓存,真的扛不住,毕竟zgboke那个站也放在这vps上。。

      • 球球 2014-9-2 · 21:56

        我还没看过我的站点百度蜘蛛的访问情况,说实话,我还不晓得IIS里面怎么看。。

  6. 一昕精选 2014-9-2 · 21:30

    百度看上你了

    • Jager 2014-9-2 · 21:36

      那就好咯~

  7. 一昕精选 2014-9-2 · 21:30

    百度看上你了

  8. 微历史 2014-9-3 · 6:25

    真是善于分析并改进的人,佩服

    • Jager 2014-9-3 · 22:18

      谬赞了

  9. 圆月博客 2014-9-3 · 15:50

    什么问题到了张哥这里就不是问题

    • Jager 2014-9-3 · 22:19

      一样很折腾人啊。

  10. musk 2014-9-3 · 16:49

    HotNews Pro 不兼容WP Super Cache吧

  11. Phnomi 2014-9-3 · 16:50

    好厉害!佩服

  12. 张盖盖博客 2014-9-5 · 10:41

    博主好流弊啊。博客感觉非常好。

  13. pptv官方下载 www.ipptvs.com 2014-9-10 · 21:55

    蜘蛛喜欢你的博客啊

  14. 完美世界 2014-9-12 · 11:09

    好吧,蛛蛛现在都不过来了。 伤心

  15. 完美世界 2014-9-12 · 11:10

    那个啥 cos html cache 才是真正的静态吧。

    • Jager 2014-9-12 · 11:19

      新版wp-super-cache也能生成纯静态html文件了。

  16. 电子商务文摘 2014-10-17 · 13:16

    源码小白 支持一下

  17. 一品元素 2014-10-30 · 21:57

    不知道博主发现没?启用缓存插件后,网站的链接上带斜杠与不带斜杠不会自动跳转了,就比如你https://zhang.ge/4351.html 与https://zhang.ge/4351.html/ 有时候搜索引擎会同时收录这2种格式的页面

    • Jager 2014-10-30 · 22:09

      非常感谢你的提醒,确实存在这个情况,虽然不知道有什么负面影响,但应该是有SEO隐患的,所以我在Nginx里面新增了一条规则,如果你在html后面加了斜杠/,那么将自动301跳转到不加斜杠的html,具体你可以在这个页面测试效果。

      nginx伪静态规则如下:
      rewrite ^/(.*).html/$ /$1.html permanent;

      明天我找个时间整理一下分享一下,再次感谢你的提醒。

      • 一品元素 2014-10-30 · 23:49

        其实我也纠结过这个问题,不过我的是apche,不知道apche规则该怎么写??

      • 一品元素 2014-10-31 · 0:07

        并且分类,tag,page页面都有这个问题,你可以试试https://zhang.ge/about/////////////////////// 后面好多个斜杠的地址

        • Jager 2014-10-31 · 11:31

          今天发文章分享下,你到时候再看代码。
          页面的多个斜杠,你就没必要纠结了,你看卢松松的留言板,多加几个斜杠,还不是正常访问,应该每个网站都有这个问题。
          我只是觉得html后面加斜杠,有点不伦不类。

          其实还有种更简单的做法:
          编辑robots,禁止抓取这种形式即可:
          Disallow: /*//
          Disallow: /*.html/

  18. 幻杀博客 2014-12-31 · 20:33

    这么强!

  19. 生化培养箱 2015-1-9 · 13:56

    让百度蜘蛛来的更加猛烈些吧,哎,蜘蛛啊蜘蛛你怎么不听话呢!

  20. 粉丝 2015-9-17 · 9:20

    不知道是不是这个规则少了定时发布的规则?定时发布,文章发布了,首页缓存不更新!不知道咋回事,但是手动更新后台文章,首页就会有新缓存出现!

    • Jager 2015-9-17 · 9:34

      定时发布是没有清理动作,自己百度研究研究

  21. 阿木 2017-2-7 · 20:48

    另外还要设置插件高级 下面的 已拒绝的用户代理(User Agent) 去掉spider吧