专门适合宝塔面板(BT)+ 阿里云 ECS → 家庭 DDNS 服务器 的 Nginx 反向代理配置

admin2025-08-31未分类86

Nginx 配置模板(宝塔反代用)

在宝塔面板 → 网站 → 设置 → 反向代理 → 修改配置文件,替换为以下内容:

#PROXY-START/

location ^~ /
{
    resolver 100.100.2.136 100.100.2.138 valid=10s;
    set $backend "https://blog.1688fs.net:1443";
    proxy_pass $backend$request_uri;
    proxy_set_header Host $host;
    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;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 60s;
    proxy_connect_timeout 5s;
    proxy_send_timeout 30s;

    proxy_next_upstream error timeout invalid_header http_502 http_503 http_504;

    set $static_file 0;
    if ($uri ~* "\.(gif|png|jpg|jpeg|css|js|woff|woff2)$") {
        set $static_file 1;
        expires 1m;
    }
    if ($static_file = 0) {
        add_header Cache-Control no-cache;
    }

    add_header X-Cache $upstream_cache_status;
}
#PROXY-END/
配置详细说明

#PROXY-START/

location ^~ /  # 匹配根路径及其所有子路径,用于反向代理整个网站
{
    resolver 100.100.2.136 100.100.2.138 valid=10s;  
    # 指定 DNS 服务器(阿里云内网 DNS),并设置缓存有效期 10 秒
    # 每 10 秒刷新一次域名解析,保证 DDNS IP 变更后能访问

    set $backend "https://blog.1688fs.net:1443";  
    # 定义变量 $backend 存储上游服务器地址(家庭服务器 HTTPS 端口)

    proxy_pass $backend$request_uri;  
    # 将客户端请求转发到上游服务器,并保留原始 URI
    # 使用 $request_uri 避免乱码和资源路径错误

    proxy_set_header Host $host;  
    # 保持客户端访问的 Host(域名)透传到上游
    # 防止网站认为是 IP 访问导致乱码或资源路径错误

    proxy_set_header X-Real-IP $remote_addr;  
    # 透传客户端真实 IP 到上游服务器

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
    # 记录代理链中的客户端 IP,支持多级代理

    proxy_set_header X-Forwarded-Proto $scheme;  
    # 透传请求协议(http 或 https),上游服务器可根据此判断

    proxy_http_version 1.1;  
    # 使用 HTTP/1.1 协议,必要条件才能支持 WebSocket

    proxy_set_header Upgrade $http_upgrade;  
    # WebSocket 升级头,允许 HTTP 连接升级为 WebSocket

    proxy_set_header Connection "upgrade";  
    # WebSocket 升级标识,必须设置为 "upgrade"

    proxy_read_timeout 60s;  
    # 等待上游服务器响应的最大时间(WebSocket 长连接),超过断开

    proxy_connect_timeout 5s;  
    # 连接上游服务器的超时时间

    proxy_send_timeout 30s;  
    # 向上游服务器发送请求数据的超时时间

    proxy_next_upstream error timeout invalid_header http_502 http_503 http_504;  
    # 当出现上游错误、超时或返回 502/503/504 等错误时,尝试下一个上游
    # 提高代理可用性,适合家庭服务器可能 DDNS 改变的情况

    set $static_file 0;  
    # 初始化变量,用于判断是否是静态文件

    if ($uri ~* "\.(gif|png|jpg|jpeg|css|js|woff|woff2)$") {
        set $static_file 1;  
        expires 1m;  
        # 静态资源缓存 1 分钟,提高访问速度,减轻上游负载
    }

    if ($static_file = 0) {
        add_header Cache-Control no-cache;  
        # 非静态资源不缓存,保证动态请求实时性
    }

    add_header X-Cache $upstream_cache_status;  
    # 调试用,显示缓存状态(MISS/HIT/BYPASS),方便排查问题
}

#PROXY-END/

🔹 使用方法(在宝塔面板里操作)

  1. 登录宝塔面板 → 网站 → 选择 1688fs.net → 点击 反向代理

  2. 添加一个代理规则(目标地址写 https://blog.1688fs.net:1443)。

  3. 添加完后,点进去 → 配置文件 → 把里面的 location / { ... } 替换成上面这段。

  4. 保存并重载 Nginx。


🔹 说明

  • resolver 100.100.2.136 100.100.2.138 valid=30s;

    • 指定阿里云内网的 DNS(比 8.8.8.8 快),每 30 秒重新解析一次域名。

    • 如果家庭宽带换 IP,30 秒内 ECS 就会更新。

  • set $backend

    • 强制让 proxy_pass 使用变量,这样才能触发动态 DNS 解析。

  • proxy_set_header Host $host;

    • 保持原始域名头(避免博客程序认为是 IP 访问)。

  • proxy_next_upstream

    • 出错时自动重试,不会马上 502。


🔹 验证方法

  1. 先访问 1688fs.net → 确认能正常反代到家庭服务器。

  2. 手动让家庭宽带换一个公网 IP(断开/重拨)。

  3. 等 30 秒,再访问 1688fs.net → 如果还能正常访问,就说明配置生效。


👉 这样配置好之后,你就 不需要重启 PHP/Nginx 了,DDNS 更新后 ECS 会自动跟上,不再频繁报 502。

要不要我再帮你加一份 支持 WebSocket(ws/wss)反代 的配置?这样如果你博客里有即时通信或者后台管理面板用 WebSocket,也能直接透传。


““支持 WebSocket(ws/wss)反代 的配置”请帮我加上, “proxy_set_header Host $host; 保持原始域名头(避免博客程序认为是 IP 访问) ”这个是客户端访问网站,IP直接透传到“https://blog.1688fs.net:1443”服务器是把?”



🔹 完整配置(支持 HTTP + WebSocket)

location / {
    # DNS 动态解析,阿里云内网 DNS,30 秒刷新一次
    resolver 100.100.2.136 100.100.2.138 valid=30s;

    # 触发变量方式 proxy_pass,保证 Nginx 每次都能刷新解析
    set $backend "https://blog.1688fs.net:1443";

    proxy_pass $backend;

    # ========= 请求头透传 =========
    proxy_set_header Host $host;                # 保持用户访问的域名(1688fs.net)
    proxy_set_header X-Real-IP $remote_addr;    # 传递真实客户端 IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    # ========= WebSocket 支持 =========
    proxy_http_version 1.1;                     # 必须 HTTP/1.1 才能升级
    proxy_set_header Upgrade $http_upgrade;     # WebSocket 升级头
    proxy_set_header Connection "upgrade";      # 连接升级
    proxy_read_timeout 60s;                     # WebSocket 长连接超时时间

    # ========= 超时控制 =========
    proxy_connect_timeout 5s;
    proxy_send_timeout 30s;

    # ========= 出错时重试 =========
    proxy_next_upstream error timeout invalid_header http_502 http_503 http_504;
}

🔹 解释

  1. Host 透传

    proxy_set_header Host $host;
    • 用户访问的是 https://1688fs.net,Nginx 默认会把 Host 改成 blog.1688fs.net:1443

    • 加上这一行后,Nginx 会把 用户原始访问的 Host(1688fs.net) 传给家庭服务器。

    • 好处:家庭服务器上的 Web 程序会认为自己就是被访问 1688fs.net,不会跳转到 blog.1688fs.net 或报错。

  2. 真实 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;

    ⚠️ 家庭服务器直接看到的来源 IP 还是 ECS(因为 TCP 源 IP 已经变了),但是应用(比如 Nginx、PHP、博客程序)可以通过 X-Real-IP 获取到真正的客户端 IP。

    👉 也就是说:

    • 家庭服务器操作系统层面:来源 IP = ECS 公网 IP

    • 家庭服务器的 Web 应用层面:来源 IP = 用户真实 IP(通过 X-Real-IP

    • X-Real-IP → 客户端真实 IP

    • X-Forwarded-For → 如果有多级代理,会追加 IP 列表

    • X-Forwarded-Proto → 协议(http/https),避免应用误判

  3. WebSocket 支持

    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    • 必须加这两行,否则 WebSocket (ws/wss) 握手会失败。

    • proxy_read_timeout 60s; → 避免 WebSocket 长时间空闲被断开。


🔹 使用方法

  1. 在宝塔面板 → 网站 → 反向代理 → 配置文件,替换成上面这份。

  2. 保存 → 重载 Nginx。

  3. 测试:

    • 打开 https://1688fs.net 看网页能否正常访问。

    • 如果博客里有 WebSocket(如评论系统、在线聊天、后台实时更新),检查浏览器开发者工具 → Network → ws 是否成功。

    • 在家庭服务器 Nginx/Apache/PHP 日志里,确认 X-Real-IP 是否能显示客户端的公网 IP。


👉 这样配置以后,你的 ECS 就能:

  • 自动刷新 DDNS IP(不用重启服务)

  • 支持 HTTP + WebSocket 正常转发

  • 日志里能看到客户端真实 IP(不是 ECS 的)


要不要我再帮你写一份 家庭服务器端 Nginx 配置,把 X-Real-IP 自动识别出来,日志里直接显示真实客户端 IP,而不是 ECS 的 IP?


发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。