Nginx配置域名解析是Web运维中的核心技能,主要涉及两个层面:一是配置DNS服务器让Nginx能够解析域名,二是配置server_name让Nginx识别并响应特定域名的请求。以下是基于全网专业资料整理的完整配置方案。

一、域名解析的两种模式
Nginx中的域名解析分为启动时静态解析和运行时动态解析两种模式。静态解析在Nginx启动时通过系统DNS解析域名并缓存IP,域名指向发生变化时不会自动更新,需要重启或reload才能生效。动态解析通过resolver指令配合变量实现,Nginx会在运行过程中按照TTL自动重新解析,适合后端域名IP频繁变动的场景,也是配合云服务、CDN、Kubernetes集群的推荐做法。
二、resolver指令配置DNS服务器
resolver指令用于指定Nginx使用的DNS服务器地址,可配置多个,以空格分隔。必须配置在http块或stream块中。语法示例:
resolver 8.8.8.8 8.8.4.4 valid=300s ipv6=off;
其中valid参数设置强制重新解析的间隔(默认遵循DNS返回的TTL),ipv6=off可避免IPv6解析失败导致的异常延迟。常用的公共DNS包括:114.114.114.114(国内通用)、223.5.5.5(阿里)、1.1.1.1(Cloudflare)、8.8.8.8(Google)。企业内网通常填写内部DNS服务器地址。
还可通过resolver_timeout设置DNS查询超时时间,默认30秒,建议根据网络环境适当调小,例如 resolver_timeout 5s;。
三、运行时动态解析(核心配置)
实现动态解析的关键是在proxy_pass中使用变量。当proxy_pass的URL中包含变量时,Nginx不会在启动阶段解析域名,而是在每次请求时通过resolver进行解析。典型配置如下:
http {
resolver 223.5.5.5 valid=300s;
resolver_timeout 5s;
server {
listen 80;
server_name www.example.com;
location / {
set $backend "api.example.com";
proxy_pass http://$backend:8080;
}
}
}
需要注意:使用变量后,upstream指令将不再生效,负载均衡、健康检查等功能需通过其他方式实现。同时,$backend变量需先通过set定义,直接写成 proxy_pass http://$backend; 也可以,但前提是变量中已包含完整地址。
四、server_name域名识别配置
server_name用于让Nginx根据请求头中的Host字段匹配对应的server块,这是"域名解析到Nginx后"识别处理规则的关键。配置示例:
server {
listen 80;
server_name www.example.com example.com;
root /var/www/example;
index index.html index.htm;
}
server_name支持精确匹配(www.example.com)、通配符匹配(*.example.com、www.example.*)和正则匹配(~^www\d+\.example\.com$)。匹配优先级为:精确匹配 > 最长通配符前缀 > 最长通配符后缀 > 正则匹配 > 默认server。若所有server_name均不匹配,请求会交给监听同一端口的默认server(可标记 default_server)处理。
五、HTTPS域名的完整配置
生产环境通常需要配置SSL证书,示例:
server {
listen 443 ssl http2;
server_name www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
}
配置完成后应使用 nginx -t 检查语法,使用 nginx -s reload 平滑重载,避免直接restart造成连接中断。
六、DNS侧的解析记录配置
Nginx配置只是服务端接收环节,域名真正能访问到服务器,还需在域名注册商或DNS服务商处添加解析记录。常用记录类型包括:A记录(域名指向IPv4地址)、AAAA记录(指向IPv6地址)、CNAME记录(域名指向另一个域名,常用于CDN或云服务)、MX记录(邮件服务器)。添加A记录时,主机记录填写www或@(@表示根域名),记录值填写服务器公网IP,TTL一般保持默认600秒即可。
七、验证与排错方法
配置完成后,可通过以下命令验证:nslookup www.example.com 或 dig www.example.com 检查DNS解析结果是否正确;curl -I -H "Host: www.example.com" http://127.0.0.1 在本地测试Nginx的server_name匹配;nginx -T 查看Nginx最终生效的完整配置。
常见问题及解决方案:第一,启动报错"no resolver defined to resolve...",原因是使用了变量的proxy_pass但未配置resolver,需在http块添加resolver指令;第二,日志报"host not found in upstream",多为DNS服务器不可达或域名不存在,应检查resolver地址和网络连通性;第三,解析延迟过高,可关闭IPv6解析(ipv6=off)并调小resolver_timeout;第四,修改域名指向后不生效,若使用静态解析需reload,建议改为变量动态解析。
八、生产环境最佳实践
建议使用动态解析+合理valid值平衡实时性与DNS压力,valid一般设为30-300秒;DNS服务器至少配置两个以实现冗余;对关键业务将域名解析与upstream健康检查结合(动态解析场景需借助nginx_upstream_check_module或OpenResty);使用DNS缓存优化性能,可通过部署本地DNS缓存服务(如dnsmasq)减少公网查询;做好监控告警,对解析失败率、解析耗时等指标进行采集,确保域名解析链路稳定可靠。

查看详情

查看详情