PHP负载均衡如何配置_新手快速搭建入门指南【教程】

2次阅读

php本身不提供负载均衡能力,所谓“php负载均衡”实为借助nginx、haproxy等外部服务将http请求分发至多个php后端服务器;直接在php中实现转发存在阻塞i/o、无健康检查、session丢失、功能缺失等严重缺陷。

PHP负载均衡如何配置_新手快速搭建入门指南【教程】

PHP 本身不提供负载均衡能力,所谓“PHP 负载均衡”实际是指:用外部服务(如 Nginx、HAProxy、云 LB)把 HTTP 请求分发到多个运行 PHP 的后端服务器上。直接在 PHP 代码里做请求分发既不可靠也不安全,更无法处理连接、健康检查、会话保持等关键问题。

为什么不能用 PHP 写负载均衡器

有人尝试用 curlstream_socket_client 在 PHP 中转发请求,但这类方案存在严重缺陷:

  • 阻塞式 I/O 导致并发能力极低,一个请求卡住就拖垮整个进程
  • 无法自动检测后端宕机(没健康检查),故障转移全靠手动重启
  • Session 丢失风险高,PHP 默认 session 不跨机器共享
  • 超时、重试、限流、TLS 终止等必须功能都得自己重复造轮子

Nginx 作为反向代理实现最简负载均衡

这是新手最该起步的方式:Nginx 做前端接收所有请求,按策略分发给多个 PHP-FPM 或 apache+PHP 实例。

示例配置(/etc/nginx/conf.d/loadbalancer.conf):

立即学习PHP免费学习笔记(深入)”;

upstream php_backend {     server 192.168.1.10:9000;  # PHP-FPM 监听地址     server 192.168.1.11:9000;     keepalive 32; } <p>server { listen 80; location / { proxy_pass <a href="https://www.php.cn/link/6ec52fc9886c13b7f97e5c5dee505909">https://www.php.cn/link/6ec52fc9886c13b7f97e5c5dee505909</a>; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }</p>
  • upstream 块定义后端池,支持 weightmax_failsfail_timeout 等参数调优
  • 务必配 proxy_set_header,否则 PHP 的 $_SERVER['REMOTE_ADDR'] 会变成 Nginx 本机 IP
  • 如果后端是 Apache/PHP(非 PHP-FPM),proxy_pass 应指向 http://192.168.1.x:80,不是 :9000

Session 共享是绕不开的坑

负载均衡后,用户请求可能落到任意后端,但默认 PHP session 存本地文件,导致登录态失效。

  • 首选方案:改用 redis 存 session,所有 PHP 实例连同一 Redis 实例
    → 修改 php.inisession.save_handler = redissession.save_path = "192.168.1.20:6379"
  • 次选方案:用数据库(如 mysql)存 session,性能不如 Redis,但兼容性更好
  • 不推荐方案:粘性 Session(sticky session),靠 Nginx 的 ip_hash,但破坏了负载均衡意义,且 NAT 环境下失效

真正麻烦的从来不是加几台机器或改几行配置,而是状态——比如 session、缓存、数据库连接池、上传临时文件路径。这些不在请求中显式传递的东西,才是多实例部署时最容易出问题的地方。

text=ZqhQzanResources