通过配置Nginx的server_name指令,配合泛解析或分别指定二级域名,即可让一台服务器同时响应多个子域名。无论是想绑定blog.example.com、api.example.com还是任意子域名,核心逻辑都围绕server块(虚拟主机)展开。
如何用nginx配置子域名绑定多个二级域名
在动手配置前,先理解Nginx处理流量的基本模型:每个server块定义一组监听规则,当请求到达时,Nginx会根据请求头中的Host字段,匹配对应的server_name,匹配顺序是:精确匹配 > 通配符前缀匹配 > 通配符后缀匹配 > 正则匹配 > 默认server块,这个优先级直接决定了多域名配置的成败。
准备工作:域名解析与服务器环境
- 在域名服务商控制台(如简米云、酷番云、Cloudflare),添加A记录指向服务器公网IP,若想让所有子域名都生效,可以使用泛解析(),记录值为服务器IP。
- 确保服务器上Nginx已安装并运行,检查命令:
nginx -v。 - 确认防火墙已放行80(HTTP)和443(HTTPS)端口,否则外部请求无法到达Nginx。
逐个声明二级域名
适合子域名数量有限、且每个站点内容独立的场景,在Nginx配置目录(通常为/etc/nginx/conf.d/)下,为每个子域名新建一个配置文件,或在一个文件中写多个server块。
创建/etc/nginx/conf.d/blog.conf:
server {
listen 80;
server_name blog.example.com;
root /var/www/blog;
index index.html;
}
创建/etc/nginx/conf.d/api.conf:
server {
listen 80;
server_name api.example.com;
root /var/www/api;
index index.php;
# 此处可配置PHP或Node.js代理等后续逻辑
}
检查配置并重载:nginx -t && nginx -s reload,这种方式直观易懂,每个站点独立管理,互不影响。
泛解析绑定任意二级域名
当业务希望任意子域名都能访问,且由同一套程序处理时(比如SaaS平台、多租户系统),可用通配符,行业共识认为,泛解析搭配Nginx的正则捕获,是将动态子域名映射到目录或参数的最佳路径。
server {
listen 80;
server_name .example.com;
# 提取子域名部分,传给后端程序处理
set $subdomain "";
if ($host ~ ^(.)\.example\.com$) {
set $subdomain $1;
}
root /var/www/$subdomain;
index index.html;
}
配置完成后,无需再为每个新用户添加server块,新建目录即可上线新站点,需知,若同时存在精确与泛解析,精确匹配的server块永远优先生效,这是解决各方案冲突的关键。
nginx二级域名配置后无法访问?运维排错实战
很多人配置完nginx二级域名解析后,发现访问报错或跳到了主站,多数情况下并非Nginx配置有误,而是域名解析或缓存问题,按以下顺序排查,能快速定位故障点。
- 检查本机解析:在服务器上执行
dig blog.example.com,确认返回的IP与服务器IP一致,若解析地址不对,去域名服务商处修改TTL并等待生效。 - 测试Nginx响应:在服务器本地执行
curl -H "Host: blog.example.com" http://127.0.0.1,看返回的HTML文件是否正确,若错误,则问题在Nginx配置;若正确,问题出在网络或防火墙。 - 确认默认server块:访问IP时,Nginx会落到
default_server,若此server块配置了主站目录,未匹配域名的请求就会显示主站内容,容易让人误以为配置失效。
server {
listen 80 default_server;
server_name _;
return 444; # 关闭未认领域名的连接
}
这段配置会让未绑定的域名直接断开,避免错误内容的暴露,也是多数生产环境的推荐做法。
多站点场景下,nginx配置二级域名的安全与性能考量
多个二级域名共享同一IP时,安全隔离与资源分配就不能马虎了,常见做法是统一使用SSL证书管理工具(如acme.sh)为每个域申请证书,但要注意Let's Encrypt的速率限制,更高效的方式是使用泛域名证书(.example.com),一张证书覆盖所有子域,配置时指定同一证书路径即可。
listen 443 ssl;
server_name blog.example.com api.example.com;
ssl_certificate /etc/nginx/ssl/example_com_fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example_com_key.pem;
对于PHP站点,建议为每个server块配置独立的open_basedir限制;对于Java或Node应用,则将不同子域的反向代理指向不同的本地端口,充分利用Nginx的upstream模块做负载均衡。
| 配置维度 | 传统方式 | 更优实践 |
|---|---|---|
| 目录部署 | 各站点文件放在同一根目录 | 按域名分目录、分用户,权限独立 |
| 证书管理 | 每个域名单独申请 | 泛域名证书统一管理,减少过期风险 |
| 日志处理 | 所有站点写入同一日志文件 | access_log按server块拆分,便于分析 |
| 资源配置 | 默认共享worker进程 | 使用limit_req模块限制单个子域流量 |
如何处理不同端口与协议的子域名需求
部分场景下,子域名需要开放非常规端口(比如doc.example.com:8080),Nginx本身并不推荐在server_name中指定端口,正确的做法是监听对应端口,再绑定域名,比如一个内部工具站点,只想让公司网段访问:
server {
listen 8080;
server_name admin.example.com;
allow 192.168.1.0/24;
deny all;
proxy_pass http://127.0.0.1:3000;
}
更常见的需求是HTTP自动跳转HTTPS,通过一个复用server块,将所有HTTP流量统一转向443端口,既简化配置又避免重复代码:
server {
listen 80;
server_name .example.com;
return 301 https://$host$request_uri;
}
nginx配置多个二级域名常见误区与规避
在root路径中写死域名。 正确做法是使用变量($host或提取的子域)拼接路径,否则换域名就得改配置。忽略配置文件加载顺序。 Nginx按文件名ASCII顺序读取conf.d下的文件,若两个文件里有相同监听端口和server_name,先加载的生效,后加载的报错。只重载不测试。 每次修改后务必执行nginx -t,错误配置会让服务直接崩溃,而不是自动跳过。
用Nginx泛解析配置多级域名(如二级、三级共存)
泛解析配置确实支持.example.com,但若要同时支持blog.example.com和user.blog.example.com,需要两个server块或一个更高级的正则,在此场景下,推荐在nginx配置中同时保留两种解析方式:
server {
listen 80;
server_name .example.com; # 匹配任意单级子域
root /var/www/$host;
}
server {
listen 80;
server_name ~^(?<sub>[^.]+)\.(?<parent>.+)$;
root /var/www/$parent/$sub;
}
第一个块处理标准二级域名,第二个块通过正则捕获多级子域名的层级关系,将不同层级的子域指向不同的文件位置,适合文档站、社区站等有明显树状结构的业务。
qa:nginx配置子域名绑定多个二级域名实操疑问
问题:服务器上已有主站,绑定二级域名后访问主站域名会冲突吗?
不会,只要主站的server_name写的是example.com和www.example.com,二级域名的server_name是blog.example.com,两者井水不犯河水,Nginx根据Host自动路由,即使共用同一个IP和80端口也互不干扰,注意不要用default_server同时指向两个站点,否则IP直连时会随机落到其中一个。
问题:泛解析后,未备案的域名访问时会不会被拦截?
国内服务器要求所有指向该IP的域名都必须备案,泛解析会把任意域名(包括未备案的)都接入服务器,一旦被扫描到,机房会先行封禁80端口,稳妥做法是关闭default_server或只匹配信任的后缀,将泛解析改为逐一添加,并在Nginx上层设置访问白名单。