yanchang
yanchang
发布于 2026-01-27 / 17 阅读
0
0

家庭宽带无 80/443 端口,用公网 服务器 做 Nginx 反向代理与 SSL

背景与痛点

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

为了解决这个问题,我决定利用手头的一台公网 VPS(云服务器)作为中转。通过在公网服务器上部署 Nginx 反向代理,将标准的 HTTPS 请求(443端口)转发到我家庭服务器的非标准端口上。

架构思路

  • 用户访问:访问公网域名 www.yanchang.pw (标准 HTTPS 443 端口)。

  • 公网 VPS:Nginx 接收请求,将流量转发给家庭宽带的 DDNS 域名 www.yanchang.cc:8091

  • 家庭服务器:处理请求并返回内容。

操作步骤

1. 准备工作

/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 协议,端口 80443

如果是 Linux 系统内部有防火墙(如 ufwfirewalld),也需要放行:

# 如果使用 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 端口的博客了,浏览器地址栏干干净净,且这就有了小绿锁保护。


评论