在使用 芋道(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;
}
🚀 五、配置步骤总结
-
DNS 配置
-
添加两条解析:
-
app→ 指向服务器IP -
*.app→ 指向服务器IP
-
-
-
Nginx 配置
-
修改
server_name为:server_name *.app.example.*** app.example.***; -
重载 Nginx:
nginx -t nginx -s reload
-
-
测试访问
- 访问
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 层正确配置泛域名。
限定层级、避免全局*,你就能轻松让芋道项目实现真正的租户独立访问体验!