美好的明天

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

前言

我在家里有一台内网服务器,电信宽带有动态的公网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 11:33:40,距今已 910 天,若有链接失效或教程无效,欢迎留言反馈。
THE END

发表评论

gravatar

OK aixin aoman baoquan bizui cahan caidao ciya dabing doge fadai ganga guzhang haixiu hanxiao huaixiao jie jingkong keai koubi ku leiben lenghan liuhan nanguo penxue piezui qiang qinqin quantou se shengli shuai tiaopi touxiao tuosai weiqu woshou wozuimei wunai xiaojiujie xiaoku xieyanxiao xigua yinxian yiwen youling yun