芋道多租户项目中为不同租户分配独立子域名的正确做法(DNS + Nginx 实战教程)

在使用 芋道(Yudao)多租户 SaaS 项目 时,很多人希望实现一个功能:
👉 每个租户拥有自己的独立子域名,比如:

  • 租户 A 访问:a.app.example.***
  • 租户 B 访问:b.app.example.***

这样不同租户在登录和访问时互不干扰,体验更专业、更像真正的 SaaS 平台。

本文将详细介绍 如何正确配置 DNS 和 Nginx 来实现这个功能,
让小白也能一看就懂、一改就用。


🧩 一、功能背景

在芋道的多租户模式下,每个租户都可以绑定一个独立域名。
例如在数据库表 system_tenant 中,存在 website 字段,用于保存租户的专属访问地址:

租户名称 website 域名
租户 A a.app.example.***
租户 B b.app.example.***

前端用户访问对应的子域名时,后端即可根据域名自动识别对应租户。

要实现这一机制,核心在于 DNS 泛解析Nginx 泛域名配置


🧭 二、错误示例:不加限定的 “*” 泛解析

很多同学在第一次配置时,直接在 DNS 添加了:

主机记录 类型 记录值
* A 服务器IP

表面上没问题,但实际上这样会导致:

  • 所有子域名(a.example.***b.example.***api.example.***)都解析到同一台服务器;
  • 甚至可能覆盖其他项目;
  • 导致访问错站、日志混乱、安全风险高。

✅ 三、正确的 DNS 解析方式

假设你的主项目域名是:

app.example.***

你希望支持租户访问:

  • 租户A:a.app.example.***
  • 租户B:b.app.example.***

那你只需要在域名服务商(阿里云、腾讯云等)中添加以下两条解析记录👇:

主机记录 类型 记录值 说明
app A 服务器公网IP 主入口域名
*.app A 服务器公网IP 租户子域名泛解析

✅ 这样做的好处:

  • 只影响以 app.example.*** 为结尾的域名;
  • 不会干扰其他项目的解析(例如 api.example.***www.example.***);
  • 安全又精准。

⚙️ 四、Nginx 配置(前端 Vue3 管理后台)

假设前端打包后的文件路径为:

/www/wwwroot/app.example.***/dist

以下是一份完整可用的 Nginx 配置模板👇

server {
    listen 80;
    listen 443 ssl http2;
    server_name  *.app.example.*** app.example.***;
    root /www/wwwroot/app.example.***/dist;
    index index.html index.htm;

    # SSL证书配置(根据实际路径调整)
    ssl_certificate     /www/server/panel/vhost/cert/app.example.***/fullchain.pem;
    ssl_certificate_key /www/server/panel/vhost/cert/app.example.***/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:!MD5;
    ssl_prefer_server_ciphers on;
    error_page 497 https://$host$request_uri;

    # 禁止访问敏感文件
    location ~ ^/(\.git|\.env|LICENSE|README.md) {
        return 404;
    }

    # 前端 Vue3 项目入口
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 静态资源缓存策略
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        expires 30d;
        a***ess_log off;
        error_log off;
    }

    location ~ .*\.(js|css)?$ {
        expires 12h;
        a***ess_log off;
        error_log off;
    }

    a***ess_log /www/wwwlogs/app.example.***.log;
    error_log  /www/wwwlogs/app.example.***.error.log;
}

🚀 五、配置步骤总结

  1. DNS 配置

    • 添加两条解析:

      • app → 指向服务器IP
      • *.app → 指向服务器IP
  2. Nginx 配置

    • 修改 server_name 为:

      server_name *.app.example.*** app.example.***;
      
    • 重载 Nginx:

      nginx -t
      nginx -s reload
      
  3. 测试访问

    • 访问 https://a.app.example.***
    • 访问 https://b.app.example.***
    • 不影响 https://api.example.***

🌐 六、可选优化:主域名自动跳转

如果你希望用户访问 https://app.example.*** 时自动跳转到默认租户页面(比如 https://default.app.example.***),可以加上一条跳转规则:

if ($host = app.example.***) {
    return 301 https://default.app.example.***;
}

这样用户体验会更顺畅,统一入口也更自然。


🧠 七、常见问题 Q&A

❓ Q1:为什么要加两个解析记录?

因为一个用于主域名(登录入口),另一个用于所有租户的子域名,否则访问主域名时可能报错或无法解析。

❓ Q2:如果我还有别的项目在同一域名下怎么办?

没问题,只要限定为 *.app.example.***,不会影响到其他二级域名,如:

  • api.example.***
  • www.example.***
  • admin.example.***
    都不会被指向你的租户系统。

❓ Q3:SSL 证书要怎么处理?

可以申请一个支持泛域名的证书(如 *.app.example.***),这样所有租户的 HTTPS 域名都能正常访问。


✅ 八、总结

步骤 内容 说明
DNS 添加 app*.app 两条解析 控制域名解析范围
Nginx 使用 server_name *.app.example.*** app.example.*** 支持租户子域名
前端 部署在 /dist,统一访问入口 所有租户共用前端
后端 芋道框架自动识别域名对应租户 无需手动调整

🎯 最终效果

访问地址 对应租户 状态
https://a.app.example.*** 租户A
https://b.app.example.*** 租户B
https://app.example.*** 默认入口
https://api.example.*** 其他项目 ❌ 不受影响

💬 一句话总结:

SaaS 多租户的独立域名访问,本质上就是在 DNS 层精准做泛解析,在 Nginx 层正确配置泛域名。
限定层级、避免全局 *,你就能轻松让芋道项目实现真正的租户独立访问体验!

转载请说明出处内容投诉
CSS教程网 » 芋道多租户项目中为不同租户分配独立子域名的正确做法(DNS + Nginx 实战教程)

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买