必须配置upstream模块定义thinkphp节点组,设置proxy_pass反向代理及真实ip透传,统一redis存储session,同步静态资源至nfs,启用健康检查与故障转移机制。

如果您已在多台CentOS服务器上部署了ThinkPHP应用,需通过Nginx实现请求分发与高可用,则必须正确配置upstream模块及反向代理规则。以下是具体实施步骤:
一、定义Upstream服务器组
upstream模块用于声明后端ThinkPHP节点集合,是负载均衡的基础。Nginx将依据该定义轮询或按策略分发请求至各节点,确保单点故障不影响整体服务。
1、打开Nginx主配置文件:/etc/nginx/nginx.conf 或独立站点配置文件(如 /etc/nginx/conf.d/thinkphp-cluster.conf)。
2、在 http { ... } 块内顶部位置添加 upstream 声明:
upstream thinkphp_nodes {
server 192.168.1.101:80 max_fails=3 fail_timeout=30s;
server 192.168.1.102:80 max_fails=3 fail_timeout=30s;
server 192.168.1.103:80 backup;
}
3、其中 max_fails 和 fail_timeout 控制健康检查阈值,backup 标识备用节点,仅当其他节点全部不可用时启用。
二、配置Server块并启用proxy_pass
server块定义对外服务入口,需绑定域名或IP,并将所有动态请求交由upstream处理,同时透传客户端真实信息以保障ThinkPHP正常识别请求上下文。
1、在同一个 http 块中,紧接 upstream 声明之后添加 server 配置:
server {
listen 80;
server_name yourapp.example.com;
location / {
proxy_pass http://thinkphp_nodes;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
}
}
2、proxy_pass 必须指向 upstream 名称(不带协议前缀),且末尾无斜杠,否则可能导致URI重写异常。
3、proxy_set_header 系列指令确保 ThinkPHP 的 $_SERVER['HTTP_X_REAL_IP'] 和路由解析不受代理影响。
三、启用Session共享机制
集群环境下,用户请求可能被调度至不同节点,若Session仍依赖本地文件存储,将导致登录态丢失。必须统一使用外部存储后端承载Session数据。
1、在所有ThinkPHP节点的 config/session.php 中设置:
'type' => 'redis',
'host' => '192.168.1.200',
'port' => 6379,
'password' => '',
'timeout' => 25,
'expire' => 3600,
2、确认Redis服务已运行于指定地址,且各节点可网络连通,防火墙放行 6379 端口。
3、执行 php think optimize:schema 确保缓存配置生效,避免因本地session驱动残留引发冲突。
四、同步静态资源与上传目录
ThinkPHP项目中的 public/static、public/uploads 等路径若分散在各节点本地,将造成资源访问不一致或404。需采用集中式存储方案确保内容一致性。
1、部署 NFS 服务端于专用存储节点(如 192.168.1.201),导出目录:/data/web-static。
2、在全部ThinkPHP节点执行挂载命令:
sudo mkdir -p /var/www/thinkphp/public/static
sudo mount -t nfs 192.168.1.201:/data/web-static /var/www/thinkphp/public/static
3、将挂载命令写入 /etc/fstab 实现开机自动挂载,格式示例:
192.168.1.201:/data/web-static /var/www/thinkphp/public/static nfs defaults 0 0。
五、配置健康检查与故障转移
Nginx默认仅在连接失败时剔除节点,无法感知应用层HTTP返回码异常(如502/503)。需借助第三方模块或主动探测机制提升可靠性。
1、安装 nginx-module-vts(可选)或启用 stub_status 模块,暴露基础状态页供外部监控调用。
2、在每个ThinkPHP节点的 Nginx server 块中添加探针位置:
location /healthz {
return 200 'OK';
add_header Content-Type text/plain;
}
3、在 upstream 块中启用被动健康检查增强项(需 Nginx ≥ 1.19):
upstream thinkphp_nodes {
server 192.168.1.101:80 max_fails=3 fail_timeout=30s;
server 192.168.1.102:80 max_fails=3 fail_timeout=30s;
zone thinkphp_upstream 64k;
keepalive 32;
}
4、zone 参数启用共享内存区域,支持多worker进程间状态同步;keepalive 减少TCP连接重建开销。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











