yii集群部署必须配置缓存、session、数据库schema、cookie路径和web路由五环节:缓存需用yii\redis\cache配clusters数组与唯一keyprefix;session须由redis集群托管并确认phpredis≥5.0;db组件要启用schemacache;前后端cookie路径须隔离;nginx需双server块物理分离。

Yii 完全适合集群部署项目,但不是开箱即用就自动适配——它需要明确配置缓存、Session、数据库元信息、Cookie 路径和 Web 服务器路由这五个关键环节。漏掉任一环,就会出现登录态丢失、缓存失效、SQL 查询变慢、静态资源加载异常或后台跳转 404 等典型集群问题。
必须启用 Redis 集群缓存,且配置不能简化
默认 FileCache 在多实例下完全失效,所有节点各自缓存,互相不可见。必须切换为 yii\redis\Cache 并显式配置集群拓扑:
-
禁用单节点写法:不要只写
'hostname' => '127.0.0.1', 'port' => 6379;集群模式下必须删掉 hostname/port,改用'clusters' => ['192.168.10.101:7000', '192.168.10.102:7000', '192.168.10.103:7000'] -
keyPrefix 必须全局唯一:如
'keyPrefix' => 'myapp_prod_v2_',避免多个 Yii 应用共用 Redis 时键名冲突 -
schema 缓存强依赖 cache 组件可用:在
db组件中设'enableSchemaCache' => true和'schemaCachingDuration' => 3600,否则每次 ActiveRecord 初始化都会查INFORMATION_SCHEMA,拖垮性能
Session 必须由 Redis 集群统一托管
文件型 Session 是集群最大障碍。PHP 层需直接对接 Redis Cluster 协议:
- 确认
php -m | grep redis输出为redis(小写),且版本 ≥5.0;低于该版本无法加载RedisCluster类 - 在
php.ini中设置:session.save_handler = redisclustersession.save_path = "192.168.10.101:7000,192.168.10.102:7001,192.168.10.103:7002"session.rediscluster.auth = "your_strong_password" - 若用 Yii2 自定义 Session handler(如高安全要求场景),需继承
yii\web\Session并注入RedisCluster实例,而非复用普通 Connection
前后端应用必须物理隔离部署路径
高级模板的 frontend/web 和 backend/web 是两个独立入口,不能靠 URL 重写“假装”分离:
- Nginx 必须配两个
server块,分别指向不同root:
前台:root /var/www/myapp/frontend/web;
后台:root /var/www/myapp/backend/web; - 每个
server内必须单独配置 Cookie 路径:
前台'path' => '/',后台'path' => '/admin',否则_identity和PHPSESSID会互相覆盖 - Asset 发布目录也要区分:在
backend/config/main.php中设置'basePath' => '@webroot/assets-backend',避免 JS/CSS 文件被前台覆盖
数据库与负载均衡协同要点
集群本身不解决数据库瓶颈,但 Yii 可配合降低压力:
- 读写分离可借助
yii\db\Connection的slaves配置,但注意:schema 缓存仅作用于主库连接,从库表结构变更需手动flush缓存 - Nginx upstream 不建议用 IP hash 做会话绑定(违背无状态原则);应配合 Redis Session + JWT Token 实现真正无状态服务
- 高频查询务必用
getOrSet()封装,例如:Yii::$app->cache->getOrSet('user_menu_'.$userId, function () use ($userId) { return Menu::find()->forUser($userId)->asArray()->all(); }, 3600);











