背景与痛点
我把博客部署在了家里的服务器上。但众所周知,家庭宽带一般都会封锁 80 和 443 端口。之前我只能被迫使用 8091 这种非标准端口(例如 https://www.yanchang.cc:8091)来访问,不仅域名后面带着个“小尾巴”不美观,而且对访客也不太友好。主要是给别人看的时候就显得很不专业。


为了解决这个问题,我决定利用手头的一台公网 VPS(云服务器)作为中转。通过在公网服务器上部署 Nginx 反向代理,将标准的 HTTPS 请求(443端口)转发到我家庭服务器的非标准端口上。
架构思路
用户访问:访问公网域名
www.yanchang.pw(标准 HTTPS 443 端口)。公网 VPS:Nginx 接收请求,将流量转发给家庭宽带的 DDNS 域名
www.yanchang.cc:8091。家庭服务器:处理请求并返回内容。
操作步骤
1. 准备工作
公网服务器:一台拥有公网 IP 且未封锁 80/443 端口的 VPS。
SSL 证书:提前申请好公网域名的证书文件(
.pem和.key)。注意为了后续可能维护证书,建议将证书修改一下,后续更换证书只需要直接直接替换即可。(部署证书详情参考另一篇文章:https://yanchang.pw/archives/bu-shu-sslzheng-shu-pei-he-dai-li-shi-xian-httpsjia-mi)
/etc/nginx/ssl/www.yanchang.pem;
/etc/nginx/ssl/www.yanchang.key;Nginx:在公网服务器上安装好 Nginx。
2. 配置 Nginx 反向代理
登录公网服务器,创建或编辑 Nginx 配置文件。这里我新建了一个 proxy.conf:
sudo vim /etc/nginx/conf.d/proxy.conf
核心配置代码如下:
Nginx
server {
# 同时监听 IPv4 和 IPv6 的 443 端口,启用 SSL 和 HTTP/2
listen 443 ssl http2;
listen [::]:443 ssl http2;
# 公网访问的域名
server_name www.yanchang.pw;
# SSL 证书路径配置
ssl_certificate /etc/nginx/ssl/www.yanchang.pem;
ssl_certificate_key /etc/nginx/ssl/www.yanchang.key;
# 推荐的 SSL 安全参数(可选,根据实际情况添加)
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
# 核心:转发到家庭服务器的 DDNS 域名 + 端口
proxy_pass https://www.yanchang.cc:8091;
# -------------------------------------------------
# 关键配置说明:
# -------------------------------------------------
# 1. Host 传递:如果上游(家庭服务器)是按 Host 区分站点的,这里必须指定
proxy_set_header Host www.yanchang.cc;
# 2. 传递真实 IP:保证家庭服务器日志里能看到访客的真实 IP,而不是 VPS 的 IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 3. 处理上游 HTTPS 的 SNI 问题
# 因为家庭服务器也是 HTTPS,且绑定了域名,所以握手时必须传递正确的域名
proxy_ssl_server_name on;
proxy_ssl_name www.yanchang.cc;
}
}
# 可选:将 HTTP 80 强制跳转到 HTTPS 443
server {
listen 80;
listen [::]:80;
server_name www.yanchang.pw;
return 301 https://$host$request_uri;
}
3. 代码中的关键点解析
在配置过程中,有几个参数特别容易出错,这里记录一下:
proxy_pass:这里填写的必须是家庭服务器的实际访问地址,包括协议(https)和端口(8091)。proxy_ssl_server_name on;:这一行非常重要!因为我的家庭服务器配置了 HTTPS,Nginx 在与家庭服务器进行 SSL 握手时,必须通过 SNI 发送域名,否则握手会失败(报错 502 Bad Gateway)。proxy_set_header Host:这里我将其设置为了家庭服务器的域名www.yanchang.cc,确保家庭服务器的 Nginx 能正确识别请求。
4. 别忘了防火墙(安全组)
配置完 Nginx 后,如果发现无法访问,第一时间检查云服务器的防火墙/安全组设置。
很多云厂商(如阿里云、腾讯云、AWS)默认只开放 22 端口,我们需要手动在控制台放行:

入方向:TCP 协议,端口 80 和 443。
如果是 Linux 系统内部有防火墙(如 ufw 或 firewalld),也需要放行:
# 如果使用 ufw
sudo ufw allow 80
sudo ufw allow 443
sudo ufw reload
效果验证
配置完成后,检查 Nginx 语法并重载:
sudo nginx -t
sudo systemctl reload nginx
现在,直接访问 https://www.yanchang.pw,就可以看到那个运行在家里 8091 端口的博客了,浏览器地址栏干干净净,且这就有了小绿锁保护。