温馨提示×

如何在Linux上实现PHP负载均衡

小樊
34
2025-12-29 23:29:57
栏目: 云计算

Linux上实现PHP负载均衡的实用方案

一、架构与总体思路

  • 常见做法是让Nginx/HAProxy作为入口,将动态请求通过FastCGI转发到多个PHP‑FPM实例;静态资源由入口或后端节点直接提供。为提升整体可用性,可在入口前叠加Keepalived VIP实现故障自动切换。数据库层可配合MySQL 主从复制,并在应用或中间件层做读写分离以进一步分担压力。

二、方案一 Nginx反向代理 + 多实例PHP‑FPM(推荐)

  • 适用场景:单机多实例或小规模集群,部署与维护简单。
  • 配置步骤
    1. 安装组件(以 Ubuntu/Debian 为例)
      • sudo apt update && sudo apt install nginx php-fpm
    2. 准备多个 PHP‑FPM 实例(同一主机或不同主机)
      • 复制一份池配置并修改监听,例如创建**/etc/php/7.4/fpm/pool.d/www1.confwww2.conf**,将 listen 分别设为**/run/php/php7.4-fpm1.sock/run/php/php7.4-fpm2.sock**;确保进程属主与权限正确(如listen.owner=www-datalisten.group=www-datalisten.mode=0660)。
    3. 配置 Nginx upstream 与 FastCGI 转发
      • 在 http 块中定义上游,在 server 的 location ~ .php$ 中使用 fastcgi_pass 指向该上游;注意传递SCRIPT_FILENAME等关键参数。
    4. 验证与生效
      • 执行 sudo nginx -t && sudo systemctl reload nginx;多实例场景下可结合least_conn或权重进行分发。
  • 关键配置示例
    • Nginx upstream 与 PHP 转发
      http {
        upstream php_fpm {
          least_conn;
          server unix:/run/php/php7.4-fpm1.sock max_fails=3 fail_timeout=30s;
          server unix:/run/php/php7.4-fpm2.sock max_fails=3 fail_timeout=30s;
        }
      
        server {
          listen 80;
          server_name example.com;
          root /var/www/html;
          index index.php index.html;
      
          location / {
            try_files $uri $uri/ =404;
          }
      
          location ~ \.php$ {
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_pass php_fpm;
          }
        }
      }
      
    • PHP‑FPM 池示例(/etc/php/7.4/fpm/pool.d/www1.conf 片段)
      [www1]
      user = www-data
      group = www-data
      listen = /run/php/php7.4-fpm1.sock
      listen.owner = www-data
      listen.group = www-data
      listen.mode = 0660
      pm = dynamic
      pm.max_children = 50
      pm.start_servers = 10
      pm.min_spare_servers = 5
      pm.max_spare_servers = 15
      
    以上要点与示例可直接用于生产实践,按需扩展更多实例与参数。

三、方案二 HAProxy 负载均衡 + PHP‑FPM

  • 适用场景:需要更丰富的负载算法健康检查统计页面的中大型集群。
  • 配置步骤
    1. 安装 HAProxy:sudo apt install haproxy(或 yum 安装)。
    2. 配置 frontend/backend,将 mode 设为http,在 backend 中使用balance roundrobin并指向多个 PHP‑FPM(Unix 套接字或 127.0.0.1:9000)。
    3. 启用健康检查(HTTP 或 TCP),并配置统计页以便运维观测。
    4. 验证与生效:haproxy -c -f /etc/haproxy/haproxy.cfg && sudo systemctl reload haproxy。
  • 关键配置示例
    global
      log /dev/log local0
      log /dev/log local1 notice
      daemon
      maxconn 4096
    
    defaults
      log     global
      mode    http
      option  httplog
      option  dontlognull
      timeout connect 5000ms
      timeout client  50000ms
      timeout server  50000ms
    
    frontend http_front
      bind *:80
      default_backend php_back
    
    backend php_back
      balance roundrobin
      option httpchk GET /health
      http-check expect status 200
      server php1 unix:/run/php/php7.4-fpm1.sock check inter 5s fall 3 rise 2
      server php2 unix:/run/php/php7.4-fpm2.sock check inter 5s fall 3 rise 2
    
    listen stats
      bind *:8404
      stats enable
      stats uri /haproxy?stats
      stats refresh 10s
    
    上述配置支持主动健康检查与统计页面,便于快速定位异常与观察分发情况。

四、高可用、验证与优化要点

  • 高可用与入口
    • 在负载均衡器前部署Keepalived VIP,实现主备自动切换;对外统一使用 VIP 访问,避免单点。
  • 会话与缓存
    • 多实例务必将Session缓存外置到Redis/Memcached,避免登录状态不一致与热点瓶颈。
  • 静态资源与传输
    • 由 Nginx 直接托管静态资源,开启gzip长缓存,并接入CDN降低后端压力;可在入口终止 HTTPS,后端使用 HTTP 减少加解密开销。
  • 健康检查与熔断
    • 在 upstream 中使用max_fails/fail_timeout快速摘除异常节点;结合主动健康检查与合理的超时/重试策略,避免雪崩。
  • 数据库层
    • 采用MySQL 主从复制读写分离(应用层路由或 MySQL Router/ProxySQL),注意从库复制延迟对强一致业务的影响。
  • 监控与可观测性
    • 统一访问/错误日志,记录X-Forwarded-For;部署Prometheus + Grafana监控 Nginx、PHP‑FPM、MySQL 指标与告警,结合慢查询日志与 APM 定位瓶颈。

0