使用Docker Compose构建Nginx负载均衡与PHP-FPM集成的Web服务架构 🔗
使用Docker和Docker Compose来创建一个由Nginx作为负载均衡器,连接到三个PHP-FPM实例的Web服务环境。所有容器将被部署在名为php-Proxy
的自定义网络中。
前提条件 🔗
- 安装Docker和Docker Compose:
- 确保已经安装了Docker 和 Docker Compose。
- 创建Docker网络:
- 创建一个名为
php-Proxy
的Docker网络(如果尚未创建):docker network create php-Proxy
- 创建一个名为
- 项目目录结构:
- 在工作目录下创建以下结构:
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;
}
注意事项 🔗
- 服务健康检查:
- 使用
health_check
模块或第三方工具(如nginx_upstream_check_module
)监控后端服务器状态。
- 使用
- 动态配置:
- 使用
nginx -s reload
动态加载配置,避免重启服务。
- 使用
- 日志记录:
- 配置Nginx日志,记录请求分发情况和错误信息。
通过以上步骤和配置,可以快速搭建一个基于Nginx负载均衡的PHP-FPM服务集群,并根据实际需求选择合适的负载均衡策略。