如何批量执行curl -IL遍历网站所有页面并设置定时任务实现FastCGI预缓存
看起来你遇到的问题是FastCGI缓存只有在实际访问页面后才会触发HIT,所以需要主动预加载所有页面来确保缓存生效对吧?我来一步步帮你解决这个问题。
第一步:获取网站所有页面的URL列表
首先得拿到网站上所有需要预缓存的页面链接,最方便的方式是用网站的站点地图(比如https://www.example.com/sitemap.xml),如果没有站点地图,可以用wget爬取所有可访问的页面:
wget --spider --recursive --no-verbose --output-file=site_urls.txt https://www.example.com
这个命令会爬取整个网站的链接并保存到site_urls.txt里,之后你可以清理一下这个文件,只保留HTTPS页面链接(过滤掉JS、CSS这类静态资源)。
第二步:编写批量curl的预缓存脚本
创建一个预缓存脚本,比如命名为precache_fastcgi.sh,内容如下:
#!/bin/bash # 定义URL列表文件路径 URL_FILE="/root/site_urls.txt" # 遍历每个URL执行curl -IL while read -r url; do # 跳过空行和注释行 [[ -z "$url" || "$url" == "#"* ]] && continue echo "正在预缓存页面: $url" curl -IL "$url" # 加1秒延迟,避免短时间请求过多压垮服务器 sleep 1 done < "$URL_FILE"
给脚本添加执行权限:
chmod +x precache_fastcgi.sh
你可以先手动运行脚本测试效果,观察输出里的x-fastcgi-cache字段,第一次请求可能是MISS,第二次就会变成HIT,说明缓存生效了。
第三步:设置Cron定时任务实现每日自动执行
接下来让脚本每天自动运行,用cron来实现:
- 打开cron编辑界面:
crontab -e
- 添加一行定时任务,比如设置每天凌晨2点执行(这个时间段服务器负载通常较低):
0 2 * * * /root/precache_fastcgi.sh >> /root/precache_logs.txt 2>&1
这段命令的意思是:
0 2 * * *表示每天凌晨2点触发任务/root/precache_fastcgi.sh是你的脚本路径>> /root/precache_logs.txt 2>&1把执行日志和错误信息都写入日志文件,方便后续排查问题
- 保存退出后,用
crontab -l命令可以确认定时任务是否添加成功。
额外小贴士
- 如果网站页面数量很多,可以把脚本里的
sleep 1改成sleep 2,进一步降低服务器压力 - 定期查看
precache_logs.txt日志,检查有没有请求失败的页面,及时调整URL列表 - 你之前测试的
curl -IL https://www.example.com已经能正确触发缓存,这个脚本只是把这个操作批量应用到了所有页面上
你提供的curl测试输出示例:
root@ubuntu-s-1vcpu-1gb-amd-sfo3-01:~# curl -IL https://www.example.com
HTTP/2 200
date: Thu, 23 Feb 2023 10:31:44 GMT
content-type: text/html; charset=UTF-8
link: https://www.example.com/wp-json/; rel="https://api.w.org/"
link: https://www.example.com/wp-json/wp/v2/pages/16274; rel="alternate"; type="application/json"
link: https://www.example.com/; rel=shortlink
x-fastcgi-cache: HIT
cf-cache-status: DYNAMIC
report-to: {"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v3?s=2K%2BxMLMMrvGpe%2FdpG38gU%2FKaBPBAL5I3rYNL5ATQ65wPM2qMnQmaCe2jLx88N%2B%2BHeUw1RRI5EnrYh9%2F6P5fj7xAipg%2FnOxi4IV8e4IqPWMyANW9JnKndXGfBZw0r3LtF1IEl"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 79df4b241af32f15-LAX
alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400
备注:内容来源于stack exchange,提问作者Crypto Coupons

