为站点添加缓存;避免Web频繁请求数据库
起因是我的个人博客长期频繁被爬虫扫描,致使Typecho和数据库之间一直存在800kb/s的带宽占用,索性为站点添加页面缓存,以避免爬虫扫描站点,站点一直请求数据库的这一个问题。
开启 OpenResty 全局缓存池
我们需要先在服务器上划出一块内存或硬盘空间,用来存放缓存的网页。
在OpenResty配置中,找到http {这一行,在它的正下方,随便找个空行,粘贴以下代码:
# 定义一个名为 typecho_cache 的缓存池,放在 /tmp 目录下,最大 1GB,缓存 1 天
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=typecho_cache:50m inactive=1d max_size=1g;这条配置需要在include语句之前添加,否则会遇到死锁问题。
http {
# ... (上面其他的代码保持原样) ...
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
# === 注意:必须在 include 的上方 ===
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=typecho_cache:50m inactive=1d max_size=1g;
# 下面这三行是原本就有的 include
include /usr/local/openresty/nginx/conf/conf.d/*.conf;
include /usr/local/openresty/nginx/conf/default/*.conf;
include /usr/local/openresty/1pwaf/data/conf/waf.conf;
}
在对应站点应用缓存池
现在我们要告诉 Nginx,哪些页面可以缓存(首页、文章),哪些不能缓存(后台、评论提交)。
编辑对应站点的配置文件,因为我站点使用的是Typecho,所以还需要跳过例如POST请求、后台、搜索、操作页面。
在 server { ... } 块里面,但在 location / { ... } 的上方,添加以下判定代码:
# === 缓存跳过规则定义 ===
set $skip_cache 0;
# 1. POST请求不缓存(提交评论、登录时必须穿透)
if ($request_method = POST) {
set $skip_cache 1;
}
# 2. Typecho 后台、搜索页、操作页不缓存
if ($request_uri ~* "/admin/|/action/|/search/") {
set $skip_cache 1;
}
# 3. 如果浏览器带有 Typecho 的登录 Cookie,说明是你自己登录了,不缓存
if ($http_cookie ~* "typecho_") {
set $skip_cache 1;
}随后往下滚动,找到含有 proxy_pass 的那个大括号块(通常是 location / { ... } 或者反向代理的 location)。在这个大括号里面,添加以下代码:
# === 开启代理缓存 ===
proxy_cache typecho_cache;
proxy_cache_valid 200 301 302 1d; # 正常状态码缓存 1 天
proxy_cache_bypass $skip_cache; # 命中上方跳过规则时,不使用缓存
proxy_no_cache $skip_cache; # 命中上方跳过规则时,不生成缓存
proxy_cache_key $scheme$request_method$host$request_uri;
# 在浏览器响应头中增加一个标记,方便我们测试缓存是否生效
add_header X-Cache-Status $upstream_cache_status;保存、重载后生效。
确认缓存生效
第一次访问需要生成缓存:打开浏览器的无痕模式(确保没有你的登录 Cookie),访问你的博客首页。按 F12 打开开发者工具,看 Network 里的第一个请求头,里面会有个 X-Cache-Status: MISS(意思是第一次没命中,刚刚去生成了)。
第二次访问(命中缓存):刷新一下网页,再看请求头,它会变成 X-Cache-Status: HIT
最后查看 1Panel 网络监控:这时候,带着 Chrome/95 的爬虫依然在不断的访问,只要缓存状态是 HIT, CPU 和 800KB/s 的内网网络传输就会稳如死水。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。