Docker 环境下的 Nginx 负载均衡(vllm)

背景

在linux上实现负载均衡,我在其他服务器上四个vllm的端口,端口分别时8001/v1,8002/v1,8003/v1,8004/v1,需要配置一个监听,使用9000端口,对四个端口进行转发,同时某些端口有时可能不能访问。

在 Ubuntu 上使用 Docker 实现负载均衡,最稳妥且高效的方案是使用 Nginx。Nginx 的 upstream 模块专门用于分发流量,并且内置了基础的健康检查机制(当某个后端端口不可用时,它会自动重试其他端口并暂时剔除不可用节点)。

准备目录结构

bash 复制代码
mkdir nginx-lb && cd nginx-lb
touch docker-compose.yml
touch nginx.conf

配置 Nginx 负载均衡策略

bash 复制代码
events {
    worker_connections 2048;
}

http {
    client_max_body_size 100m;
    # 基础日志格式定义
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$upstream_addr" $request_time';

    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log warn;

    upstream vllm_servers {
        # 进阶点 1:最少连接算法。LLM 推理时间差异很大,
        # 将新请求发给当前正在处理请求最少的后端,比轮询更科学。
        least_conn;

        server 127.0.0.1:8001 max_fails=2 fail_timeout=30s;
        server 127.0.0.1:8002 max_fails=2 fail_timeout=30s;
        server 127.0.0.1:8003 max_fails=2 fail_timeout=30s;
        server 127.0.0.1:8004 max_fails=2 fail_timeout=30s;

        # 进阶点 2:保持与后端的长连接,减少 TCP 握手开销
        keepalive 32;
    }

    server {
        listen 9000;

        location / {
            proxy_pass http://vllm_servers;

            # 进阶点 3:禁用缓冲 (关键!)。
            # vLLM 通常使用流式输出 (Stream),开启缓冲会导致内容攒够了一大块才显示。
            proxy_buffering off;
            proxy_cache off;
            
            # 设置长连接头
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            # 超时控制:LLM 生成可能很慢,给够 10 分钟
            proxy_read_timeout 600s;
            proxy_connect_timeout 10s;

            # 容错:当其中一个端口返回错误或超时,自动切换到下一个
            proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
        }

        # 状态监控页面 (可选)
        # 访问 http://IP:9000/nginx_status 可以看到当前连接数
        location /nginx_status {
            stub_status on;
            allow 127.0.0.1; # 安全起见,只允许特定 IP 访问或干脆注释掉
            # allow 你的管理IP;
            # deny all;
        }
    }
}

配置docker-compose.yml

bash 复制代码
services:
  vllm-proxy:
    image: nginx:alpine  # 使用更轻量级的 alpine 版本
    container_name: vllm-load-balancer
    restart: unless-stopped
    ports:
      - "9000:9000"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./logs:/var/log/nginx
    networks:
      - vllm-net
    # 限制容器资源,防止 Nginx 在极端流量下影响主机
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M

networks:
  vllm-net:
    driver: bridge

启动

在 vllm-lb 目录下执行

bash 复制代码
docker-compose up -d

热重载

bash 复制代码
docker exec vllm-load-balancer nginx -s reload

查看状态

bash 复制代码
docker logs -f vllm-load-balancer

查看配置是否正确

bash 复制代码
docker exec vllm-load-balancer cat /etc/nginx/nginx.conf

关闭

bash 复制代码
docker-compose down
相关推荐
2601_9656196917 小时前
AI视频制作:财经数据可视化视频怎么做:AI 自动生成图表动画的实操流程
人工智能·nginx·音视频
2601_9656196917 小时前
历史解说视频怎么做:青铜器瓷器文物画面自动对齐的完整教程
运维·nginx·音视频
姜鱼问生1 天前
每次开机手动检查 6 样东西?我写了个 2 秒自检脚本
运维·网络·nginx·docker·容器
我不会起名字3222 天前
负载均衡选错:轮询在长连接下的偏斜问题
微服务·负载均衡·grpc·长连接
xixingzhe22 天前
Nginx 看懂请求耗时瓶颈
服务器·前端·nginx
北风toto2 天前
Windows 下用 OpenSSL 生成 SSL 密钥并配置 Nginx 教程
windows·nginx·ssl
。2 天前
【无标题】
linux·服务器·负载均衡·lvs
卜锦元3 天前
Docker Compose 部署 Nginx 1.30.6 完整指南
nginx·docker·容器
小小龙学IT3 天前
Nginx 开源 Web 服务器与反向代理深度解
前端·nginx·开源
果霸大叔3 天前
AI网关第8篇:AI 代理与负载均衡--多模型实例如何调度?
人工智能·算法·自然语言处理·负载均衡·ai-native