抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

起因

今天打开博客地址blog.xiaobai.com发现出现了504错误,一脸懵逼,难道我的站点挂了?服务器里就一nginx也能挂?不可能吧!

查找原因

因为域名是腾讯云买的,所以我的主域名xiaobaihome.cn是通过家里的软路由使用ddns的方式将IP变更传给dnspod进行解析,二级域名blog.xiaobaihome.cn解析到腾讯云服务器,通过nginx代理到主域名+端口,家里每次重启路由器IP地址就会变化

抱着探索的心态,打开了nginx日志,发现一堆请求超时,一看IP地址和DNSPOD里的IP不一样。重启nginx -s reload之后,站点恢复正常访问,难道nginx访问的IP地址是缓存的?nginx代理站点走的dns有缓存?于是上网查了一下,发现这是个很常见的问题。

尝试修复

一篇文章里面写了两种方法

  • upstream 的max_fails + fail_timeout参数
    10s内,失败3次,则不再往故障IP发生请求,根据自身情况调整参数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    upstream backends {
    least_conn;
    server backends.example.com:8080 max_fails=3 fail_timeout=10s;
    }

    server {
    location / {
    proxy_pass http://backends;
    }
    }
  • nginx的resolver
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    server {
    listen 8080;
    server_name localhost;
    resolver 114.114.114.114 223.5.5.5 valid=3600s;
    resolver_timeout 3s;
    set $qq "www.qq.com";
    location / {
    proxy_pass http://$qq;
    }
    }
    作者:黑板擦
    链接:https://www.zhihu.com/question/61786355/answer/268735267
    来源:知乎

依次尝试,修改nginx配置,nginx -s reload,重启家里路由器,看dnspod里的ip变了,访问blog.xiaobaihome.cn,两种都没通,正一脸懵逼的时候又看到一篇文章
文章地址:https://yuerblog.cc/2020/02/20/nginx%e5%8f%8d%e5%90%91%e4%bb%a3%e7%90%86dns%e7%bc%93%e5%ad%98%e9%97%ae%e9%a2%98/

问题解决

文章中写道:
我希望每次proxy行为都重新解析IP地址,或者至少可以控制缓存的时间。

要实现这个效果,必须把backend.mysite.com作为变量,这样nginx启动时则不会解析IP,而是运行时解析。

nginx配置文件修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}
}

由此发现,重点是要将域名设置为变量,才会在运行时解析,之前的方法没好使是由于nginx启动时就已经把域名解析成IP了。

最后保存配置,重启nginx,恢复正常访问

评论