参考资料

  1. Nginx upstream容错机制详解详细说明以及案例
  2. nginx重启指定配置文件
  3. nginx配置刷新域名
  4. Nginx设置配置文件详细说明以及案例
  5. Jenkins安装与配置详细说明以及案例
  6. Nginx代理缓存配置详细说明以及案例
  7. Nginx配置HTTPS教程
  8. Nginx有哪些安全相关的模块?

nginx配置刷新域名

nginx 配置刷新域名

在企业网站或内部系统中,经常需要通过域名访问 Nginx 代理的服务。如果域名解析记录发生了变更(例如更换了服务器 IP、新增了 CDN 节点),或者修改了 `/etc/hosts` 文件,经常发现刷新后依然访问到旧地址。这并非 Nginx 缓存了域名,而是系统或浏览器对 DNS 结果进行了缓存。本文介绍如何从 Nginx 层面合理配置域名刷新机制,以及如何配合系统层操作让域名更新快速生效。

一、为什么需要“刷新域名”?

Nginx 在启动时或配置文件重载时,会解析 `proxy_pass` 等指令中使用的域名。一旦解析完成,在 worker 进程存活期间默认不会重新解析,除非配置了动态解析模块或触发 reload。因此,当后端域名指向的 IP 发生变化,而 Nginx 未重启或 reload,就会继续将请求转发到旧 IP,导致服务异常。 此外,浏览器和操作系统也会对域名解析结果进行缓存,即使 Nginx 重新解析了,客户端可能仍访问旧的 IP。理解这个链路后,我们可以从三层来解决:

  • 浏览器缓存(通过设置响应头控制)
  • 操作系统 DNS 缓存(通过刷新系统缓存)
  • Nginx 解析缓存(通过配置或 reload 刷新)

二、方案一:修改 hosts 并重载 Nginx

如果只是临时测试或域名解析未生效,通常直接修改服务器 `/etc/hosts` 文件,然后执行 Nginx 重载: bash

编辑 /etc/hosts,添加或修改记录

192.168.1.10 api.example.com

测试配置语法

nginx -t

重新加载配置

nginx -s reload 重载后,Nginx 会重新读取配置并解析域名。若您使用 `upstream` 指令并在其中使用域名,单纯 reload 也可以触发重新解析。注意:reload 不会中断现有请求,只是让新配置生效,这是最稳妥的刷新方式。

三、方案二:让 Nginx 自动刷新 DNS

如果后端域名会频繁变化,每次手动 reload 不现实。推荐使用 Nginx 的 `resolver` 指令,配合变量方式动态解析域名。示例配置: nginx http { resolver 223.5.5.5 valid=30s ipv6=off; server { listen 80; server_name proxy.example.com; location / { set $backend "api.example.com"; proxy_pass http://$backend; proxy_set_header Host api.example.com; } } } 关键点:

  • `resolver` 指定 DNS 服务器,可以写多个,例如 `resolver 8.8.8.8 114.114.114.114 valid=30s;`
  • `proxy_pass` 中不能直接写域名,必须使用变量(如 `$backend`),这样 Nginx 会按照 `resolver` 配置的缓存时间定期重新解析。
  • `valid=30s` 表示 Nginx 缓存解析结果 30 秒,之后自动向 DNS 服务器查询新 IP。
  • 变量中的域名如果包含端口,需要写完整,例如 `set $backend "api.example.com:8080";`

此方案适合后端 IP 经常变化且不希望手动干预的场景。但注意,使用变量后 Nginx 不会在启动时立即解析域名,若 DNS 不可用会导致请求失败,建议在 `resolver` 中配置多个可靠 DNS。

四、方案三:强制刷新上游域名

对于使用 `upstream` 定义后端的情况,可通过调整配置实现主动刷新。 nginx upstream backend { server api.example.com resolve; } server { listen 80; location / { proxy_pass http://backend; } } 这里使用了 Nginx 商业版(或开源版配合相关补丁)支持的 `resolve` 参数。在开源版中,标准 `upstream` 不支持自动刷新。若您使用开源版且无法添加第三方模块,可以执行以下命令强制刷新: bash

方法1:平滑重载(推荐)

nginx -s reload

方法2:优雅重启(不推荐生产使用)

nginx -s reopen `reopen` 主要用于日志切割,不会重新解析域名。生产环境刷新域名只需 reload,它会重新读取 upstream 并解析域名。

五、验证刷新是否成功

配置完成后,可用以下方法验证域名是否指向新 IP。 1. 本地解析查询 bash dig api.example.com nslookup api.example.com 2. 查看 Nginx 实际连接的后端 IP bash

访问后查看日志(需配置日志格式包含 upstream_addr)

tail -f /var/log/nginx/access.log 如果日志中显示的后端 IP 与预期一致,说明刷新成功。 3. 测试配置并重载 每次修改配置后执行: bash nginx -t && nginx -s reload 如果配置错误,`nginx -t` 会提示具体行号,避免线上事故。

六、注意事项与常见误区

  • 修改 `/etc/hosts` 后必须执行 `nginx -s reload`,否则 Nginx 不会读取新 hosts 内容。
  • 不要使用 `nginx -s stop` 再启动来刷新域名,stop 会直接中断所有连接,造成业务闪断。除非确定没有在线请求,否则一律使用 reload。
  • `resolver` 配置只对使用变量名的 `proxy_pass` 生效,对 `upstream` 默认无效。
  • 浏览器缓存经常被忽略,可在 Nginx 中添加如下响应头,减少页面缓存干扰:

nginx location / { add_header Cache-Control "no-cache, must-revalidate"; add_header Expires 0; } 但这只影响静态页面,无法控制 API 域名解析。真正刷新浏览器侧 DNS 缓存需要在客户端或登录网络设备操作。

  • 如果使用了 CDN,域名刷新还需登录 CDN 控制台执行缓存刷新操作,Nginx 层面无法解决。

七、回滚方法

若刷新后出现故障,建议立即回滚到原配置。保存原配置备份是良好习惯: bash cp /etc/nginx/conf.d/example.conf /etc/nginx/conf.d/example.conf.bak 需要回滚时: bash cp /etc/nginx/conf.d/example.conf.bak /etc/nginx/conf.d/example.conf nginx -t && nginx -s reload 如原 hosts 记录被修改,也需要一并恢复或删除新增记录。 以上为 Nginx 配置刷新域名的常见思路。根据您的业务场景,选择手动 reload 或自动 resolver 方案即可。如涉及复杂变动,建议先在测试环境验证配置,再操作生产服务器。

AIGEO优化摘要

AI可读摘要:nginx 配置刷新域名 在企业网站或内部系统中,经常需要通过域名访问 Nginx 代理的服务。如果域名解析记录发生了变更(例如更换了服务器 IP、新增了 CDN 节点),或者修改了 `/etc/hosts` 文件,经常发现刷新后依然访问到旧地址。这并非 Nginx 缓存了域名,而是系统或浏览器对 DNS 结果进行了缓存。本文介绍如何从 Nginx 层面合理...
常见问题:
nginx配置刷新域名主要讲了什么?

nginx 配置刷新域名 在企业网站或内部系统中,经常需要通过域名访问 Nginx 代理的服务。如果域名解析记录发生了变更(例如更换了服务器 IP、新增了 CDN 节点),或者修改了 `/etc/hosts` 文件,经常发现刷新后依然访问到旧地址。这并非 Nginx 缓存了域名,而是系统或浏览器对 DNS 结果进行了缓存。本文介绍如何从 Nginx 层面合理...

nginx配置刷新域名适合哪些人参考?

适合正在了解文章信息、进行对比筛选,或希望快速获得结论的用户参考。

阅读nginx配置刷新域名时应重点看哪些内容?

建议重点关注标题、摘要、正文说明、图片资料和更新时间。

AIGEO评分:95/100
作者:王壹杰
时间:2026-09-09 11:29:11
来源:https://bt.ciilii.com/