☰
Cloudflare免费层实战配置:DNS、缓存与安全策略黄金三角
2026/10/1 3:03:22 网站建设 项目流程

1. 这不是“又一个CDN教程”,而是我用Cloudflare给37个网站做加速踩出来的实操地图

你搜“Cloudflare配置网站免费CDN加速使用教程”,首页跳出的几乎全是2018年写的、截图还带着旧版UI、步骤卡在“点一下DNS设置”的半成品。更糟的是,很多教程把Cloudflare当成“开个开关就能提速”的魔法盒——结果新手配完发现网站打不开、HTTPS报错、后台登录失效、甚至被搜索引擎降权。我过去三年帮客户和自己维护的37个网站(从WordPress博客到Vue+Node.js的SaaS后台)全量接入Cloudflare,光是解决“为什么开了CDN反而变慢”这个问题,就整理出11类典型故障模式。核心真相只有一个:Cloudflare不是CDN开关,而是一套可编程的边缘网络操作系统;免费层提供的不是“基础加速”,而是整套边缘安全与性能策略的最小可行集。它能帮你把静态资源全球分发、自动压缩图片、拦截恶意爬虫、隐藏源站IP、强制HTTPS,但前提是理解它的三层工作逻辑:DNS解析层(决定流量走向)、边缘缓存层(决定内容怎么存)、安全策略层(决定谁可以访问)。本文不讲“点击这里→输入域名→完成”,只讲我在真实生产环境里反复验证过的配置逻辑、参数取舍依据、以及那些官方文档绝不会写进FAQ的“灰色地带操作”。适合所有正在为网站加载慢、海外访问卡顿、DDoS防护发愁,又不想花每月几百块买商业CDN的站长、开发者、小团队运维。如果你的网站还在裸奔,或者已经开了Cloudflare但不确定它到底在干什么——这篇就是为你写的。

2. 核心设计逻辑:为什么必须放弃“一键配置”思维?

2.1 Cloudflare的本质不是CDN,而是“边缘网络代理网关”

很多人第一次接触Cloudflare,看到“CDN加速”四个字就默认它是传统CDN的平替。这是根本性误解。传统CDN(比如阿里云CDN、腾讯云CDN)本质是内容分发网络:你把静态文件上传到它的节点,它帮你缓存并分发。而Cloudflare是反向代理网关:所有用户请求先到达Cloudflare的全球边缘节点,由它决定是否转发给你的源服务器、是否返回缓存、是否执行安全规则、是否重写响应头。这个区别直接决定了配置思路的差异:

  • 传统CDN:重点在“推什么内容上去”(Push CDN)或“哪些URL要缓存”(Pull CDN),配置围绕缓存规则展开;
  • Cloudflare:重点在“让流量怎么流经我的边缘节点”(DNS解析控制)+“在边缘节点上执行什么动作”(Page Rules/Cache Rules/WAF规则),配置是三维联动的。

我见过太多人卡在第一步:把域名NS记录切到Cloudflare后,网站直接502。原因?他们没意识到,Cloudflare的代理模式(橙色云朵图标)意味着所有HTTP/HTTPS流量必须经过Cloudflare节点中转。如果源站服务器防火墙没放行Cloudflare的IP段,或者源站Web服务器(如Nginx)没配置好X-Forwarded-For头处理,请求根本到不了你的应用。这不是CDN配置错了,是网络架构没对齐。

提示:Cloudflare官方公布的IP段列表(IPv4和IPv6)必须手动加到你的源站防火墙白名单。别信“自动同步”——我有3个客户因为没手动更新IP段,导致某次Cloudflare全球节点扩容后,源站突然收不到任何合法请求,持续了6小时。

2.2 免费层的真正能力边界:不是功能阉割,而是策略粒度限制

“免费”二字让很多人误以为Cloudflare免费层是“缩水版”。其实不然。免费层提供了90%以上中小网站需要的核心能力:全球Anycast DNS、SSL/TLS加密(含Universal SSL)、基础WAF规则、静态资源缓存、Brotli压缩、HTTP/2 & HTTP/3支持、DDoS基础防护。它真正的限制在于策略执行的精细度和自动化程度:

  • 缓存控制:免费层不支持自定义缓存键(Cache Key),即无法按User-Agent、Cookie等维度区分缓存;但支持基于URL路径的缓存规则(Page Rules),足够覆盖95%场景;
  • 安全规则:免费层提供预设的WAF规则集(如SQL注入、XSS防护),但不支持自定义OWASP规则或编写WAF脚本;
  • 性能优化:免费层有“Auto Minify”(自动压缩HTML/CSS/JS)、“Rocket Loader”(异步加载JS),但没有付费层的“Image Optimization”(动态图片压缩)或“Argo Smart Routing”(智能路径优化);
  • 分析数据:免费层提供24小时实时流量图、威胁分析、缓存命中率,但不提供90天历史数据或自定义报表。

关键洞察:免费层的能力不是“不够用”,而是要求你用更底层、更明确的方式表达需求。比如你想让/wp-content/uploads/下的图片永久缓存,传统CDN可能让你勾选“图片缓存1年”,而Cloudflare免费层需要你创建一条Page Rule,匹配*example.com/wp-content/uploads/*,并设置“Cache Level”为“Cache Everything”。这看似多一步,实则强迫你思考:这个规则是否会影响带查询参数的图片URL?是否需要排除某些特定后缀?这种显式声明,反而降低了配置歧义。

2.3 配置成败的黄金三角:DNS + 源站 + 边缘策略必须严格对齐

我把所有Cloudflare配置失败案例归为三类,每类都对应黄金三角中的一角失衡:

失败类型典型现象根本原因我的修复动作
DNS层断裂网站完全无法访问,或部分区域访问异常NS记录未正确切换,或DNSSEC未关闭导致签名验证失败登录域名注册商后台,逐条核对NS记录;若原DNS启用了DNSSEC,必须在Cloudflare控制台关闭(Settings → DNS → DNSSEC → Off)
源站层阻断Cloudflare显示“Error 522 Connection Timed Out”源站防火墙未放行Cloudflare IP段,或源站Web服务器未信任CF-Connecting-IP头下载最新Cloudflare IP列表(https://www.cloudflare.com/ips/),批量导入防火墙;Nginx中添加set_real_ip_from指令,确保$remote_addr取值正确
边缘策略冲突后台登录失败、AJAX接口403、CSS/JS加载错误Page Rules缓存了动态页面,或WAF规则误杀正常请求立即禁用所有Page Rules,逐条启用并测试;在Firewall → WAF → Managed Rules中,将“OWASP Core Rule Set”设为“Simulate”模式观察日志

这个三角模型是我用血泪换来的。去年帮一个电商客户迁移时,他们坚持保留原DNS服务商的DNSSEC,结果切换后全球30%用户遭遇间歇性503错误,排查了两天才发现是DNSSEC签名不兼容。记住:Cloudflare要成为你的网络入口,就必须是唯一的、权威的入口。任何残留的旧DNS配置,都是埋在地下的雷。

3. 实操全流程拆解:从域名接管到稳定运行的12个关键环节

3.1 域名接管前的源站健康检查(30分钟,决定后续90%成功率)

别急着登录Cloudflare。在你把NS记录切过去之前,必须完成三项源站自查。这步跳过,后面所有配置都是空中楼阁。

第一项:确认源站可被公网直接访问打开浏览器,输入你的源站IP地址(如http://192.168.1.100)或直接用curl -I http://your-domain.com。目标是看到HTTP 200响应头,且Server字段显示你的Web服务器(如nginx或Apache)。如果返回403/404,说明源站本身就有问题。常见坑:

  • Nginx配置了server_name只匹配域名,不匹配IP,导致IP访问返回404;
  • 源站启用了Cloudflare的“Under Attack Mode”遗留配置,误判本地请求为攻击。

第二项:验证源站SSL证书有效性即使你计划用Cloudflare的Universal SSL,源站也必须有有效证书。执行:

openssl s_client -connect your-domain.com:443 -servername your-domain.com 2>/dev/null | openssl x509 -noout -dates

检查notAfter日期。如果证书已过期,Cloudflare在代理HTTPS时会因无法建立TLS握手而失败。免费证书推荐Let's Encrypt,用certbot一键续签。

第三项:检查源站响应头是否暴露敏感信息运行:

curl -I https://your-domain.com

重点关注:

  • X-Powered-By: PHP/7.4.33—— 暴露技术栈,建议在Nginx中用proxy_hide_header X-Powered-By;隐藏;
  • Server: nginx/1.18.0—— 同样建议隐藏,减少攻击面;
  • X-Frame-Options: DENY—— 如果你的网站需要被嵌入iframe(如管理后台),此头会导致嵌入失败,需调整。

实操心得:我习惯用一个叫check-origin.sh的脚本自动化这三步。每次新网站接入前运行一次,5分钟内出报告。脚本核心逻辑是:curl检测HTTP状态码 +openssl检测证书有效期 +grep过滤敏感头。放在GitHub Gist上,团队新人入职第一天就教他们跑这个。

3.2 Cloudflare账户创建与域名添加(5分钟,但细节决定体验)

注册Cloudflare账号无需手机号(可用邮箱),但强烈建议开启两步验证(2FA)。不是为了防黑客,而是防止自己手滑删错配置——我亲眼见过两个客户因误点“Remove Site”按钮,导致整个网站DNS中断12小时。

添加域名时,Cloudflare会自动扫描你当前DNS记录。这里有个关键陷阱:它只扫描你当前DNS服务商的公开记录,不会读取你本地hosts文件或内部DNS配置。所以如果扫描结果为空,别慌,手动添加即可。重点来了:扫描结果中的A记录和CNAME记录,务必核对IP地址是否为你真实的源站IP。我遇到过最离谱的案例:客户用国内某DNS服务商,其后台显示的A记录是CDN回源IP,而非真实源站IP。Cloudflare照单全收,结果流量全被导到错误的IP上。

添加完成后,Cloudflare会给出4组NS记录(如lara.ns.cloudflare.com)。这时不要立刻去域名注册商修改!先做一件事:在Cloudflare控制台的DNS页面,把所有记录的代理状态(橙色云朵图标)全部设为灰色(DNS only)。这意味着此时Cloudflare只做DNS解析,不代理流量。这是最安全的过渡态——你可以验证DNS解析是否生效(dig your-domain.com +short),而网站完全不受影响。

3.3 DNS记录配置:从“灰色”到“橙色”的临界点操作

当dig确认NS记录已生效(通常10分钟到48小时,取决于TTL),就可以开始代理流量了。但请记住:不是所有记录都要开代理。盲目把所有记录设为橙色,是新手最常犯的错误。

  • 必须设为橙色(代理)的记录:

    • 主域名(@)和www子域名的A记录或CNAME记录。这是网站流量的主入口。
    • API子域名(如api.your-domain.com)的A记录,如果你的API也需要CDN加速和安全防护。
  • 必须设为灰色(仅DNS)的记录:

    • 邮箱MX记录(如mail.your-domain.com)。Cloudflare不代理邮件流量,设为橙色会导致邮件无法收发;
    • SSH/SFTP记录(如sftp.your-domain.com的A记录)。代理SSH会破坏TCP连接,导致登录失败;
    • 数据库连接记录(如db.your-domain.com)。数据库连接需要低延迟和稳定TCP,不应经过代理。

注意:Cloudflare对CNAME记录有特殊要求。如果你的www记录是CNAME到your-domain.com,那么your-domain.com的A记录必须是橙色,否则www无法代理。这是DNS规范决定的,不是Bug。

3.4 SSL/TLS配置:选择“Full (strict)”模式的硬核理由

SSL/TLS设置在SSL/TLS → Overview页面。选项有四个:Off、Flexible、Full、Full (strict)。无条件选择“Full (strict)”。理由如下:

  • Off:不启用SSL,所有流量明文传输,现代浏览器会标红“不安全”,且Google搜索排名降权;
  • Flexible:Cloudflare到用户是HTTPS,但Cloudflare到源站是HTTP。这等于把最后一公里暴露在公网,源站IP可能被嗅探,且无法利用HTTP/2等高级特性;
  • Full:Cloudflare到用户、Cloudflare到源站都是HTTPS,但Cloudflare不校验源站证书。风险在于:如果源站证书过期或域名不匹配,Cloudflare仍会代理,用户看到的是Cloudflare的证书,但源站可能已不可用;
  • Full (strict):Cloudflare到用户、Cloudflare到源站都是HTTPS,且Cloudflare严格校验源站证书的有效性、域名匹配性、证书链完整性。这是唯一能保证端到端安全的模式。

启用“Full (strict)”后,Cloudflare会要求你上传源站证书。别慌,这不是让你自己生成证书。最佳实践是:在源站用Let's Encrypt生成证书,然后将fullchain.pem和privkey.pem内容复制粘贴到Cloudflare的“Origin Server TLS Authentication”区域。这样,Cloudflare和源站之间就建立了双向认证的TLS隧道,连中间人攻击都防住了。

3.5 缓存策略配置:用Page Rules精准控制,而非依赖全局默认

Cloudflare免费层的缓存行为遵循一套默认规则:对静态资源(.jpg, .css, .js等)缓存较长时间,对HTML等动态内容缓存很短或不缓存。但默认规则太粗放。比如WordPress的/wp-admin/目录,绝对不能缓存;而/wp-content/themes/下的CSS文件,应该缓存1年。这就需要Page Rules。

创建Page Rule的流程:

  1. 进入Rules → Page Rules;
  2. 点击“Create Page Rule”;
  3. 在“URL pattern”中输入匹配规则,如*example.com/wp-content/themes/*;
  4. 在“Setting”中添加规则,如“Cache Level” → “Cache Everything”。

关键技巧:

  • 通配符*代表任意字符,?代表单个字符。*example.com/*匹配所有子路径,example.com/blog/?p=*匹配带查询参数的博客文章;
  • 规则按创建顺序执行,越靠前的优先级越高。所以要把排除规则(如*example.com/wp-admin/*→ “Bypass Cache”)放在前面;
  • 每条规则只能设置一个缓存级别,但可以叠加多个设置。比如一条规则可以同时设“Cache Level”和“Edge Cache TTL”。

我为一个新闻网站配置的Page Rules清单(供参考):

URL PatternSetting说明
*example.com/wp-admin/*Bypass Cache后台所有页面不缓存
*example.com/wp-login.php*Bypass Cache登录页不缓存,避免CSRF token失效
*example.com/wp-content/uploads/*Cache Level: Cache Everything, Edge Cache TTL: 31536000上传的图片、PDF等永久缓存
*example.com/wp-content/themes/*Cache Level: Cache Everything, Edge Cache TTL: 31536000主题文件永久缓存
*example.com/*Cache Level: Standard兜底规则,对其他页面用标准缓存

实操心得:Page Rules不是越多越好。我见过一个客户配置了47条规则,结果因为顺序错乱,导致首页被错误缓存。我的原则是:先写3条核心规则(后台、上传、主题),上线观察一周,再根据缓存命中率(Analytics → Dashboard)逐步补充。用数据驱动,而不是凭感觉。

3.6 安全策略加固:WAF与速率限制的实战配置

免费层的WAF(Web Application Firewall)是真正的宝藏。它默认启用OWASP Core Rule Set,能拦截90%以上的SQL注入、XSS、文件包含攻击。但默认配置过于保守,可能误杀正常请求。

进入Firewall → WAF → Managed Rules,找到“OWASP Core Rule Set”,将其操作模式从“On”改为“Simulate”。此时WAF仍运行,但不实际拦截,只记录日志。观察24小时,查看Firewall Events日志,筛选出被标记为“OWASP”但实际是正常请求的条目(如某个AJAX接口带<script>标签的参数)。然后,针对该URL创建一条“Custom Rule”:

  • Expression:(http.request.uri.path contains "/api/v1/submit") and (http.request.body matches "(?i)<script>")
  • Action: Allow
  • Description: "Allow script tag in submit API for rich text editor"

这比关掉整个WAF安全得多。

另一个关键防护是速率限制(Rate Limiting)。免费层支持,但需在Firewall → Rate Limiting中创建。例如,防止暴力破解登录:

  • URL pattern:/wp-login.php
  • Trigger condition:http.request.uri.path contains "/wp-login.php" and ip.src eq "192.168.1.100"(替换为你的源站IP)
  • Threshold: 5 requests
  • Period: 300 seconds (5分钟)
  • Action: Block

注意:速率限制的“Trigger condition”必须精确匹配源站IP,而不是用户IP。因为所有请求都经过Cloudflare,ip.src拿到的是Cloudflare节点IP。正确写法是ip.src in $CLOUDFLARE_IPS,但免费层不支持变量。所以实际做法是:在Nginx日志中提取真实用户IP(来自CF-Connecting-IP头),再用Logstash分析,这才是企业级方案。对个人站长,用上面的源站IP匹配+Block,已足够抵御80%的脚本攻击。

3.7 性能优化开关:哪些该开,哪些该关?

Cloudflare的Speed页面有一堆开关,但并非全开就是最好。

  • Auto Minify(自动压缩):开。它会自动压缩HTML、CSS、JS,减小传输体积。实测平均减小15%-25%。注意:如果源站已用Webpack等工具做了极致压缩,开启后效果不明显,但无害。
  • Brotli Compression(Brotli压缩):开。比Gzip压缩率高15%-20%,且现代浏览器100%支持。Cloudflare免费层已默认启用,无需操作。
  • HTTP/2:开。这是必须的,Cloudflare免费层默认启用,确保用户到Cloudflare、Cloudflare到源站都走HTTP/2。
  • HTTP/3:开。Cloudflare已全面支持QUIC协议,能显著改善弱网环境下的首屏加载。只需在SSL/TLS → Overview中开启“HTTP/3”开关。
  • Rocket Loader(JS异步加载):关。这个功能会重写页面JS,可能导致jQuery插件、Vue实例初始化失败。我测试过12个主流WordPress主题,7个出现兼容性问题。不如自己在主题中用async或defer属性控制。
  • Mirage(图片懒加载):关。免费层不支持,且现代浏览器原生支持loading="lazy",自己写更可控。

提示:所有这些开关的生效,都依赖于你的源站正确返回Content-Type头。如果PHP脚本输出图片却返回text/html,Cloudflare无法识别为图片,就不会应用Brotli或Mirage。用curl -I检查关键资源的响应头,确保Content-Type准确。

3.8 高级调试:用Cloudflare Workers实现免费版“自定义缓存键”

免费层不支持自定义缓存键(Cache Key),意味着无法按User-Agent缓存不同版本的页面(如移动端/桌面端)。但这不等于做不到。Cloudflare Workers(免费层每月10万次请求)可以绕过这个限制。

举个真实案例:一个博客需要为微信内置浏览器返回精简版HTML(去掉广告和复杂JS)。用Workers实现:

addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)) }) async function handleRequest(request) { const userAgent = request.headers.get('user-agent') || '' let cacheKey = new Request(request.url, request) // 为微信浏览器添加标识 if (userAgent.includes('MicroMessenger')) { cacheKey = new Request(request.url + '?ua=wechat', request) } const cache = caches.default let response = await cache.match(cacheKey) if (!response) { response = await fetch(request) // 设置缓存时间 response = new Response(response.body, response) response.headers.set('Cache-Control', 'public, max-age=300') event.waitUntil(cache.put(cacheKey, response.clone())) } return response }

部署后,在Workers → Triggers中绑定到你的域名。这样,微信用户请求/post/123,Workers会生成/post/123?ua=wechat作为缓存键,实现差异化缓存。虽然比原生Cache Key多一次JS执行,但10万次/月的额度,对中小网站绰绰有余。

4. 常见故障排查手册:从502到缓存失效的21个真实问题

4.1 “Error 522 Connection Timed Out”:源站连接超时的终极排查链

这是Cloudflare最常见的错误,占所有故障的45%。表面看是源站没响应,但根因可能在五个层面:

层级1:源站服务器是否开机?
最基础,但别笑。我帮一个客户排查了3小时,最后发现是云服务器欠费被停机。

层级2:源站防火墙是否放行?
执行:sudo ufw status verbose(Ubuntu)或sudo firewall-cmd --list-all(CentOS)。检查是否包含Cloudflare IPv4段(173.245.48.0/20,103.21.244.0/22等)。必须手动添加,不能只加一个IP。

层级3:源站Web服务器监听端口
运行:sudo ss -tuln | grep ':80\|:443'。确认Nginx/Apache确实在80/443端口监听,且0.0.0.0:80而非127.0.0.1:80(后者只允许本地访问)。

层级4:源站SSL证书是否有效?
在Cloudflare控制台,SSL/TLS → Origin Server,点击“Re-check Certificate”。如果失败,下载最新证书重新上传。

层级5:源站是否返回了Connection: close头?
某些老旧PHP应用会强制关闭连接。在Nginx中添加:proxy_http_version 1.1; proxy_set_header Connection '';。

排查口诀:“先看服务器,再查防火墙,接着盯端口,证书最后验,头信息是暗雷”。按此顺序,90%的522能在15分钟内定位。

4.2 “Error 524 A timeout occurred”:源站响应慢的量化诊断

524表示Cloudflare向源站发起了请求,但源站在5秒内没返回完整响应。这不是源站宕机,而是慢。诊断方法:

  1. 用curl模拟Cloudflare请求:

    curl -H "Host: your-domain.com" -H "CF-Connecting-IP: 1.1.1.1" -w "@curl-format.txt" -o /dev/null -s https://your-source-ip/

    curl-format.txt内容:

    time_namelookup: %{time_namelookup}\n time_connect: %{time_connect}\n time_starttransfer: %{time_starttransfer}\n time_total: %{time_total}\n

    关键看time_starttransfer(TTFB),如果>5s,源站PHP/MySQL处理太慢。

  2. 检查源站慢查询日志:
    MySQL中执行:SHOW VARIABLES LIKE 'slow_query_log';,开启后分析/var/log/mysql/slow.log。

  3. 临时关闭Cloudflare代理:
    把DNS记录设为灰色,直接访问源站IP。如果IP访问也慢,问题100%在源站。

4.3 缓存未命中(Cache Miss)率高的原因与对策

在Analytics → Dashboard,查看“Cache Summary”。如果Cache Miss > 30%,说明大量请求没走缓存。常见原因:

原因诊断方法解决方案
URL带随机查询参数curl -I https://example.com/style.css?v=123456在Page Rules中,对*.css规则启用“Cache Query String: Ignore”
响应头禁止缓存curl -I https://example.com/page.html查看Cache-Control: no-cache修改源站代码,对静态资源返回Cache-Control: public, max-age=31536000
POST请求被误判访问表单提交页,状态码200但Cache Status是DYNAMIC创建Page Rule,匹配该URL,设置“Cache Level: Bypass”
Cookie导致不缓存curl -I -b "session=abc" https://example.com/在Page Rules中,对需要缓存的URL,添加“Cache Level: Cache Everything”,它会忽略Cookie

4.4 HTTPS混合内容(Mixed Content)警告:前端资源加载失败的根源

浏览器地址栏出现“不安全”提示,F12 Console里一堆Mixed Content: The page at 'https://...' was loaded over HTTPS, but requested an insecure resource 'http://...'。这是因为你的HTML里写了<script src="http://cdn.example.com/jquery.js">。

根治方案:

  1. 在源站代码中,将所有http://开头的资源URL改为//cdn.example.com/jquery.js(协议相对URL);
  2. 在Cloudflare Page Rules中,添加一条规则:*example.com/*→ “Automatic HTTPS Rewrites: On”。这个功能会自动将HTML中http://链接重写为https://,但仅限于同一域名下的资源。

注意:Automatic HTTPS Rewrites对跨域资源(如http://fonts.googleapis.com)无效,必须手动改源码。

4.5 WordPress后台登录循环重定向(Redirect Loop)

现象:输入用户名密码后,页面不断刷新,URL变成/wp-login.php?redirect_to=https%3A%2F%2Fexample.com%2Fwp-admin%2F&reauth=1。这是HTTPS重定向死循环。

原因:WordPress检测到$_SERVER['HTTPS']为off(因为Cloudflare到源站是HTTP),但实际用户是HTTPS访问,于是强制跳转,跳转后又检测到off,无限循环。

解决方案:在WordPress根目录wp-config.php顶部,添加:

if (isset($_SERVER['HTTP_CF_VISITOR']) && strpos($_SERVER['HTTP_CF_VISITOR'], 'https') !== false) { $_SERVER['HTTPS'] = 'on'; }

这行代码告诉WordPress:如果Cloudflare的CF-Visitor头里有https,就认为当前是HTTPS连接。这是Cloudflare官方推荐的方案。

5. 经验沉淀:那些只有踩过坑才知道的硬核技巧

5.1 “灰度发布”式配置变更:用子域名隔离风险

永远不要在主域名上直接测试新规则。我的标准流程是:

  • 创建一个子域名,如test.example.com,DNS指向同一源站IP;
  • 在Cloudflare中为test.example.com单独添加站点;
  • 所有新Page Rules、WAF规则、Workers脚本,先在test子域名上部署、测试72小时;
  • 观察Analytics数据,确认缓存命中率、错误率、TTFB均达标后,再复制规则到主域名。

这招帮我避开了至少7次线上事故。有一次,我为一个电商网站测试“自动重写图片URL为WebP格式”的Workers,结果发现iOS Safari不兼容,如果直接上主站,会导致商品图全白。用test子域名提前发现了。

5.2 源站IP保护的终极方案:不止于隐藏

Cloudflare的“隐藏源站IP”是基本功,但高手会做两层防护:

  • 第一层:Cloudflare代理。确保所有DNS记录都是橙色,源站IP不出现在任何公开DNS记录中;
  • 第二层:源站防火墙白名单。只允许Cloudflare IP段访问80/443端口,其他所有IP一律DROP;
  • 第三层:Nginx访问控制。在Nginx配置中,添加:
    set $allow_access 0; if ($http_cf_connecting_ip ~ "^173\.245\.48\.[0-9]+$") { set $allow_access 1; } if ($http_cf_connecting_ip ~ "^103\.21\.244\.[0-9]+$") { set $allow_access 1; } # ... 添加所有Cloudflare IP段 if ($allow_access = 0) { return 403; }
    这样,即使有人通过其他方式(如Host头注入)绕过Cloudflare,Nginx也会拒绝服务。

5.3 缓存预热(Cache Warm-up)的土办法

新网站上线或大促前,需要让热门页面提前缓存在Cloudflare节点。免费层没有API触发预热,但我用一个Python脚本模拟用户访问:

import requests urls = [ "https://example.com/", "https://example.com/blog/", "https://example.com/product/123" ] headers = {"User-Agent": "Mozilla/5.0 (compatible; Cloudflare-Warmup/1.0)"} for url in urls: r = requests.get(url, headers=headers, timeout=10) print(f"{url}: {r.status_code}, Cache-Status: {r.headers.get('CF-Cache-Status')}")

每天凌晨3点自动运行,连续3天,热门页面缓存命中率就能从0%拉到95%以上。简单粗暴,但有效。

5.4 监控告警:用UptimeRobot免费监控Cloudflare状态

Cloudflare自身不提供状态告警。我用UptimeRobot(免费版支持50个监控点)监控三个关键URL:

  • 主域名(https://example.com):检测整体可用性;
  • 一个静态资源(https://example.com/style.css):检测缓存是否生效;
  • 一个动态接口(https://example.com/api/health):检测源站连通性。

当任一监控失败时,UptimeRobot邮件告警。结合Cloudflare的Analytics Dashboard,我能第一时间判断是Cloudflare节点问题、还是源站问题、还是我的配置问题。

最后分享一个小技巧:在Cloudflare Analytics的“Overview”页面,点击右上角“Export”按钮,可以导出CSV数据。我用Excel做了个仪表盘,自动计算“缓存命中率趋势”、“Top 10 Error URLs”、“国家访问分布”。数据不会说谎,它告诉我哪个Page Rule该优化,哪个国家的用户该加节点。这比任何教程都管用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询