Nginx启动时不主动读取/etc/hosts,但使用域名配置时依赖系统解析器:静态解析(如upstream或proxy_pass直写域名)遵循系统hosts→DNS顺序,/etc/hosts优先;动态解析(resolver+变量)则跳过hosts仅查指定DNS。

Nginx 启动时**不会主动解析或读取 `/etc/hosts` 文件**,它本身不进行域名解析;解析行为发生在上游依赖环节,优先级由系统和调用方式决定。
nginx.conf 中的域名配置(如 proxy_pass、upstream)
当配置中使用了域名(例如 proxy_pass http://backend.example.com;),Nginx 在启动阶段会尝试将该域名解析为 IP 地址:
- 若域名能被系统 resolver(通常是 libc 的
getaddrinfo())一次性解析成功,Nginx 就缓存该 IP,后续不再查 DNS 或 hosts; - 此时解析遵循系统标准顺序:先查
/etc/hosts(如果匹配则立即返回),再查 DNS; - 这意味着:
/etc/hosts在该场景下具有最高优先级,但前提是 Nginx 启动时该域名未配置为动态解析(即没加resolver指令且没用变量)。
使用 resolver 指令 + 变量(动态解析)
若配置类似 resolver 8.8.8.8; proxy_pass http://$host;,Nginx 会在每次请求时调用 resolver 异步解析:
- 此时解析由 Nginx 自带的 resolver 执行,不读取
/etc/hosts; - 只按
resolver指令指定的 DNS 服务器查询,跳过系统 hosts 机制; - 因此这种模式下,
/etc/hosts完全无效。
upstream 块中的域名解析
在 upstream 中写域名(如 server backend.example.com:80;):
- Nginx 启动时解析一次,并缓存结果;
- 解析过程调用系统 getaddrinfo(),遵守系统 hosts → DNS 顺序;
- 若希望支持自动更新(如 hosts 改变后生效),需配合
resolver和resolve参数(1.19.9+),否则仍为静态缓存。
系统层面的 hosts 优先级保障
只要 Nginx 使用系统解析器(默认行为),其行为就受系统 nsswitch.conf 控制:
- 典型配置为
hosts: files dns,表示先查/etc/hosts,再查 DNS; - 若改为
hosts: dns files,则 DNS 优先 —— 这种配置极少见,且不推荐; - 验证方式:在 Nginx 机器上运行
getent hosts backend.example.com,看是否命中 hosts。










