美好的明天
分享改变,记录生活
美好的明天
当前位置: 首页 > PHP, 经验分享 > 正文

Nginx反向代理DNS缓存问题

前言

我在家里有一台内网服务器,电信宽带有动态的公网IP,所以我配置了DDNS域名,这样公网就可以通过域名访问到家中的内网服务器。 因为电信宽带封禁了常见的80/443端口,所以我在阿里云服务器上配置了Nginx做反向代理,但是发现经常502错误,只有重启Nginx才能恢复,此时内网服务工作正常。

原因

原因在于Nginx反向代理解析DDNS域名时,只会在Nginx启动解析配置文件的时候解析1次,此后就会一直拿着解析到的IP连接upstream。因此,当我的公网IP变化后,Nginx并不会重新去解析DDNS域名,导致连接一个错误的IP。 反向代理Nginx配置文件大概是这样的:
server {
    charset utf-8;

    listen 80;
    server_name a.mysite.com;
    index  index.html index.htm;

    location / {
        proxy_pass http://backend.mysite.com:7001;
        proxy_redirect     off;
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 8 10M;
        proxy_busy_buffers_size 20M;
        proxy_max_temp_file_size 0;
    }
}
阿里云a.mysite.com反向代理给http://backend.mysite.com:7001,然而backend.mysite.com的IP地址一旦变化就会导致无法连接。

解决方法

我希望每次Proxy行为都重新解析IP地址,或者至少可以控制缓存的时间。 要实现这个效果,必须把backend.mysite.com作为变量,这样nginx启动时则不会解析IP,而是运行时解析。 Nginx配置文件修改如下:
server {
    charset utf-8;

    listen 80; 
    server_name a.mysite.com;
    index  index.html index.htm;

    resolver 114.114.114.114 valid=1s;
    set $proxy_pass_url http://backend.mysite.com:7001;
    location / {
        proxy_pass $proxy_pass_url;
        proxy_redirect     off;
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 8 10M;
        proxy_busy_buffers_size 20M;
        proxy_max_temp_file_size 0;
    }
}
每个请求都会动态set变量proxy_pass_url,然后proxy_pass使用变量连接,这样就可以实现每次强制解析IP地址的目的了。 需要配置resolver指定一个DNS服务器,并且还可以指定DNS结果缓存的时间,我这里为了保证IP更新及时性,所以设置了valid=1秒。 问题就此问题得以解决。
原文来自:鱼儿的博客 - nginx反向代理dns缓存问题 | 鱼儿的博客 (yuerblog.cc)
温馨提示

本页面最后更新于:2022-11-01,距今已 1116 天,若有链接失效或教程无效,欢迎留言反馈。

正文结束

相关推荐

Nginx反向代理DNS缓存问题:等您坐沙发呢!

发表评论