温馨提示×

Linux服务器PHP如何进行负载均衡

小樊
42
2025-12-22 04:14:18
栏目: 云计算

Linux服务器PHP负载均衡实战指南

一、架构与方案选型

  • 常见做法是在前端使用NginxHAProxy做反向代理/负载均衡,后端多台服务器运行PHP-FPM处理动态请求;静态资源由前端直接服务,动态请求按策略分发到后端池。此模式成熟、易扩展,适合大多数LNMP场景。
  • 负载均衡策略可选:轮询 roundrobin最少连接 leastconnIP哈希 ip_hash等;健康检查建议开启,自动摘除异常后端,提升稳定性。
  • 若需更高可用,可在负载均衡器前再加一层Keepalived VIP,实现故障秒切,消除单点。
  • 典型LNMP高可用组合:Nginx/HAProxy + PHP-FPM + Keepalived + Redis缓存 + 监控/日志,既分担负载又保障连续性与可观测性。

二、方案一 Nginx反向代理到多台PHP-FPM

  • 适用:已有多台后端运行PHP-FPM,希望用Nginx统一入口与分发。
  • 后端PHP-FPM配置要点(各后端一致):
    • 编辑池配置(如:/etc/php/7.4/fpm/pool.d/www.conf
      • 监听方式二选一:
        • TCP:listen = 127.0.0.1:9000(便于跨机)或服务器内网IP(如:192.168.1.10:9000
        • Unix Socket:listen = /run/php/php7.4-fpm.sock
      • 进程管理示例:pm = dynamic;pm.max_children = 50;pm.start_servers = 5;pm.min_spare_servers = 5;pm.max_spare_servers = 35
    • 重启:systemctl restart php7.4-fpm
  • 前端Nginx配置示例(/etc/nginx/sites-available/default 或 /etc/nginx/nginx.conf 的 http 段内):
    • 定义后端池:
      upstream php_backend {
          least_conn;                 # 可按需改为 roundrobin/ip_hash
          server 192.168.1.11:9000 check;
          server 192.168.1.12:9000 check;
          server 192.168.1.13:9000 check;
      }
      
    • 站点配置:
      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 snippets/fastcgi-php.conf;
              fastcgi_pass php_backend;   # 指向 upstream 名称
              fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
              include fastcgi_params;
          }
      }
      
    • 若后端用 Unix Socket,将 fastcgi_pass 改为:fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    • 检查并重载:nginx -t && systemctl reload nginx
  • 说明:Nginx既可作为七层反向代理,也能直接把PHP请求通过FastCGI转发到后端PHP-FPM池,实现横向扩展。

三、方案二 HAProxy分发到多台PHP-FPM

  • 适用:需要更细粒度的负载算法、健康检查与统计的HTTP/TCP层负载均衡。
  • 安装:sudo apt update && sudo apt install haproxy
  • 配置示例(/etc/haproxy/haproxy.cfg):
    global
        log /dev/log local0
        log /dev/log local1 notice
        daemon
    
    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.php
        server s1 192.168.1.11:9000 check
        server s2 192.168.1.12:9000 check
        server s3 192.168.1.13:9000 check
    
    • 建议在各后端放置**/health.php**(返回200),便于HTTP健康检查摘除异常实例。
    • 重启:systemctl restart haproxy
  • 说明:HAProxy在HTTP层提供丰富的调度与健康检查能力,适合复杂场景与更高并发。

四、关键注意事项与优化

  • 会话与一致性
    • 若业务依赖PHP Session,避免默认文件存储导致“粘滞”不均;建议改为Redis/Memcached集中会话存储,或使用ip_hash做会话亲和(会降低均衡度)。
  • 文件与上传
    • 多后端时,用户上传/生成文件需放到共享存储(如NFS)或对象存储,避免仅落在单台后端。
  • 静态资源
    • 图片/CSS/JS等由Nginx直接服务,动态请求才转发到后端,显著降低后端压力。
  • 健康与熔断
    • 开启主动健康检查(如HAProxy的httpchk或Nginx Plus的健康检查),异常节点自动摘除;必要时配合熔断/重试策略。
  • 进程与连接
    • 合理设置pm.max_children、pm.start_servers、pm.min/max_spare_servers,并与数据库连接池内核/网络参数联动,避免瓶颈。
  • 高可用
    • Nginx/HAProxy前部署Keepalived VIP,实现主备自动切换,消除单点故障。
  • 监控与日志
    • 集中采集Nginx/HAProxy/PHP-FPM访问与错误日志,结合Zabbix/Nagios/Netdata等监控告警,快速定位异常。

0