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

建站笔记2年前 (2023)发布 小萝卜头
330 0 0
昨天突然突然觉得后台很卡,前台由于开了 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规则

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

收录于{张戈博客} 原文链接原文链接

© 版权声明

相关文章

暂无评论

暂无评论...