Linux服务器上ThinkPHP如何进行负载均衡
导读:Linux服务器上 ThinkPHP 负载均衡实战 一 架构与前置准备 组件与拓扑:使用 Nginx 作为反向代理与负载均衡器,后端多台 PHP-FPM(或 Swoole)运行 ThinkPHP 6/5,静态资源由 Nginx 直接服务。...
Linux服务器上 ThinkPHP 负载均衡实战
一 架构与前置准备
- 组件与拓扑:使用 Nginx 作为反向代理与负载均衡器,后端多台 PHP-FPM(或 Swoole)运行 ThinkPHP 6/5,静态资源由 Nginx 直接服务。
- 一致性要求:多实例间需统一 Session、缓存、上传文件与日志,避免状态粘滞与数据不一致。
- 基础检查:各实例代码版本一致、目录权限一致、时区与依赖一致;数据库与应用配置(如域名、密钥)一致。
二 方案一 Nginx 反向代理 + PHP-FPM 多实例
- 后端 PHP-FPM 实例示例(两台):
- 实例A:192.168.1.11:9000
- 实例B:192.168.1.12:9000
- 负载均衡 Nginx 配置示例(/etc/nginx/conf.d/loadbalance.conf):
upstream php_backend {
# 可按需调整权重、最大失败次数与失败超时
server 192.168.1.11:9000 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.1.12:9000 weight=1 max_fails=3 fail_timeout=30s;
# 如需会话保持(不建议长期依赖,优先用Redis共享Session)
# ip_hash;
}
server {
listen 80;
server_name example.com;
root /var/wwwphp/public;
# 各实例的 public 目录
index index.php index.html;
# URL重写,适配 ThinkPHP 路由
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP 处理
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTP_HOST $host;
fastcgi_pass php_backend;
# 反向代理到 upstream
}
# 静态资源缓存(示例)
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# 隐藏敏感文件
location ~ /\.ht {
deny all;
}
}
- 生效与验证:
- 检查配置:
sudo nginx -t - 重载 Nginx:
sudo systemctl reload nginx - 简单压测:
ab -n 10000 -c 100 http://example.com/ - 在各后端查看访问日志,确认请求被分发到不同实例。
- 检查配置:
三 方案二 Swoole 常驻进程 + Nginx 负载均衡
- 适用场景:需要长连接、协程、更高并发的 API/WebSocket 服务。
- 后端 Swoole 实例示例:
- 实例A:192.168.1.21:9501
- 实例B:192.168.1.22:9501
- Nginx 配置示例(/etc/nginx/conf.d/swoole_lb.conf):
upstream swoole_backend {
server 192.168.1.21:9501 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.1.22:9501 weight=1 max_fails=3 fail_timeout=30s;
# 如需会话粘滞(不建议长期依赖)
# ip_hash;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://swoole_backend;
proxy_http_version 1.1;
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_read_timeout 120s;
# Swoole 长连接可适当增大
}
}
- 生效与验证:
- 检查与重载:
sudo nginx -t & & sudo systemctl reload nginx - 压测:
ab -n 10000 -c 100 http://api.example.com/ - 多实例返回差异化标识(如在控制器中输出服务器IP),验证分发效果。
- 检查与重载:
四 分布式一致性关键配置
- Session 共享:将 Session 存入 Redis/Memcached,各实例统一连接配置,避免单机内存 Session 导致登录态不一致。
- 缓存共享:使用 Redis 作为统一缓存后端,避免命中率与数据不一致问题。
- 文件上传:将用户上传文件放到对象存储(如 七牛云 OSS)或分布式文件系统,代码中通过 think\filesystem 使用对应驱动。
- 日志集中:多实例日志写入 ELK/EFK 或云日志服务,便于检索与排错。
五 健康检查与运维建议
- 健康检查与容错:在 upstream 中使用 max_fails/fail_timeout 与 weight 控制故障摘除与权重分配;必要时配合主动健康检查脚本。
- 会话保持策略:仅在短期内无法改造为共享 Session 时临时使用 ip_hash;长期方案优先 Redis 共享。
- 静态资源:由 Nginx 直接服务并设置长期缓存,减轻后端压力。
- 压测与观测:上线前用 ab/wrk 压测,观察 QPS、P95/P99、错误率、各实例负载;上线后持续监控与告警。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Linux服务器上ThinkPHP如何进行负载均衡
本文地址: https://pptw.com/jishu/755192.html
