使用Docker Compose构建Nginx负载均衡与PHP-FPM集成的Web服务架构

· 1487字 · 3分钟 · 阅读量

使用Docker Compose构建Nginx负载均衡与PHP-FPM集成的Web服务架构 🔗

使用Docker和Docker Compose来创建一个由Nginx作为负载均衡器,连接到三个PHP-FPM实例的Web服务环境。所有容器将被部署在名为php-Proxy的自定义网络中。


前提条件 🔗

  1. 安装Docker和Docker Compose
  2. 创建Docker网络
    • 创建一个名为php-Proxy的Docker网络(如果尚未创建):
      docker network create php-Proxy
      
  3. 项目目录结构
    • 在工作目录下创建以下结构:
      project-root/
      ├── docker-compose.yml
      ├── nginx/
      │   └── default.conf
      ├── php1/
      │   └── index.php
      ├── php2/
      │   └── index.php
      └── php3/
          └── index.php
      

步骤 1: 编写Nginx配置文件 (default.conf) 🔗

编辑nginx/default.conf,配置Nginx作为负载均衡器:

# 定义上游服务器组
upstream php-upstream {
    # 使用轮询策略(默认)
    server php-fpm-server-1:9000;
    server php-fpm-server-2:9000;
    server php-fpm-server-3:9000;
}

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    # 根目录设置
    root   /var/www/html;
    index  index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # 错误页面配置
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /var/www/html;
    }

    # PHP脚本处理
    location ~ \.php$ {
        root /var/www/html;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php-upstream;  # 使用上游服务器组
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

步骤 2: 准备测试PHP脚本 🔗

在每个php1, php2, php3目录下创建index.php文件,内容可以是简单的PHP信息页面:

<?php
echo "Hello from PHP-FPM Server " . gethostname();

步骤 3: 编写Docker Compose文件 🔗

编辑docker-compose.yml,定义Nginx和PHP-FPM服务:

version: '3.8'

services:
  nginx:
    image: nginx:1.25.0-bullseye
    container_name: nginx-load-balancer
    ports:
      - "10001:80"
    volumes:
      - ./nginx:/etc/nginx/conf.d
    networks:
      - php-Proxy

  php-fpm-1:
    image: php:8.1.18-fpm-custom
    container_name: php-fpm-server-1
    ports:
      - "10002:9000"
    volumes:
      - ./php1:/var/www/html
    networks:
      - php-Proxy

  php-fpm-2:
    image: php:8.1.18-fpm-custom
    container_name: php-fpm-server-2
    ports:
      - "10003:9000"
    volumes:
      - ./php2:/var/www/html
    networks:
      - php-Proxy

  php-fpm-3:
    image: php:8.1.18-fpm-custom
    container_name: php-fpm-server-3
    ports:
      - "10004:9000"
    volumes:
      - ./php3:/var/www/html
    networks:
      - php-Proxy

networks:
  php-Proxy:
    external: true

步骤 4: 启动服务 🔗

在项目根目录下运行以下命令启动所有服务:

docker-compose up -d

步骤 5: 验证部署 🔗

打开浏览器,访问http://localhost:10001。你应该能够看到通过Nginx负载均衡器分发到不同PHP-FPM实例的响应结果。


Nginx负载均衡的几种方式及优缺点 🔗

Nginx支持多种负载均衡策略,以下是常见的几种方式及其优缺点:

1. 轮询(Round Robin) 🔗

  • 默认策略:按顺序将请求分发到后端服务器。
  • 优点
    • 简单易用,适合后端服务器性能相近的场景。
  • 缺点
    • 无法根据服务器负载动态调整。
upstream php-upstream {
    server php-fpm-server-1:9000;
    server php-fpm-server-2:9000;
    server php-fpm-server-3:9000;
}

2. 加权轮询(Weighted Round Robin) 🔗

  • 策略:根据权重分配请求,权重高的服务器处理更多请求。
  • 优点
    • 可以根据服务器性能分配负载。
  • 缺点
    • 需要手动配置权重。
upstream php-upstream {
    server php-fpm-server-1:9000 weight=3;
    server php-fpm-server-2:9000 weight=2;
    server php-fpm-server-3:9000 weight=1;
}

3. IP哈希(IP Hash) 🔗

  • 策略:根据客户端IP地址哈希值分配请求,确保同一客户端始终访问同一服务器。
  • 优点
    • 适合需要会话保持的场景。
  • 缺点
    • 如果某台服务器宕机,会影响部分用户。
upstream php-upstream {
    ip_hash;
    server php-fpm-server-1:9000;
    server php-fpm-server-2:9000;
    server php-fpm-server-3:9000;
}

4. 最少连接(Least Connections) 🔗

  • 策略:将请求分发到当前连接数最少的服务器。
  • 优点
    • 动态分配负载,适合后端服务器性能差异较大的场景。
  • 缺点
    • 需要实时监控连接数,性能开销较大。
upstream php-upstream {
    least_conn;
    server php-fpm-server-1:9000;
    server php-fpm-server-2:9000;
    server php-fpm-server-3:9000;
}

5. 基于响应时间(Fair) 🔗

  • 策略:根据后端服务器的响应时间分配请求。
  • 优点
    • 动态调整,适合对响应时间敏感的场景。
  • 缺点
    • 需要额外模块支持(如nginx-upstream-fair)。
upstream php-upstream {
    fair;
    server php-fpm-server-1:9000;
    server php-fpm-server-2:9000;
    server php-fpm-server-3:9000;
}

注意事项 🔗

  1. 服务健康检查
    • 使用health_check模块或第三方工具(如nginx_upstream_check_module)监控后端服务器状态。
  2. 动态配置
    • 使用nginx -s reload动态加载配置,避免重启服务。
  3. 日志记录
    • 配置Nginx日志,记录请求分发情况和错误信息。

通过以上步骤和配置,可以快速搭建一个基于Nginx负载均衡的PHP-FPM服务集群,并根据实际需求选择合适的负载均衡策略。