专门适合宝塔面板(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?
