新手求教: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的工作机制
简单说就是这三步:
- 指定解析用的DNS服务器:你告诉Nginx,去哪个DNS服务器查域名对应的IP(可以是公共DNS、内部DNS,甚至系统默认的DNS)
- 缓存解析结果:Nginx会把解析到的IP存起来,避免每次请求都去查DNS,浪费时间。缓存时间你可以用
valid参数自己定 - 触发动态解析:只有当上游域名是通过变量指定的时候(比如
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




