Laravel应用多数据库部署:单域名还是多域名方案咨询
Laravel多租户多数据库:单域名vs多域名方案选型
单域名方案(appname.com + 动态数据库切换)
核心逻辑
用户通过统一入口登录,系统根据用户所属企业标识(如登录账号关联的企业ID、邮箱前缀),动态切换到对应企业的独立数据库。需维护一个共享主数据库,存储所有企业的基础信息(企业ID、数据库配置、用户账号映射等),登录时先验证主库身份,再切换业务库。
优势
- 品牌统一:用户只需记住一个域名,降低记忆成本,利于品牌传播
- 运维高效:一套Laravel代码、一套部署配置(Laravel Forge只需维护一个站点),功能迭代一次更新覆盖所有企业
- 资源利用率高:避免多站点重复占用服务器进程、缓存资源
劣势
- 需要额外开发隔离逻辑:
- 实现动态数据库切换(可通过中间件、ServiceProvider实现)
- 确保会话、缓存、队列的租户隔离,避免跨企业数据串流
- 调试复杂度略高:出现数据库相关问题时,需先确认当前租户的数据库上下文
Laravel实现示例(中间件切换数据库)
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\DB; class SwitchEnterpriseDatabase { public function handle($request, Closure $next) { if (Auth::check()) { $enterprise = Auth::user()->enterprise; // 配置企业数据库连接 Config::set('database.connections.enterprise', [ 'driver' => 'mysql', 'host' => env('DB_HOST'), 'database' => $enterprise->db_name, 'username' => env('DB_ENTERPRISE_USER'), 'password' => $enterprise->db_password, 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', ]); // 清除旧连接,切换默认连接 DB::purge('enterprise'); DB::setDefaultConnection('enterprise'); } return $next($request); } }
多域名方案(独立域名对应独立数据库)
核心逻辑
每个企业绑定独立域名,Laravel Forge为每个域名创建独立站点,站点配置中指定对应企业的数据库信息,请求通过Nginx路由到对应站点,天然实现数据隔离。
优势
- 隔离性强:无需额外开发隔离逻辑,每个站点的数据库配置独立,出错概率低
- 个性化灵活:可针对单个企业做独立配置(如SSL证书、缓存策略、代码分支),适合有定制需求的企业
- 场景适配:适合需要对外展示的企业(如客户访问企业专属门户),利于独立SEO优化
劣势
- 运维成本高:每个企业需创建独立站点,配置Nginx、SSL、部署脚本,后续更新需批量操作或逐个处理
- 资源浪费:多站点重复占用服务器资源,进程、缓存等无法共享,服务器扩容成本更高
- 品牌分散:用户需记住各自域名,不利于统一品牌运营
选型建议
- 优先选单域名:如果企业用户数量较多(≥20家)、业务标准化程度高,追求运维效率和品牌统一,单域名方案是更优选择
- 保留多域名:如果企业用户少(<10家)、存在大量个性化定制需求,多域名方案的复杂度更低,更易维护
- 混合方案:若部分企业需要独立域名对外展示,可配置Nginx将独立域名反向代理到单域名的租户路由(如
companyA.com→appname.com/tenant/companyA),通过路由参数识别租户并切换数据库,兼顾品牌统一和个性化需求
内容的提问来源于stack exchange,提问作者Morex
相关产品推荐
相关产品推荐

