nginx配置二级域名的核心答案:只需三步解析域名到服务器、在nginx中新建server块并设置server_name为二级域名、重启nginx加载配置,若你的站点基于宝塔面板,可在网站菜单中直接添加域名完成配置。
配置前必须搞懂的域名解析逻辑
很多人在nginx配置上花时间折腾,最后发现是域名解析没生效。二级域名配置的第一道门槛不是nginx,而是DNS解析,举个例子,你买下example.com后,需要在域名服务商的后台添加一条A记录,主机记录填”blog”或”www”,记录值指向服务器公网IP,这样blog.example.com才能被公网路由到你的服务器。
配置解析时有几个细节直接影响nginx能否正常工作:
- 解析类型选A记录,不是CNAME,除非你明确知道自己在做什么
- TTL值设置成600秒或更低,方便测试时快速生效
- 用
dig blog.example.com命令验证解析结果,出现你服务器的IP就说明解析成功
解析生效后进入nginx配置阶段,行业普遍共识是,nginx配置二级域名的标准做法就是为每个子域名建立独立的server块。
基础准备:nginx的server_name匹配规则
在改nginx配置前,你需要理解server_name的匹配原理,nginx收到请求后,会根据请求头中的Host字段和配置文件里的server_name做匹配,匹配优先级从高到低分别是:精确匹配 > 通配符起始匹配 > 通配符结尾匹配 > 正则表达式匹配,具体规则总结如下:
- 完全相等的字符串(如
server_name blog.example.com)优先级最高 - 以开头的通配符(如
.example.com)匹配左侧任意内容 - 以结尾的通配符匹配右侧任意内容
- 开头的是正则匹配,功能更强但性能略低于前三种
实际配置中,使用完整域名做精确匹配最直观,也最好维护,通配符适合大批量子域名统一指向同一站点时使用,但如果不同子域名需要不同站点内容,逐一写独立server块更清晰。
检查nginx安装位置和配置文件路径
动手之前先确认nginx装在哪、主配置文件在哪,不同安装方式路径差别很大:
- 通过apt或yum安装,主配置通常位于
/etc/nginx/nginx.conf - 源码编译安装,可能在
/usr/local/nginx/conf/nginx.conf - 宝塔面板环境,配置文件在
/www/server/nginx/conf/nginx.conf

主配置文件末尾大多会有include指令引用conf.d目录或sites-enabled目录下的文件。推荐做法是在conf.d目录下新建一个以域名命名的配置文件,比如blog.example.com.conf,这样站点多了也不会乱。
二级域名绑定到独立站点目录(推荐)
这是使用最广泛的nginx二级域名配置方式,假设你想让blog.example.com指向服务器上的/var/www/blog目录,同时不影响example.com主站的正常访问,配置步骤如下。
第一步:创建站点目录并放置测试文件
mkdir -p /var/www/blog echo '<h1>Blog Subdomain Works!</h1>' > /var/www/blog/index.html
第二步:在conf.d下新建配置文件
在/etc/nginx/conf.d/目录下创建blog.example.com.conf:
server {
listen 80;
server_name blog.example.com;
root /var/www/blog;
index index.html index.htm;
access_log /var/log/nginx/blog.access.log;
error_log /var/log/nginx/blog.error.log;
location / {
try_files $uri $uri/ =404;
}
}
注意这段配置的要点:listen 80监听的是IPv4地址,如果你的服务器同时支持IPv6,可在下面加一行listen [::]:80,server_name写完整域名,root指向独立目录,两个日志文件单独分开,这样排查问题时一目了然。
第三步:测试并重载nginx
nginx -t systemctl reload nginx
nginx -t会检查配置语法,输出syntax is ok后再执行reload,浏览器访问blog.example.com能看到测试页,配置就成功了。
二级目录方式区分不同子域名
有些场景下你不想为每个子域名新建目录,比如一个单页应用按用户类型区分入口,此时可以利用nginx的location块进行路径分流:
server {
listen 80;
server_name example.com;
location /blog/ {
alias /var/www/blog/;
index index.html;
}
location /shop/ {
alias /var/www/shop/;
index index.html;
}
}
但严格意义上这种方式并未实现真正的二级域名用户需要通过example.com/blog访问,而非blog.example.com,如果你既要二级域名,又想共用一个server块,可以用正则匹配server_name的方式实现:
server {
listen 80;
server_name ~^(?<subdomain>.+)\.example\.com$;
location / {
root /var/www/$subdomain;
index index.html;
}
}

这种写法利用正则捕获组把子域名名称提取出来,配合root /var/www/$subdomain动态映射到对应目录,它适合子域名前缀与目录名一一对应的场景,比如blog.example.com对应/var/www/blog,shop.example.com对应/var/www/shop,缺点是不够直观,配错了不容易排查,新手建议少用。
两种方案的适用场景比较
| 对比维度 | 独立server块方式 | 正则捕获方式 |
|---|---|---|
| 配置复杂度 | 低,每个域名一段配置 | 中等,需要熟悉正则 |
| 维护成本 | 新增站点时新建文件 | 只需在目录下加文件夹 |
| 排错效率 | 日志独立,出错容易定位 | 共用日志,需要额外过滤 |
| 扩展性 | 适合站点功能差异大的场景 | 适合子域名间无差别的场景 |
业内专家指出,对于大多数中小网站和CMS系统,独立server块是更稳妥的选择它的配置逻辑和Apache的VirtualHost一脉相承,换人接手维护也看得懂。
配置nginx二级域名时常见的坑
坑一:泛解析导致所有子域名指向同一站点
在DNS后台配置.example.com泛解析后,任何不存在的子域名都会请求到服务器,如果nginx里只有一条server_name example.com,所有未匹配到的请求默认落入该server块,造成子域名访问到主站内容,应对方法是在nginx配置中加一个默认拒绝的server块:
server {
listen 80 default_server;
server_name _;
return 444;
}
这样未匹配的请求会被直接断开连接。
坑二:HTTPS证书覆盖不全
只给主域名配置了SSL证书,访问https://blog.example.com时出现证书警告,解决方法是使用通配符证书或SAN证书,将.example.com一并覆盖,Let’s Encrypt现在免费提供通配符证书,但申请时需要DNS验证权限。
坑三:nginx和PHP-FPM的socket通信问题
如果你配置的二级域名站点运行PHP程序,需要同步修改PHP-FPM的listen指令,使用listen = 127.0.0.1:9000方式时,不同站点共用同一端口问题不大;但如果使用Unix Socket方式,每个站点池子都有独立的socket文件,nginx配置中

fastcgi_pass的路径必须和PHP-FPM池定义一致,否则返回502错误。
排查命令速查表
遇到问题按顺序执行以下命令,能定位绝大多数故障:
nginx -T查看完整生效配置,确认server_name是否被正确加载curl -H "Host: blog.example.com" http://服务器IP绕过DNS直接测试nginx响应tail -f /var/log/nginx/error.log观察错误日志中的关键报错ss -lntp | grep nginx确认nginx监听端口状态dig +short blog.example.com再次核对解析记录
Q&A:nginx二级域名配置常见疑问
nginx可以用一个server块配置多个二级域名吗?
可以,在一个server块内通过空格分隔多个server_name,例如server_name blog.example.com shop.example.com;,此时两个域名共用同一个站点目录、同一份配置逻辑,适用于子域名功能完全一致的场景,但日志默认混在一起,建议用$host变量区分记录日志,方便后续统计各域名的访问量。
nginx配置二级域名和宝塔面板的方式有什么不同?
宝塔面板只是把nginx配置过程图形化了,本质上仍然是生成包含server_name指令的server块,只是在面板的”网站-添加站点”中填写域名即可自动完成创建目录、生成配置、绑定SSL等操作,手动配置的灵活度更高,适合对nginx有深入定制需求的用户。
如何实现一个服务器配置多个域名对应不同端口?
核心思路是在location中设置proxy_pass反向代理,让不同域名转发到本机不同端口,例如server_name api.example.com的请求通过proxy_pass http://127.0.0.1:8080处理后端服务,而blog.example.com则proxy_pass http://127.0.0.1:3000,配置时注意代理层需要设置proxy_set_header Host $host,否则后端程序无法识别原始域名。
配置二级域名本质上是在理解nginx域名匹配机制的基础上,合理组织server块和location块,多数情况下,独立server块加完整域名匹配的方式最稳妥,既能灵活配置根目录和日志,也方便后续为每个子域名单独添加SSL证书,从域名解析到nginx重载全流程走通后,后续新增子域名只需要复制配置模板改几个参数,没有一套配置能适配所有场景,但理清原理后反复调试几次,你的服务器就能按预期响应每个二级域名的请求了。
