下面我将介绍如何使用Docker Compose配置Nginx作为负载均衡器,将请求分发到多个后端服务实例。
客户端 → Nginx(负载均衡器) → 多个后端服务实例
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=1
# 后端服务实例2
backend2:
image: your-backend-image:tag
environment:
- INSTANCE=2
# 后端服务实例3
backend3:
image: your-backend-image:tag
environment:
- INSTANCE=3
events {
worker_connections 1024;
}
http {
upstream backend {
# 默认使用轮询(round-robin)策略
server backend1:80;
server backend2:80;
server backend3:80;
# 可选: 权重分配
# server backend1:80 weight=3;
# server backend2:80 weight=2;
# server backend3:80 weight=1;
# 可选: 最少连接策略
# least_conn;
}
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;
}
}
}
docker-compose up -d
在nginx.conf的upstream块中,可以指定不同的负载均衡算法:
upstream backend {
# 轮询(默认)
server backend1:80;
server backend2:80;
# IP哈希(同一客户端总是访问同一后端)
# ip_hash;
# 最少连接
# least_conn;
# 加权轮询
# server backend1:80 weight=3;
# server backend2:80 weight=1;
}
upstream backend {
server backend1:80 max_fails=3 fail_timeout=30s;
server backend2:80 max_fails=3 fail_timeout=30s;
}
# 扩展后端服务实例数量
docker-compose up -d --scale backend=5
然后更新nginx.conf以包含新的实例。
http://localhost
docker-compose logs backend1
docker-compose logs backend2
docker-compose logs backend3
ip_hash
策略或确保后端能共享状态通过以上配置,你已经成功使用Docker Compose和Nginx实现了基本的负载均衡功能。