Appearance
问题现象
在一台服务器上同时部署了两套或多套 EBAOZU(承信租)系统后,出现以下诡异现象:
- 在 A 站点登录后台,B 站点的管理员被强制踢出下线或提示登录过期。
- A 站点提交的图片验证码,在 B 站点验证时提示验证码错误。
- 缓存数据(如系统设置、分类树、热销商品)在不同站点之间相互覆盖或串号。
- 队列任务被另一套站点的消费者拉取执行。
根本原因
ThinkPHP 的缓存组件与 EBAOZU 的常驻内存 Swoole 框架默认将缓存与 Session 存储于 Redis 中。 若多套系统连接同一个 Redis 实例且未配置互不相同的前缀(CACHE.PREFIX、CACHE.TAG_PREFIX)或使用了相同的 Redis 数据库(SELECT),两套系统的 Key 会在 Redis 内部产生命名空间重叠,互相覆写对方的数据。
解决方案
部署第二套(或更多套)系统时,必须严格按照以下步骤对每套环境进行彻底隔离:
修改第二套站点的 Swoole 端口
打开第二套项目的 config/swoole.php(或 .env):
php
'server' => [
'host' => env('SWOOLE_HOST', '127.0.0.1'),
'port' => env('SWOOLE_PORT', 20799), // 第一套使用 20697,第二套改为 20799
],修改第二套站点的 Nginx 反向代理
在第二套站点的 Nginx 配置文件中,反向代理端口同步指向 20799:
nginx
location / {
proxy_pass http://127.0.0.1:20799;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Authori-zation $http_authori_zation;
}修改第二套站点的 .env 缓存与 Redis 隔离
打开第二套项目的根目录 .env 文件:
ini
[CACHE]
DRIVER = redis
PREFIX = site2_ebaozu_
TAG_PREFIX = tag_site2_
[REDIS]
REDIS_HOSTNAME = 127.0.0.1
PORT = 6379
REDIS_PASSWORD = your_redis_password
SELECT = 1 # 第一套使用 0,第二套使用 1为第二套站点创建独立的 Supervisor 守护进程
在宝塔【Supervisor管理器】中新增守护进程:
- 名称:
ebaozu_site2 - 运行目录:第二套项目的绝对根目录
- 启动命令:
php think swoole - 启动用户:
www
重启所有站点的 Swoole 守护进程
修改完成后,分别在 Supervisor 管理器中重启两套站点的守护进程,数据混乱与互踢问题即可彻底解决。