下面我将介绍如何使用Docker Compose配置Nginx作为负载均衡器,将请求分发到多个后端服务实例。
客户端请求 → Nginx负载均衡器 → [后端服务1, 后端服务2, 后端服务3...]
nginx-load-balancer/
├── docker-compose.yml
├── nginx/
│ └── nginx.conf
└── backend/
└── (你的后端服务文件)
version: '3.8'
services:
# Nginx负载均衡器
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
depends_on:
- backend1
- backend2
- backend3
# 后端服务实例1
backend1:
image: your-backend-image:tag
environment:
- INSTANCE_ID=1
expose:
- "8080"
# 后端服务实例2
backend2:
image: your-backend-image:tag
environment:
- INSTANCE_ID=2
expose:
- "8080"
# 后端服务实例3
backend3:
image: your-backend-image:tag
environment:
- INSTANCE_ID=3
expose:
- "8080"
events {
worker_connections 1024;
}
http {
upstream backend {
# 默认使用轮询(round-robin)策略
server backend1:8080;
server backend2:8080;
server backend3:8080;
# 可选的其他负载均衡策略:
# least_conn; # 最少连接
# ip_hash; # 基于客户端IP的哈希
# hash $request_uri consistent; # 基于URI的哈希
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
upstream backend {
server backend1:8080 weight=3; # 处理3倍于其他服务器的请求
server backend2:8080 weight=2;
server backend3:8080;
}
upstream backend {
server backend1:8080 max_fails=3 fail_timeout=30s;
server backend2:8080 max_fails=3 fail_timeout=30s;
server backend3:8080 max_fails=3 fail_timeout=30s;
}
upstream backend {
server backend1:8080;
server backend2:8080;
server backend3:8080 backup; # 只有当其他服务器都不可用时才启用
}
docker-compose up -d
访问 http://localhost
,Nginx会自动将请求分发到不同的后端实例。你可以通过以下方式验证:
nginx
location / {
proxy_pass http://backend;
add_header X-Backend-Server $upstream_addr;
}
要动态增加后端实例数量:
docker-compose up -d --scale backend=5
然后更新Nginx配置以包含新的实例。
对于生产环境,可以考虑使用Nginx Plus或OpenResty,它们提供更高级的负载均衡功能:
ip_hash
或sticky
模块希望这个配置能帮助你实现Nginx负载均衡。根据你的具体需求,可以进一步调整配置参数。