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的任播IP,Cloudflare根据你的源站地址去请求你的服务器,服务器返回内容后再由Cloudflare压缩、缓存、加HTTP头,最后返回给用户。整个过程里,用户只和Cloudflare通信,只有Cloudflare知道你的真实服务器IP。
注意:这里有一个关键点——如果你只想让Cloudflare做CDN加速,不想要它的防护功能,也建议保留“小云朵”(代理状态),因为只有代理状态下,用户的真实IP才会被Cloudflare隐藏,HTTPS证书才能由Cloudflare统一签发。
2.2 方案选型:全自动模式还是手动模式
Cloudflare提供了多种SSL/TLS加密模式,常见的有四种:
| 模式 | 含义 | 适用场景 |
|---|---|---|
| Off(关闭) | 完全不用SSL | 纯HTTP测试环境 |
| Flexible(灵活) | 浏览器到Cloudflare是HTTPS,Cloudflare到源站是HTTP | 源站没证书时临时用 |
| Full(完全) | 两端都是HTTPS,但不校验源站证书有效性 | 源站有自签名证书或测试证书 |
| Full (Strict)(完全严格) | 两端都是HTTPS,且强制校验源站证书有效 | 正式环境推荐,本文采用 |
我的建议是:正式上线站点,直接选 Full (Strict)。这个模式下,Cloudflare会强制要求你的源站服务器(宝塔)上,安装一张有效期内、域名匹配、由受信任CA签发的证书,否则会报 526 错误。听起来要求高,但一旦配好,整个链路的安全等级是最高的。
那源站证书从哪来?两种常见途径:宝塔面板自带的自动续期证书(Let's Encrypt),或者自己用 acme.sh 签发的证书。我推荐用宝塔面板内置的 Let's 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 注册和添加站点到Cloudflare
Cloudflare注册免费账号后,进入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.3,1.2覆盖更广且安全性足够。
4.3 关闭Cloudflare的“灵活模式”的坑
我见过很多朋友踩这个坑:站点还没配好源站证书,就先把Cloudflare的SSL模式设成了 Flexible,结果浏览器那边确实显示绿锁了,但源站和Cloudflare之间是明文HTTP。这不仅导致数据没真正加密,还会在你后续启用 Strict 模式时出现502/526错误,影响体验。
所以我的建议是:宁可早期让站点保持“无证书”的HTTP状态,也不要开 Flexible 模式。等宝塔面板里的源站证书配好了,直接让Cloudflare切到 Full (Strict)。整个过程大概只要10分钟,不存在“过渡期”需求。
5. 宝塔面板SSL证书配置:获取、部署与自动续期
5.1 用宝塔内置的Let's Encrypt免费证书
宝塔面板的“站点 → SSL”页面,是配置源站证书的核心入口。推荐用“Let's Encrypt”免费证书,因为宝塔内置了自动续期脚本,到期前一个月会自动帮你续期,不需要任何人工干预。
操作步骤:
- 在“站点 → SSL”页面,选择“Let's Encrypt”标签。
- 勾选你要签发证书的域名(建议同时勾选根域名
example.com和www.example.com)。 - 选“DNS验证”方式。为什么不用文件验证?因为你的域名已经接了Cloudflare代理,文件验证时Cloudflare的CDN缓存会干扰验证过程,经常导致验证失败。DNS验证会通过解析记录来确认域名归属权,更稳定。
- 点击“申请”,等待十几秒到一分钟,证书就签发成功了。
签发成功后,宝塔会自动把证书内容填到“证书”和“密钥”两个文本框里,并在底部显示“已部署”状态。此时你可以直接访问源站IP + HTTPS试试,比如https://你的服务器IP,如果浏览器报证书不匹配是正常的,因为你访问的是IP而不是域名;直接访问https://你的域名(先别走Cloudflare)就能看到证书有效的绿锁。
5.2 DNS验证需要怎么配合Cloudflare
刚才说到DNS验证,这里细讲一下。Let's 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”按钮。
这种做法比Let's 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里加:
这样Nginx层和PHP层都能感知到请求是HTTPS,避免WordPress生成相对路径时带上$_SERVER['HTTPS'] = 'on';http://。
6.2 网站的固定链接和伪静态规则
默认WordPress的固定链接可能是?p=123这种动态网址,不美观也不利于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 certificate | Cloudflare无法验证源站证书 | 重新确认宝塔里的证书是否完整且未过期;确认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证书过期”的最后一道防线
Let's Encrypt证书有效期是90天,宝塔会自动续期,理论上不用管。但我在生产环境里遇到过几次:因为Nginx配置报错导致nginx -t失败,自动续期脚本也会跟着失败。所以建议每月检查一次nginx -t是否通过,并且留意宝塔“计划任务”里的续期日志。必要时可以设置一条每月的手动续期任务:
bt 14或者直接用宝塔计划任务里的“Let's 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) + Let's Encrypt自动续期。从上线到现在一年多了,没有遇到过证书过期导致的故障,访问速度在国内外都还算稳定,偶尔遇到某个地区的用户访问慢,大多也是本地运营商的问题。这套组合的维护成本很低,每个月花几分钟看一眼日志就行。如果你也想给自己的网站彻底解决“明文传输”的隐患,按着这篇文里的步骤走一遍,应该能少走不少弯路。