上周我把自己的博客折腾上了 HTTPS。折腾的过程里,把两条完全不同的路都走了一遍:一条是标准的公网云服务器,另一条是内网穿透。
踩的坑完全不一样,配置思路也完全不同,索性记下来,给同样卡在「域名怎么绑」这个问题上的朋友省点时间。
先搞清楚:「绑定域名」其实是两件事
很多人以为在域名后台加条记录就叫绑定,其实那只做了一半。
一次完整的访问要经过四个环节:
- 浏览器输入域名
- DNS 解析出公网 IP
- 请求到达服务器的 80 或 443 端口
- Web 服务器认出「这是哪个域名」,转发给对应的后端程序
第 1、2 步在域名商那边配,第 3、4 步在你自己机器上配。 两段都通了,才叫真的绑上了。
第 4 步最容易被人忽略。服务器收到请求时,HTTP 头里带着一行 Host: blog.yourdomain.com,Nginx 就是拿它跟每个 server 块的 server_name 比对,命中哪个就走哪个。没命中任何一块,就落到默认站点——这也就是为什么有时候直接输 IP,会看到一个莫名其妙的默认页。
搞懂了这四步,两种方案的区别就只剩一个问题:中间那一段路,是谁在替你走。
路线 A:公网云服务器
买台阿里云 ECS,配了公网 IPv4,最标准的做法。
链路很短:
浏览器 → DNS → 你的公网 IP:443 → Nginx → 后端 127.0.0.1:8080
配置也就三件事。
第一,加一条 A 记录。 在域名控制台给 blog.yourdomain.com 加 A 记录,值填服务器公网 IP。
第二,安全组放行。 阿里云控制台 → 实例 → 安全组 → 入方向,加上 80 和 443。这一步漏了,配置写得再对也没用,浏览器会一直转圈直到超时。
第三,Nginx 里写 server 块:
server {
listen 443 ssl;
server_name blog.yourdomain.com;
ssl_certificate /etc/nginx/ssl/blog.crt;
ssl_certificate_key /etc/nginx/ssl/blog.key;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
server {
listen 80;
server_name blog.yourdomain.com;
return 301 https://$host$request_uri;
}
server_name 那一行,才是「绑定」的本体。
这里有个常被问到的细节:TLS 握手发生在浏览器发出 Host 头之前,那时候服务器还看不到 HTTP 头。所以 HTTPS 的分流靠的不是 Host,而是 SNI——浏览器在握手第一步就喊一句「我要访问 blog.yourdomain.com」。Nginx 拿 SNI 去匹配 server_name 选证书,所以一台机器上不同域名能各用各的证书。
还有一个绕不过去的门槛:备案。 大陆服务器 + 自己的域名 + 走 80/443,基本都要 ICP 备案。没得商量,这是政策层面的事,不是技术能绕的。
优点很明确:带宽独享、IP 归你、延迟最低、想跑什么跑什么。
缺点也很明确:要花钱,要备案,服务器得有公网 IP。
路线 B:内网穿透
如果服务器在家里,运营商给的是大内网 IP,或者压根不想买公网带宽,那就走这条路。
链路长了一截:
浏览器 → DNS → 穿透节点的 IP:443 → frps 按域名分流 → 加密隧道 → 你的机器:443 → 后端
关键是那个「穿透节点」。它是一台有公网 IP 的机器,你花钱买的其实是它的一段转发能力。你的域名解析到的不是自己的服务器,而是这个节点的 IP。
配置同样三件事,但顺序和踩的坑完全不同。
第一,还是 A 记录。 只不过值要填穿透服务商给你的节点 IP。
第二,在服务商面板里登记域名。 这一步是路线 B 独有的,也是最容易翻车的地方。我用的是 ipfrp,面板里要新建一条 HTTPS 类型的代理,填本地端口 443,再把域名绑定上去。
第三,改服务器上的 frpc 配置文件。 大概长这样:
[[proxies]]
name = "261_tqh7agzb"
type = "https"
localIP = "127.0.0.1"
localPort = 443
customDomains = ["blog.happytiger.online"]
注意那个 name——它不是你自己随便起的,是面板生成的随机串。这是我这周踩得最结实的一个坑:我一开始图省事自己写了 blog_https,frpc 加载正常、没有任何报错,但域名打不开。翻日志才看到:
start error: [20007] blog.happytiger.online 未绑定,请添加到平台
意思是服务端有一张域名白名单,光在你自己的配置文件里写是不够的,必须先在人家面板上登记,而且代理名必须跟面板生成的一字不差。
正确的顺序是:面板加代理 → 抄下代理名 → 改配置文件 → 重启 frpc。 倒过来做,一定失败。
再说 HTTPS。穿透场景下有个挺关键的点:证书是装在你自己的机器上的,服务商只负责转发密文。type = "https" 的代理,frps 只是根据 SNI 把 TLS 数据流原样转给你,解密发生在你的机器上。所以证书、私钥、续期,全都归你管——也多了一份责任。
优点:不用公网 IP、不用买带宽、内网机器也能对外提供服务、成本低得多。
缺点:带宽和稳定性都受服务商制约、多一层故障点、大陆节点用自己域名还是绕不开备案。
正面对比
| 对比项 | 公网云服务器 | 内网穿透 |
|---|---|---|
| 域名指向 | 自己的公网 IP | 服务商的节点 IP |
| 带宽 | 独享,买多少是多少 | 共享,受套餐限制 |
| 延迟 | 最低 | 多一跳,略高 |
| 月成本 | 几十到几百元 | 十元级 |
| 备案 | 必须 | 大陆节点也必须 |
| 域名白名单 | 不需要 | 需要在面板登记 |
| 证书位置 | 自己服务器 | 自己服务器 |
| 故障点 | 少 | 多一个中转环节 |
| 适合场景 | 正式对外站点 | 自用服务、测试、内网设备 |
我怎么选的
说实话,两条路我都在用,分工不同。
博客这种要长期对外、会被搜索引擎收录、偶尔还要分享给别人的,我走了公网服务器那条,省心。
而课表收集、NAS 面板这类「只有我和家长偶尔用一下」的服务,走穿透。花十块钱一个月,换一台不用管公网 IP 的内网机器,我觉得挺值。
所以这道题没有标准答案。先问自己三个问题:这台服务是给谁看的?能接受多少延迟?愿不愿意为了它去备案?
想清楚这三个,选哪条路其实自己就浮出来了。
这篇文章就在自己的博客上写完的,顺便也是这个博客的第一篇。写的时候顺手把 HTTPS 配好了,算是给它办了个体面的开张。