在 nginx 中,`server_name` 本身不具备自动故障切换能力,它仅用于匹配请求的 host 头。要实现主备域名自动切换,必须结合 `proxy_next_upstream` 指令与后端健康检查机制(如 lua 模块或外部监控),当主域名解析失败或后端无响应时,nginx 会将请求转发至备用域名对应的服务。

Nginx 如何配置多域名并定义故障转移逻辑
通过在同一 `server` 块中列出多个 `server_name`,并利用 `proxy_pass` 指向不同的上游地址,配合 `proxy_next_upstream` 实现错误重试。当第一个域名对应的后端返回 500、502 或连接超时等错误时,Nginx 会自动尝试下一个可用的上游节点或备用路径。

server {
listen 80;
server_name primary.example.com backup.example.com;
location / {
# 定义主备上游组
upstream backend {
server primary_backend_ip:8080;
server backup_backend_ip:8080;
}
# 关键配置:当发生错误时,尝试下一个上游
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
# 设置重试次数限制,避免无限循环
proxy_next_upstream_tries 2;
proxy_pass http://backend;
}
}上述配置中,`primary.example.com` 和 `backup.example.com` 均指向同一个 `upstream` 组。如果主后端宕机,Nginx 会在收到错误后自动将流量切换到 `backup_backend_ip`。注意,这种切换是基于 IP 而非域名的,若需严格基于域名隔离,需使用 Lua 脚本进行动态路由。
基于 DNS 轮询与 Nginx 缓存的故障切换策略
另一种常见做法是利用 DNS 层面的主备记录,并在 Nginx 中控制 DNS 缓存时间。当主域名 DNS 解析失败或 TTL 过期后,客户端会获取到备用服务器的 IP。Nginx 通过 `resolver` 指令启用 DNS 解析,并设置较短的 `valid` 时间,确保能快速感知 DNS 变更。

server {
listen 80;
server_name myapp.com;
# 指定 DNS 服务器
resolver 8.8.8.8 valid=30s;
location / {
# 使用变量动态解析域名
set $backend_host primary.myapp.com;
# 若主域名不可达,可通过 Lua 或外部脚本修改此变量
# 此处简化为直接指向可变主机名
proxy_pass http://$backend_host;
}
}在此方案中,`myapp.com` 的 DNS 记录应包含主备 A 记录。Nginx 每 30 秒重新解析一次域名。若主服务器 IP 失效,DNS 查询可能返回备用 IP,或者 Nginx 在连接失败后触发 `proxy_next_upstream` 尝试其他已解析的 IP。这种方式依赖于 DNS 的传播速度和 Nginx 的重试机制,适合对实时性要求不极高的场景。
当主域名返回 502 错误时 Nginx 的具体行为是什么
当主域名对应的后端返回 502 Bad Gateway 时,若配置了 `proxy_next_upstream http_502`,Nginx 会将该请求视为可重试状态,并立即尝试连接 `upstream` 组中的下一个服务器。如果备用服务器正常,用户将看到正常的页面内容,而不会感知到前端的错误。这一过程对客户端透明,前提是 `proxy_next_upstream_tries` 允许足够的重试次数。


















