微信优化

weixinyouhua

nginx二级域名配置怎么做?nginx二级域名配置方法

2026-09-15 03:06:05

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

nginx二级域名配置怎么做?nginx二级域名配置方法

主配置文件末尾大多会有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;
    }
}

nginx二级域名配置怎么做?nginx二级域名配置方法

这种写法利用正则捕获组把子域名名称提取出来,配合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配置中

nginx二级域名配置怎么做?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重载全流程走通后,后续新增子域名只需要复制配置模板改几个参数,没有一套配置能适配所有场景,但理清原理后反复调试几次,你的服务器就能按预期响应每个二级域名的请求了。

相关文章

2024年,SaaS软件行业碰到获客难、增长慢等问题吗?

我们努力让每一次邂逅总能超越期待