用 Cloudflare + Nginx 给服务器配置 HTTPS 全流程
> 适用场景:域名托管在 Cloudflare,服务器跑在腾讯云(或任意 VPS),需要通过域名 HTTPS 访问服务。
---
## 前置条件
- 已有一个域名(本文以 mochif.com 为例)
- 域名 DNS 已托管到 Cloudflare
- 服务器已有应用在某个端口运行(本文以 new-api 跑在 3000 端口为例)
- 服务器系统:Ubuntu
---
一、清理 DNS 记录
域名从其他注册商(如 Spaceship)转入 Cloudflare 时,会自动导入原有的 DNS 记录,通常是注册商默认的 parking 页面 IP,没有任何用处。
进入 Cloudflare 控制台 → DNS,把自动导入的 A 记录全部删掉。
然后手动添加一条:
| 类型 | 名称 | 内容 | 代理状态 |
|------|------|------|----------|
| A | @ | 你的服务器公网 IP | 已代理(橙云开启) |
如果需要子域名(如 api.mochif.com),再加一条 api 指向同一个 IP。
---
二、申请 Cloudflare 源服务器证书
Cloudflare 提供免费的源服务器证书,有效期最长 15 年,专门用于 Cloudflare 到源服务器之间的加密,省去了 Let's Encrypt 90 天续签的麻烦。
步骤:
1. Cloudflare 控制台 → 选择域名 → SSL/TLS → 源服务器
2. 点击「创建证书」
3. 默认选项不用改:
- 使用 Cloudflare 生成私钥和 CSR
- 私钥类型:RSA (2048)
- 主机名*.mochif.com 和 mochif.com(自动填写)
- 有效期:15 年
4. 点击创建,得到两段内容:**源证书** 和 私钥
> ⚠️ 私钥只显示一次,必须立即复制保存,关闭页面后无法找回。
---
三、服务器安装 Nginx 并保存证书
### 3.1 安装 Nginx
```bash
sudo apt update && sudo apt install nginx -y
```
验证安装:
```bash
nginx -v
```
### 3.2 保存证书文件
创建证书目录:
```bash
sudo mkdir -p /etc/nginx/ssl
```
保存证书:
```bash
sudo nano /etc/nginx/ssl/mochif.crt
```
将源证书内容-----BEGIN CERTIFICATE----- 到 -----END CERTIFICATE----- 完整内容)粘贴进去,Ctrl+X → Y → 回车保存。
保存私钥:
```bash
sudo nano /etc/nginx/ssl/mochif.key
```
将私钥内容-----BEGIN PRIVATE KEY----- 到 -----END PRIVATE KEY----- 完整内容)粘贴进去,同样保存。
---
四、配置 Nginx 反代
创建配置文件:
```bash
sudo nano /etc/nginx/sites-available/mochif
```
粘贴以下内容:
```nginx
server {
listen 443 ssl;
server_name mochif.com;
ssl_certificate /etc/nginx/ssl/mochif.crt;
ssl_certificate_key /etc/nginx/ssl/mochif.key;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# HTTP 自动跳转 HTTPS
server {
listen 80;
server_name mochif.com;
return 301 https://$host$request_uri;
}
```
启用配置并重载:
```bash
sudo ln -s /etc/nginx/sites-available/mochif /etc/nginx/sites-enabled/
sudo nginx -t # 检查语法
sudo systemctl reload nginx
```
nginx -t 输出 syntax is ok 和 test is successful 说明配置无误。
---
五、Cloudflare SSL 模式设置
Cloudflare 控制台 → SSL/TLS → 概述,将加密模式改为**完全**。
不要选「完全(严格)」,因为源服务器证书不是公共 CA 签发的,严格模式不认。
| 模式 | 含义 |
|------|------|
| 灵活 | Cloudflare 到源服务器明文 HTTP,服务器无需证书 |
| 完全 | Cloudflare 到源服务器加密,接受自签或源服务器证书 |
| 完全(严格) | 同上,但只接受受信任 CA 签发的证书 |
---
六、放行服务器 443 端口
如果使用腾讯云,需要在安全组放行 443 端口:
腾讯云控制台 → 安全组 → 入站规则 → 添加:
| 协议 | 端口 | 来源 |
|------|------|------|
| TCP | 443 | 0.0.0.0/0 |
其他云服务商操作类似,防火墙/安全组记得放行。
---
七、访问链路说明
配置完成后,完整的访问链路如下:
```
用户浏览器
↓ HTTPS(Cloudflare 边缘证书)
Cloudflare CDN
↓ HTTPS(源服务器证书)
Nginx(443 端口)
↓ HTTP
应用服务(3000 端口)
```
访问 https://mochif.com 即可正常打开,浏览器显示绿锁。
---
扩展:新增服务只需两步
后续每增加一个服务(如在 4000 端口跑另一个应用),不需要重新申请证书:
1. Cloudflare 加一条子域名 A 记录(如 chat.mochif.com)
2. 服务器加一个 Nginx 配置文件server_name 改成新子域名proxy_pass 指向新端口
证书通配符 *.mochif.com 覆盖所有子域名,15 年内无需任何维护。