专门适合宝塔面板(BT)+ 阿里云 ECS → 家庭 DDNS 服务器 的 Nginx 反向代理配置
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/
🔹 使用方法(在宝塔面板里操作)
登录宝塔面板 → 网站 → 选择
1688fs.net
→ 点击 反向代理。添加一个代理规则(目标地址写
https://blog.1688fs.net:1443
)。添加完后,点进去 → 配置文件 → 把里面的
location / { ... }
替换成上面这段。保存并重载 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。
🔹 验证方法
先访问
1688fs.net
→ 确认能正常反代到家庭服务器。手动让家庭宽带换一个公网 IP(断开/重拨)。
等 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; }
🔹 解释
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
或报错。真实 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
→ 客户端真实 IPX-Forwarded-For
→ 如果有多级代理,会追加 IP 列表X-Forwarded-Proto
→ 协议(http/https),避免应用误判WebSocket 支持
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
必须加这两行,否则 WebSocket (ws/wss) 握手会失败。
proxy_read_timeout 60s;
→ 避免 WebSocket 长时间空闲被断开。
🔹 使用方法
在宝塔面板 → 网站 → 反向代理 → 配置文件,替换成上面这份。
保存 → 重载 Nginx。
测试:
打开
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?