You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

新手求教:Nginx resolver参数的作用与配置方法

搞懂Nginx的resolver参数:从困惑到上手

别担心,刚接触Nginx的时候纠结resolver太正常了——我当初对着官方文档翻来覆去看了好几遍,才搞明白它到底解决了什么问题!咱们一步步拆解:

为什么需要resolver

先讲个痛点:Nginx默认启动时,会把你配置的上游服务器域名(比如proxy_pass http://api.example.com;里的api.example.com)一次性解析成IP,然后把这个IP缓存到进程里,之后再也不会主动重新解析

如果你的上游服务器是固定IP的单机还好,但要是遇到这些场景就炸了:

  • 上游是云服务商的负载均衡、CDN,IP经常变化
  • 上游是动态扩容的集群,IP会新增/减少
  • 你想用变量动态指定上游域名(比如根据请求参数选不同的后端)

这时候resolver的作用就显现了:它让Nginx能够定期重新解析域名,获取最新的IP地址,而不是一直死磕启动时的旧IP。

resolver的工作机制

简单说就是这三步:

  1. 指定解析用的DNS服务器:你告诉Nginx,去哪个DNS服务器查域名对应的IP(可以是公共DNS、内部DNS,甚至系统默认的DNS)
  2. 缓存解析结果:Nginx会把解析到的IP存起来,避免每次请求都去查DNS,浪费时间。缓存时间你可以用valid参数自己定
  3. 触发动态解析:只有当上游域名是通过变量指定的时候(比如set $upstream api.example.com; proxy_pass http://$upstream;),Nginx才会用resolver去动态解析——如果直接写死域名,启动时就解析完了,resolver根本没用

怎么配置resolver

举几个实用的例子:

基础配置(用公共DNS)

http {
    # 指定Google公共DNS,解析结果缓存5分钟(300秒)
    resolver 8.8.8.8 8.8.4.4 valid=300s;

    server {
        listen 80;
        server_name mysite.com;

        location /api {
            # 用变量指定上游,触发动态解析
            set $upstream_api api.mysite.com;
            proxy_pass http://$upstream_api;
            proxy_set_header Host $upstream_api;
        }
    }
}

用系统默认DNS

如果不想用公共DNS,想和系统用同一个DNS,可以看你系统的/etc/resolv.conf文件,里面的nameserver就是系统默认DNS,比如常见的127.0.0.53

resolver 127.0.0.53 valid=60s; # 缓存1分钟,更适合IP变化频繁的场景

进阶:自定义解析超时

还可以加timeout参数控制DNS查询的超时时间,避免DNS卡壳拖慢请求:

resolver 8.8.8.8 valid=300s timeout=5s; # DNS查询超时5秒就放弃

常见误区避坑

  • ❌ 直接写死上游域名还配resolver:比如proxy_pass http://api.mysite.com;,这时候Nginx启动时就解析完IP了,resolver不会生效,必须用变量
  • ❌ 忽略缓存时间:如果上游IP变化特别频繁,别把valid设得太长,比如设成1分钟甚至30秒;如果IP很稳定,设成1小时也没问题
  • ❌ 用不可靠的DNS服务器:尽量选稳定的DNS,不然DNS挂了,Nginx就没法解析上游域名了

慢慢来,先找个测试环境配个简单的例子试试,很快就能摸透它的用法啦!

内容的提问来源于stack exchange,提问作者Geekomancer

火山引擎 最新活动