
1. 为什么选择“宝塔 WordPress Cloudflare”这套组合先聊点实际的。我见过太多站长网站上线第一天流量还不错结果没几天就被浏览器标成“不安全”甚至被运营商插广告、被劫持跳转。原因很简单没上HTTPS。HTTPS这件事说大不大说小不小。对于个人博客、企业展示站、甚至小型电商站来说它解决的三个核心问题是数据加密传输、身份认证、防止内容被篡改。但很多朋友卡在了“不知道怎么配SSL证书”这一步尤其是当你既用了宝塔面板又想套Cloudflare做CDN和防护的时候证书配置的顺序、模式选错一环整个站点就会反复跳错、打不开、或者证书失效。这套组合拳——宝塔面板管服务器、WordPress管内容、Cloudflare管加速和安全、SSL证书管加密——是我这几年在几十个站点上反复验证过的方案。它能解决“个人站长没有专业运维经验”这个最大痛点让一个完全不懂Linux命令的小白也能在自己的服务器上跑起来一个带完整HTTPS加密的WordPress站点。这篇文章我会从零开始把整个链路拆开讲清楚。适合谁看准备从零搭建WordPress站点的新手、想给现有站点补上HTTPS的老站长、以及被Cloudflare SSL模式搞到崩溃的朋友。看完之后你能照着步骤完整操作一遍并且理解每一步背后的“为什么”。2. 动手之前的整体思路证书链路和流量走向2.1 先搞懂浏览器到服务器之间发生了什么开始配之前我强烈建议你先花五分钟理解一个概念HTTPS不是把证书装在服务器上就完事了。当你的网站套了Cloudflare之后用户浏览器访问的是Cloudflare的节点不是你的源站服务器。这就产生了两段链路第一段浏览器 → Cloudflare节点第二段Cloudflare节点 → 你的源站服务器宝塔上的Nginx/Apache每一段都需要有证书否则浏览器会报错或者Cloudflare那边会显示“SSL不可用”。这就是很多朋友遇到“明明在宝塔里装了证书网站却还是打不开”的根本原因——你只配了源站证书但Cloudflare和源站之间没对上。这套架构的流量走向是这样的用户访问你的域名DNS解析到Cloudflare的任播IPCloudflare根据你的源站地址去请求你的服务器服务器返回内容后再由Cloudflare压缩、缓存、加HTTP头最后返回给用户。整个过程里用户只和Cloudflare通信只有Cloudflare知道你的真实服务器IP。注意这里有一个关键点——如果你只想让Cloudflare做CDN加速不想要它的防护功能也建议保留“小云朵”代理状态因为只有代理状态下用户的真实IP才会被Cloudflare隐藏HTTPS证书才能由Cloudflare统一签发。2.2 方案选型全自动模式还是手动模式Cloudflare提供了多种SSL/TLS加密模式常见的有四种模式含义适用场景Off关闭完全不用SSL纯HTTP测试环境Flexible灵活浏览器到Cloudflare是HTTPSCloudflare到源站是HTTP源站没证书时临时用Full完全两端都是HTTPS但不校验源站证书有效性源站有自签名证书或测试证书Full (Strict)完全严格两端都是HTTPS且强制校验源站证书有效正式环境推荐本文采用我的建议是正式上线站点直接选 Full (Strict)。这个模式下Cloudflare会强制要求你的源站服务器宝塔上安装一张有效期内、域名匹配、由受信任CA签发的证书否则会报 526 错误。听起来要求高但一旦配好整个链路的安全等级是最高的。那源站证书从哪来两种常见途径宝塔面板自带的自动续期证书Lets Encrypt或者自己用 acme.sh 签发的证书。我推荐用宝塔面板内置的 Lets Encrypt 免费证书因为它在宝塔里点几下就能完成配置还能自动续期省去手动续费的烦恼。2.3 为什么用“证书”而不是“云盾”或“WAF”硬扛可能有人问Cloudflare本身就有WAF和防护功能为什么还要在源站上配证书答案是Cloudflare的防护是给用户看的源站证书是给Cloudflare看的。如果你的源站没有证书Cloudflare在 Full (Strict) 模式下会拒绝连接——这是它的安全底线防止数据在Cloudflare和源站之间裸奔。换句话说Cloudflare承担了“外敌防御”而源站证书承担了“内部通道加密”。两段链路都加密才叫真正的全链路HTTPS。这也是我想强调的HTTPS不是单纯的“装个证书”而是一整套信任体系的落地。3. 宝塔面板部署WordPress环境配置与注意事项3.1 环境选择Linux Nginx MySQL PHP在宝塔面板上部署WordPress标准环境组合是CentOS/Ubuntu Nginx MySQL 8.0 PHP 8.1。为什么推荐这个组合Nginx在静态文件处理和高并发上比Apache更好PHP 8.1对WordPress的主题和插件兼容性也很成熟。如果你用的是BT官方推荐的一键LNMP安装直接默认选项即可。安装宝塔面板时我一般选择编译安装而不是极速安装。编译安装虽然耗时更长大概30到60分钟但性能和兼容性更稳。极速安装适合场景是“只想要个最快测试环境”正式站点不建议。装完之后第一步不是急着建站而是改端口和绑定域名。宝塔面板默认端口是8888建议把它改成高位端口比如 28888并且只允许你的IP访问。这一步很多人忽略等被扫到了才后悔。3.2 创建站点数据库、PHP版本、伪静态设置在宝塔左侧菜单点“网站 → 添加站点”这里有几个关键配置项要注意域名填写你已经解析到Cloudflare的域名比如www.example.com备注随便填。数据库选择MySQL数据库类型选 utf8mb4因为WordPress的很多中文内容用这个编码最稳。PHP版本选你刚装好的PHP 8.1或8.2。伪静态建议选 WordPress 模板否则文章页的固定链接会404。创建完成后宝塔会自动生成一个站点目录默认在/www/wwwroot/你的域名还会帮你建好FTP账号和数据库账号。建议记好这些自动生成的口令后续安装WordPress要用到。3.3 安装WordPress本体手动下载还是用宝塔一键部署宝塔面板提供了一个“一键部署WordPress”的功能如果你是第一次搞用它确实快。但我个人更推荐手动下载WordPress官方安装包来装原因有两个一是你能确认源码来自官方免得被第三方篡改二是手动安装的过程能让你理解WordPress的文件结构后续排查问题才有思路。具体步骤在/www/wwwroot/你的域名目录下下载最新版WordPress安装包cd /www/wwwroot/你的域名 wget https://cn.wordpress.org/latest-zh_CN.zip unzip latest-zh_CN.zip mv wordpress/* ./修改目录权限让PHP进程能读写chown -R www:www /www/wwwroot/你的域名 chmod -R 755 /www/wwwroot/你的域名浏览器访问你的域名进入WordPress安装引导填入之前创建好的数据库名、用户名、密码完成安装。注意WordPress安装向导会让你填数据库主机默认是localhost如果你用的宝塔默认配置保持localhost就行。但如果你在BT面板里改了MySQL监听端口或开启了远程访问这里就需要填127.0.0.1:端口号。4. Cloudflare接入DNS代理、SSL模式与常用配置4.1 注册和添加站点到CloudflareCloudflare注册免费账号后进入Dashboard点击“Add a site”输入你的域名它会自动扫描该域名下已有的DNS记录。扫描出来后你需要核对两件事确保有一条 A 记录指向你的服务器IP。保证CNAME记录如果有www也指向同一IP。然后Cloudflare会给你两个NS地址你要到自己域名注册商那边把默认的DNS服务器改成Cloudflare提供的这两个NS。这一步叫“托管DNS”改完之后等半小时到几小时DNS会全球生效Cloudflare平台显示“Active”就算接管成功了。实操心得域名DNS切换到Cloudflare后原有的解析都会继承过来不需要重新添加但建议在“DNS → Records”页面核对一遍。特别是邮件相关记录MX和TXT千万别漏了否则邮箱收发会出问题。4.2 SSL/TLS模式设置为Full (Strict)站点激活后进入“SSL/TLS → Overview”把加密模式选为Full (Strict)。此时Cloudflare会提示你需要源站有有效证书不用慌这就带你到下一步——回宝塔去配源站证书。这里还要顺手设置一下SSL/TLS的“Edge Certificates”选项卡Always Use HTTPS启用强制所有HTTP请求307跳转到HTTPS。Automatic HTTPS Rewrites启用自动把页面里的http://资源地址改成https://避免混合内容报错。Minimum TLS Version建议设为 1.2。为什么不是1.3因为有些老手机和低版本浏览器不支持1.31.2覆盖更广且安全性足够。4.3 关闭Cloudflare的“灵活模式”的坑我见过很多朋友踩这个坑站点还没配好源站证书就先把Cloudflare的SSL模式设成了 Flexible结果浏览器那边确实显示绿锁了但源站和Cloudflare之间是明文HTTP。这不仅导致数据没真正加密还会在你后续启用 Strict 模式时出现502/526错误影响体验。所以我的建议是宁可早期让站点保持“无证书”的HTTP状态也不要开 Flexible 模式。等宝塔面板里的源站证书配好了直接让Cloudflare切到 Full (Strict)。整个过程大概只要10分钟不存在“过渡期”需求。5. 宝塔面板SSL证书配置获取、部署与自动续期5.1 用宝塔内置的Lets Encrypt免费证书宝塔面板的“站点 → SSL”页面是配置源站证书的核心入口。推荐用“Lets Encrypt”免费证书因为宝塔内置了自动续期脚本到期前一个月会自动帮你续期不需要任何人工干预。操作步骤在“站点 → SSL”页面选择“Lets Encrypt”标签。勾选你要签发证书的域名建议同时勾选根域名example.com和www.example.com。选“DNS验证”方式。为什么不用文件验证因为你的域名已经接了Cloudflare代理文件验证时Cloudflare的CDN缓存会干扰验证过程经常导致验证失败。DNS验证会通过解析记录来确认域名归属权更稳定。点击“申请”等待十几秒到一分钟证书就签发成功了。签发成功后宝塔会自动把证书内容填到“证书”和“密钥”两个文本框里并在底部显示“已部署”状态。此时你可以直接访问源站IP HTTPS试试比如https://你的服务器IP如果浏览器报证书不匹配是正常的因为你访问的是IP而不是域名直接访问https://你的域名先别走Cloudflare就能看到证书有效的绿锁。5.2 DNS验证需要怎么配合Cloudflare刚才说到DNS验证这里细讲一下。Lets Encrypt的DNS验证会在你的域名下新增一个_acme-challenge的TXT记录宝塔面板会弹出一个提示框让你去域名DNS处添加这条TXT记录。但因为你的DNS现在托管在Cloudflare所以要去Cloudflare的“DNS → Records”里添加。添加完TXT记录后回到宝塔的SSL申请页面点击“验证并签发”。这里有个细节TXT记录在Cloudflare有一个“代理状态”的概念TXT记录不会被Cloudflare代理只有A/CNAME才会显示云朵图标所以不必担心。5.3 更新根证书链Origin CA证书的情况这里补充一个更稳妥的做法从Cloudflare侧给源站签发一张Origin CA证书。这张证书的信任链来自Cloudflare根证书配置在源站上时Cloudflare会直接信任它缘于同一个信任根所以即使你用了自签名的根证书也没问题。具体操作Cloudflare的“SSL/TLS → Origin Server”页面点击“Create Certificate”它会生成一张有效期最长15年的证书和私钥。把这对证书和私钥粘贴到宝塔面板的SSL设置里保存并开启“SSL”按钮。这种做法比Lets Encrypt更省心因为它有效期长达15年不需要频繁续期。不过要注意Origin CA证书只在Cloudflare有记录你要是哪天把域名从Cloudflare迁走这张证书就失效了到时得换回公共CA证书。5.4 证书部署之后的Nginx配置检查证书部署完成宝塔会自动修改Nginx配置并重启Nginx。但有时候你可能会遇到“保存SSL后站点直接504”的情况。这多半是Nginx配置文件里重复添加了SSL监听端口导致的。排查方法nginx -t如果提示conflicting server name或duplicate listen那说明你在“站点设置 → 配置文件”里和宝塔自动生成的SSL配置段冲突了。解决办法是删掉你手动添加的listen 443 ssl;和ssl_certificate相关行把这些参数交给宝塔统一管理。6. WordPress侧的安全加固与HTTPS适配6.1 后台强制开启HTTPS并处理混合内容只要Cloudflare的“Always Use HTTPS”和宝塔源站证书都配好了浏览器访问整站应该都是HTTPS。但是WordPress后台里还有一个环节就是“设置 → 常规”里的WordPress地址和站点地址。如果这两个地址还写着http://那么很多资源会继续以HTTP加载导致浏览器控制台报“Mixed Content”错误。解决办法在WordPress后台把这两个地址都改成https://你的域名。如果你希望强制所有HTTP请求跳转到HTTPS可以在wp-config.php里加$_SERVER[HTTPS] on;这样Nginx层和PHP层都能感知到请求是HTTPS避免WordPress生成相对路径时带上http://。6.2 网站的固定链接和伪静态规则默认WordPress的固定链接可能是?p123这种动态网址不美观也不利于SEO。建议设置为“文章名”或“自定义结构”比如/archives/%post_id%.html。设置之后如果文章页出现404说明Nginx的伪静态规则没生效。在宝塔的站点设置里把伪静态模板改成“WordPress”保存即可。6.3 缓存与CDN穿透的坑WordPress的缓存机制和CDN配合时有一个容易让人抓狂的坑插件缓存和Cloudflare缓存互相冲突导致更新文章后网站页面还是旧的。解决办法在宝塔里启用“网站缓存”时选择“缓存模式”为“无”或者只开“静态文件缓存”。Cloudflare侧在“Caching → Configuration”里设置缓存级别为“Standard”并且把/wp-admin/*加入“Never Cache”规则。如果你用的是W3 Total Cache或WP Rocket这类插件建议把“CDN”相关选项关掉让Cloudflare自己处理缓存否则会有两套缓存逻辑互相打架。6.4 强化登录安全避开常见爆破路径HTTPS部署完成之后网站安全等级确实提升了一截但WordPress的登录接口wp-login.php仍然是公网上最常见的暴力破解目标。我强烈建议做两件事限制登录失败次数可以使用宝塔的“Nginx防火墙”插件里的“CC攻击防护”功能设置/wp-login.php的请求频率限制。关闭XML-RPC接口xmlrpc.php因为它是暴力破解的著名入口很多攻击脚本就是用它来批量试密码的。在宝塔站点的配置里加一段阻止访问该文件的规则即可。7. 常见问题与排查技巧实录7.1 问题速查表现象可能原因解决办法浏览器访问显示“您的连接不是私密连接”Cloudflare和源站证书不匹配或SSL模式设置错误检查Cloudflare的SSL模式是否为Full (Strict)检查源站证书是否有效且域名匹配网站能打开但页面“不安全”或锁头带红叉混合内容页面里有HTTP资源启用Cloudflare的Automatic HTTPS Rewrites手动检查主题和插件里的硬编码http://地址访问时提示526 Invalid SSL certificateCloudflare无法验证源站证书重新确认宝塔里的证书是否完整且未过期确认Nginx配置里证书路径是否正确网页排版错乱CSS/JS加载不出资源URL仍是http或者CDN缓存了旧的HTTP版本清空Cloudflare缓存在WordPress后台用“Better Search Replace”插件把http://批量替换为https://更新文章后页面不变缓存冲突清空宝塔网站缓存和Cloudflare缓存检查缓存插件是否与CDN冲突后台登录不上一直跳转回登录页Cookies未使用HTTPS传输在Cloudflare开启Always Use HTTPS检查wp-config.php是否有强制登录HTTPS的配置7.2 如何验证证书是否真的生效很多朋友问了“我明明配了怎么知道它生效了”这里分享两个简单的方法。第一种用浏览器开发者工具。按 F12 → Network随便点击一个请求看 Security 标签页里面会显示证书类型、加密协议TLS 1.3等、证书签发机构等信息。如果显示“Valid certificate”之类的就说明证书有效。第二种用命令行直接查询证书的到期时间和常用参数echo | openssl s_client -servername 你的域名 -connect 你的域名:443 2/dev/null | openssl x509 -noout -dates输出里的notBefore和notAfter就是证书的有效期起止时间。这个方法常用于定时巡检源站证书是否快到期配合cron脚本可以在到期前一周给你发邮件报警。7.3 换服务器IP之后需要做的事搬机房或换IP之后最容易踩坑的就是Cloudflare还是旧源站IP。此时网站会直接502或者超时。解决办法登录Cloudflare在“DNS → Records”里找到那条A记录把IP改成新服务器的IP保存后等几十秒然后去宝塔里确认新服务器的Nginx和防火墙放行了443端口。这里给个经验值宝塔默认会放行80和443端口但如果你用了腾讯云/阿里云的安全组策略服务器层面也要放行这些端口否则无论Cloudflare怎么刷源站都连不上。7.4 关于“SSL证书过期”的最后一道防线Lets Encrypt证书有效期是90天宝塔会自动续期理论上不用管。但我在生产环境里遇到过几次因为Nginx配置报错导致nginx -t失败自动续期脚本也会跟着失败。所以建议每月检查一次nginx -t是否通过并且留意宝塔“计划任务”里的续期日志。必要时可以设置一条每月的手动续期任务bt 14或者直接用宝塔计划任务里的“Lets Encrypt续期”脚本在每月1号的凌晨3点跑一次。这样就算自动续期失效也能通过定时任务补上。提示如果你的源站证书用的是Cloudflare Origin CA有效期长达15年基本不用考虑续期问题这也是我把这个方案列为正式环境首选的原因之一。8. 踩过几次坑之后我的实际体会写到这里整套流程就完整了。但我想在结尾再啰嗦几句因为这些是我在真实操作中反复踩过、最想提醒后来人的点。第一所有配置做完之后一定要把Cloudflare的“SSL/TLS”页面截图存下来。对你后续排查问题非常有帮助尤其是当你忘记了自己用的是Flexible还是Full Strict时一张截图能帮你快速定位。第二别迷信“一键部署”。宝塔的“一键部署WordPress”功能确实省事但我见过的百来个站点故障里有很大一部分都是因为一键部署时对服务器做了定制化修改导致后面配置SSL、伪静态、缓存时无所适从。手动走一遍流程踏踏实实理解每一步后面出问题你才敢动手。第三HTTPS上线之后一定要主动检查一遍全站的HTTP资源。我遇到过一个案例网站首页看着一切正常但“联系我们”页里有一张老图片用的是http://地址在浏览器里被自动拦截用户点击后页面就崩了。这就是典型的“大树底下没草”SSL证书是配好了但细节没跟上。用https://你的域名/wp-admin/登录后台安装一个“Really Simple SSL”插件它会自动帮你处理大部分混合内容问题同时还能设置一个临时的301跳转把旧HTTP流量全部转到HTTPS上。第四也是最让我心疼的一条经验我第一次给客户配HTTPS时因为偷懒没把源站证书的私钥备份下来结果服务器硬盘坏了整个站点的证书没法恢复只能重新签发。所以请在宝塔的“SSL → 证书”页面手动把“证书”和“密钥”复制到U盘或密码管理器里一式两份。这比任何技术优化都重要。第五上线HTTPS不是终点而是起点。浏览器地址栏出现那把绿色锁只是满足了“传输安全”这一层。真正安全的网站还需要做到定期备份、及时更新WordPress核心和插件、把登录页加上二次验证Cloudflare的Access或TOTP插件都行、以及养成查看Nginx错误日志的习惯。把这些日常动作坚持下来你的站点才算进入“持续安全”的状态。最后说一个和我自己最相关的例子。我自己的博客就是用这套方案搭的宝塔面板 阿里云轻量服务器 WordPress Cloudflare Full (Strict) Lets Encrypt自动续期。从上线到现在一年多了没有遇到过证书过期导致的故障访问速度在国内外都还算稳定偶尔遇到某个地区的用户访问慢大多也是本地运营商的问题。这套组合的维护成本很低每个月花几分钟看一眼日志就行。如果你也想给自己的网站彻底解决“明文传输”的隐患按着这篇文里的步骤走一遍应该能少走不少弯路。