You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Docker Compose时Nginx基于URL Key的哈希负载均衡未生效

问题分析与解决方案

问题根源

你的Nginx配置中,upstream backend仅定义了单个server app:5000条目。虽然Docker Compose扩展的多个App实例会通过服务名app解析到多个IP,但默认情况下Nginx启动时只会一次性解析DNS记录,并将这些IP作为轮询节点处理,不会把它们纳入hash $arg_key consistent策略的计算范围——因为该策略需要明确感知上游的所有独立后端节点,静态解析方式无法适配Docker服务的动态实例变化。

修复步骤

1. 修改Nginx配置,支持动态DNS解析与节点更新

更新nginx.conf,添加Docker内置DNS解析器和上游节点共享内存区,让Nginx能动态感知App实例的变化并应用哈希路由:

events {}

http {
    # 使用Docker内置DNS服务器解析服务名,地址固定为127.0.0.11
    resolver 127.0.0.11 valid=30s;
    
    # 定义共享内存区,用于动态存储上游节点信息
    upstream backend {
        hash $arg_key consistent;
        zone backend 64k;
        server app:5000;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://backend;

            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}
  • resolver 127.0.0.11 valid=30s:指定Docker内置DNS,每30秒重新解析一次app服务的IP,确保Nginx能获取到新扩展的实例。
  • zone backend 64k:创建共享内存区存储上游节点数据,支持动态更新,让Nginx将app对应的多个IP视为独立后端节点,从而应用哈希路由策略。

2. 正确扩展App实例

使用Docker Compose的--scale参数启动3个App实例:

docker-compose up --scale app=3 -d

3. 验证配置效果

  • 重启Nginx容器,让新配置生效:
docker-compose restart nginx
  • 检查Nginx生效配置:
docker exec <nginx容器名> nginx -T
  • 在Flask应用中添加返回容器ID的接口(比如/get_instance_id),多次请求localhost/get?key=1,确认每次都路由到同一个实例。

内容的提问来源于stack exchange,提问作者Alfyn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 23:06:17