温馨提示×

PHP在Linux怎样实现负载均衡

小樊
42
2025-11-30 11:57:53
栏目: 云计算

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

一、常见架构与适用场景

  • 应用服务器层:多台运行 PHP-FPM 的服务器(或同一台机器上多个 FPM 实例),负责执行 PHP 脚本。
  • 负载均衡层:使用 Nginx/HAProxy 做反向代理与负载分发;需要极致性能时可用 LVS/IPVS 做四层转发;容器化环境可用 Traefik 自动服务发现与路由。
  • 典型组合:Nginx/HAProxy → 多个 PHP-FPM(TCP 端口或 Unix Socket),实现横向扩展与高可用。

二、方案一 Nginx 作为反向代理与负载均衡

  • 安装组件(Debian/Ubuntu 示例):sudo apt update && sudo apt install nginx php-fpm
  • 配置 PHP-FPM(/etc/php/7.x/fpm/pool.d/www.conf):listen = 127.0.0.1:9000(或 listen = /run/php/php7.x-fpm.sock
  • 配置 Nginx(/etc/nginx/sites-available/default 或 /etc/nginx/nginx.conf 的 http 段):
    http {
      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;
        # 也可使用 Unix socket:server unix:/run/php/php7.x-fpm.sock;
      }
    
      server {
        listen 80;
        server_name example.com;
        root /var/www/html;
        index index.php;
    
        location / {
          try_files $uri $uri/ =404;
        }
    
        location ~ \.php$ {
          include snippets/fastcgi-php.conf;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include fastcgi_params;
          fastcgi_pass php_backend;   # 指向 upstream 名称
        }
      }
    }
    
  • 生效:sudo systemctl restart nginx && sudo systemctl restart php7.x-fpm
  • 要点:Nginx 支持轮询、最少连接、IP 哈希等算法;通过 upstream 的 weight、max_fails、fail_timeout 实现健康检查与权重。

三、方案二 HAProxy 作为负载均衡器

  • 安装:sudo apt install haproxy(或 yum/dnf 安装)
  • 配置(/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
      server php1 192.168.1.11:9000 check
      server php2 192.168.1.12:9000 check
      # 支持 Unix socket:server php1 unix:/run/php/php7.x-fpm.sock check
    
  • 生效:sudo systemctl restart haproxy
  • 要点:HAProxy 健康检查完善、算法丰富(如 roundrobin、leastconn、source、uri 等),适合复杂场景与更高并发。

四、方案三 单机多实例与容器化实践

  • 单机多 PHP-FPM 实例(同一台机器)
    • 复制 FPM 池配置(如 www.conf → www2.conf),修改 listen 为不同 Unix socket端口(如 /tmp/php-fpm.sock 与 /tmp/php-fpm2.sock,或 9000/9001)。
    • Nginx upstream 同时列出多个实例(socket 或端口),实现本机多实例负载均衡。
    • 按需启动多个实例(systemd 模板或复制服务),并分别设置进程数(pm.max_children 等)。
  • Docker Compose 示例(简化)
    version: '3'
    services:
      app:
        build: .
        expose:
          - "9000"
      lb:
        image: nginx:latest
        ports:
          - "80:80"
        volumes:
          - ./lb.conf:/etc/nginx/conf.d/default.conf
    
    lb.conf 中使用 upstream 指向多个 app:9000 实例即可。

五、关键注意事项与优化

  • 会话保持:有状态应用可用 IP 哈希(Nginx ip_hash)、会话粘滞(HAProxy source/cookie),或改为 Redis 等外置会话存储以实现无状态与水平扩展。
  • 健康检查与容错:配置 upstream 的 max_fails/fail_timeout,或 HAProxy 的 check,自动摘除异常实例。
  • 静态资源:由 Nginx 直接服务(location ~* .(jpg|css|js)$ { expires …; }),减少 PHP-FPM 压力。
  • 文件上传:大文件建议走 X-Accel-Redirect/X-Sendfile 由 Nginx 直接输出,避免占用 FPM 工作进程。
  • 日志与排错:关注 /var/log/nginx/error.log/var/log/php-fpm/*.log,核对 fastcgi_param SCRIPT_FILENAME 与目录权限。
  • 高可用:生产可部署 主备负载均衡器 + Keepalived(VRRP)实现 VIP 漂移,避免单点。

0