一、前言
自从去年家里换了高性能NAS之后,我的一些测试站点就从 ECS 上迁移到了家里的虚拟机,毕竟性能强太多。然而,家里的公网IP的80和443端口都被封了。为了解决这个问题,我选择使用公网的服务器做反向代理。虽然有 DDNS,但在 Nginx 做反向代理时,每次 IP 变更之后,都无法访问网站,会一直卡在加载中,直到 504 超时。经过查阅资料和实践,我终于找到了解决方法。本文将介绍如何解决动态 IP 和 DDNS 下 Nginx 反向代理的 504 超时问题。
二、问题分析
在使用Nginx做反向代理时,我们通常会使用如下配置:
location / {
proxy_pass http://example.com:8443;
proxy_redirect off;
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;
}
然而,在动态IP和DDNS的环境下,这样的配置会导致504超时。问题出在Nginx读取配置文件时,将域名解析为IP,并在运行时不再改变。当DDNS更新后,Nginx仍然尝试请求原来的IP,导致超时。
三、解决方法
为了解决这个问题,我们需要使用resolver参数,并配合resolver_timeout参数。resolver用于指定DNS解析服务器,resolver_timeout 用于指定解析超时时间。此外,我们还需要设置缓存有效时间,这里使用1s。以下是正确的Nginx配置方法:
resolver 8.8.8.8 119.29.29.29 valid=1s;
resolver_timeout 3s;
set $proxy_url http://example.com:8443;
location / {
proxy_pass $proxy_url;
proxy_redirect off;
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;
}
这样配置后,Nginx 会在运行时通过 DNS 解析域名,当 DDNS 更换 IP 后,也能正常进行反向代理。值得注意点是,DNS服务器可能需要等待一定的时间才能正确返回新的 IP,所以更换 IP 后网站仍然会有一定时间不可访问。在这种情况下,可以使用 nslookup <domain> <dns>
来查看指定 DNS 服务器对域名的解析情况,以排除 Nginx 的问题。
可是我根据这个配置,会404,我跟你的区别是有 /api/ 这一个后缀
博主你好,公网服务器作反向代理,nas服务的速度会受限于公网服务器的速度吗
@captno78: 对的,公网访问的时候取决于服务器