在 nginx 中配置域名作为后端节点,需要在 upstream 块中直接写入域名地址,nginx 会在启动时或重新加载配置时自动解析这些域名并缓存 ip 地址。轮询(默认方式)会按顺序将请求分配给每个域名对应的服务器,如果某个域名解析失败或节点不可用,nginx 会自动跳过该节点并将请求转发给下一个可用节点。

如何配置 upstream 中的域名节点
直接在 upstream 块中使用 server 指令指定域名即可,无需额外配置 DNS 解析模块。Nginx 使用系统默认的 DNS 解析器进行查询,支持 IPv4 和 IPv6 地址的混合配置。当多个域名指向不同的后端服务时,这种配置方式最为简洁。

worker_processes 1;
events {
worker_connections 1024;
}
http {
upstream backend_pool {
server api.example.com:80;
server web.example.com:80;
server static.example.com:80;
}
server {
listen 80;
server_name www.myapp.com;
location / {
proxy_pass http://backend_pool;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
上述配置中,api.example.com、web.example.com 和 static.example.com 会被依次轮询处理来自 www.myapp.com 的请求。每次请求到达时,Nginx 会选择列表中的下一个节点。如果第一个域名解析出的 IP 无法连接,Nginx 会尝试第二个域名,依此类推。这种机制确保了即使某个后端服务暂时不可用,整体服务依然保持可用。
域名解析缓存与更新机制
Nginx 默认不会实时刷新上游域名的 DNS 缓存,这意味着如果后端的域名 IP 地址发生变化,需要手动重载 Nginx 配置才能使新的 IP 生效。可以通过设置 resolver 指令来指定 DNS 服务器,并结合 proxy_next_upstream 实现更灵活的故障转移。此外,可以使用 keepalive 连接池优化与后端域名的 TCP 连接复用,减少频繁建立连接的开销。

worker_processes 1;
events {
worker_connections 1024;
}
http {
resolver 8.8.8.8 valid=30s;
upstream dynamic_backend {
server api.example.com:80;
server web.example.com:80;
}
server {
listen 80;
server_name www.myapp.com;
location / {
proxy_pass http://dynamic_backend;
proxy_set_header Host $host;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
}
}
在这个配置中,resolver 8.8.8.8 valid=30s; 指定了 DNS 服务器为 Google Public DNS,并且缓存有效期为 30 秒。虽然这不能强制 Nginx 主动刷新所有上游节点的 DNS 记录,但它确保了在故障转移场景下,Nginx 能够获取最新的 IP 地址。当某个域名解析失败时,proxy_next_upstream 会触发重试机制,尝试下一个可用的后端节点。这种方式适用于后端 IP 地址经常变动的场景,如云环境中的动态实例。
基于特定域名返回结果的验证问题
当配置多个域名作为后端节点时,若希望根据请求中的 Host 头或 URL 路径将流量定向到特定域名,可以在 location 块中使用条件判断或重写规则。例如,通过 $host 变量匹配不同域名,或者使用 map 指令根据请求特征选择上游组。这种细粒度控制可以确保静态资源、API 接口和 Web 页面分别由不同的后端域名处理,提高系统的可维护性和性能。











