ThinkPHP 8.1分布式项目接入负载均衡需分层解耦:一、应用无状态化,Session/缓存改用Redis,文件上传对接OSS或NFS;二、Nginx配置upstream集群,启用least_conn、健康检查及真实IP透传;三、数据库通过WeightedLoadBalancer实现读写分离与从库负载感知;四、验证请求分发、Session一致性、故障转移及节点定位。

给 ThinkPHP 8.1 分布式项目接入负载均衡,核心是分层解耦 + 请求分发 + 状态一致。不能只配 Nginx 就算完,否则多台服务器之间 Session 丢失、数据库写冲突、文件上传不一致等问题会立刻暴露。
一、前置条件:确保应用本身无状态
ThinkPHP 应用必须剥离本地依赖,才能安全部署到多节点:
-
Session 不存文件:禁用默认的 file 驱动,改用 Redis 或数据库驱动。配置 config/session.php 中
'type' => 'redis',并确认'host'指向统一 Redis 实例 -
缓存统一出口:关闭
cache.driver = file,所有节点共用 Redis 或 Memcached。避免各节点缓存不一致导致数据错乱 -
上传文件不走本地磁盘:禁用
think\File直传,改用对象存储(如阿里云 OSS、腾讯云 COS)或 NFS 共享目录;若用 NFS,需确保所有节点挂载路径和权限完全一致 -
日志集中收集:不写本地
runtime/log/,改用monolog接入 ELK 或 Sentry,便于排查跨节点问题
二、接入层:Nginx 负载均衡配置
在独立服务器(或云 LB)上部署 Nginx,作为唯一入口。关键不是加几台 server,而是策略合理:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
-
使用
least_conn或ip_hash策略:避免某台机器突发高负载。若需保持用户会话粘性(如调试阶段),可用ip_hash;生产环境推荐least_conn+ 健康检查 -
为后端节点设置权重与容错:
upstream tp81_cluster { least_conn; server 192.168.10.11:80 weight=3 max_fails=2 fail_timeout=30s; server 192.168.10.12:80 weight=2 max_fails=2 fail_timeout=30s; server 192.168.10.13:80 max_fails=2 fail_timeout=30s; } -
透传真实客户端信息:必须包含
X-Real-IP和X-Forwarded-For,否则 ThinkPHP 的request()->ip()会返回 Nginx 内网 IP
三、数据层:数据库读写分离与负载感知
ThinkPHP 8.1 原生支持负载均衡器类,可对接从库集群:
立即学习“PHP免费学习笔记(深入)”;
- 定义加权选择器:创建 app/common/WeightedLoadBalancer.php,按从库性能分配查询流量
-
在数据库配置中启用(config/database.php):
'read' => [ 'db_slave1:3306' => ['host' => '192.168.20.1', 'port' => 3306], 'db_slave2:3306' => ['host' => '192.168.20.2', 'port' => 3306], ], 'load_balance' => [\app\common\WeightedLoadBalancer::class, 'select'] -
主库强制写,从库自动读:无需手动切库,TP8.1 的查询构造器会根据 SQL 类型自动路由(
insert/update/delete走主库,select走从库)
四、验证与可观测性要点
配置完成不等于跑通,要主动验证关键链路:
-
检查请求是否真被分发:在每台应用服务器的控制器里临时输出
gethostname().':'.getenv('SERVER_ADDR'),用 curl 多次请求,观察响应是否轮转 -
测试 Session 持续性:登录后刷新页面,检查
session_id()是否不变,且用户信息不丢失 - 模拟单点故障:停掉一台后端服务器,确认 Nginx 自动剔除、其余节点继续服务,且无 502 错误
-
监控 header 响应头:用
curl -I查看X-Upstream或自定义X-Server-ID,快速定位当前处理节点


















