多租户项目部署Laravel需确保:①PHP扩展(pdo_mysql等)启用且版本兼容;②禁用opcache.enable_cli和realpath_cache_size=0;③Nginx/Apache正确透传租户标识头;④MySQL用户权限严格隔离;⑤storage日志与缓存按租户分目录;⑥. env中DB_DATABASE仅设管理库,租户库名动态指定。

多租户项目在服务器安装 Laravel 时,除了基础框架要求外,还需额外关注数据隔离、上下文稳定性与运行时动态能力。这些不是可选项,而是保障租户间不越界、不污染、不降级的核心前提。
PHP 与扩展必须支持运行时连接切换
多租户常需动态切换数据库连接(如每个租户独立库),这依赖 PHP 的持久连接管理能力和扩展稳定性:
- 确保 pdo_mysql 或 pdo_pgsql 已启用,且版本兼容目标数据库(如 MySQL 8.0+ 的认证插件需 php-pdo-mysql ≥ 8.2)
- opcache.enable_cli=1 必须关闭(Laravel Octane 或队列中若复用进程,开启会导致配置缓存残留,引发租户连接错乱)
- 禁用 realpath_cache_size=0(尤其 Nginx + PHP-FPM 环境),否则 vendor/autoload.php 路径解析异常,导致多租户包(如 stancl/tenancy)的自动服务注册失败
Web 服务器要能稳定传递租户标识
子域名、Header 或路径识别租户都依赖请求头原始完整性,服务器不能擅自修改或截断关键字段:
- Nginx 中 underscores_in_headers on; 必须开启——否则含下划线的租户标识头(如
X-Tenant-ID)会被直接丢弃 - Apache 需确认 mod_headers 已启用,并在虚拟主机中显式允许传递自定义 Header:
RequestHeader set X-Tenant-ID "%{HTTP:X-Tenant-ID}e" env=HTTP_X_TENANT_ID - 若用 Cloudflare 等 CDN,需在“页面规则”中设置“将原始 HTTP 头传递给源站”,否则
Host或X-Forwarded-Host可能被覆盖,子域名识别失效
数据库与文件系统权限更严格
多租户场景下,一次权限错误可能波及全部租户:
- MySQL 用户需具备 CREATE DATABASE 和 DROP DATABASE 权限(stancl/tenancy 自动建库必需);若用独立库方案,该用户不能有 SHOW DATABASES,防止租户枚举其他库名
-
storage/下的logs/和framework/cache/必须按租户分目录隔离(例如storage/logs/tenant_abc/),否则日志混杂、缓存键冲突 -
bootstrap/cache/目录禁止全局写入——它应只由部署脚本在预热阶段生成,运行时若被多个租户并发重写,config.php缓存会相互覆盖
Composer 与环境配置需锁定上下文边界
多租户包(如 spatie/laravel-multitenancy)高度依赖配置加载时机和作用域:
-
.env中 DB_DATABASE 应设为默认管理库名(如laravel_tenant_manager),而非租户库;租户库名必须由代码动态指定,不可硬编码进 .env - 执行
php artisan config:clear后,必须立即运行php artisan tenancy:migrate(stancl)或php artisan multitenancy:migrate(spatie),否则租户迁移未生效,首次请求即报错 - 部署时禁用
composer install --no-dev的--classmap-authoritative参数——它会跳过自动加载器的运行时检查,导致租户模型绑定失败


















