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

Docker+Flask+Gunicorn+Redis服务登录触发OSError[Errno99]求助

排查Docker+Flask+Redis连接OSError: [Errno 99]的解决方案

针对你遇到的登录时触发Redis连接OSError问题,结合你的服务架构和已做的排查动作,我从Docker网络、配置有效性、连接逻辑等维度整理了针对性的排查和解决步骤:

核心错误分析

OSError: [Errno 99] Cannot assign requested address 在Redis连接场景下,本质是Flask服务无法建立到Redis实例的网络连接,而非本地端口绑定问题。虽然你提到有其他服务能正常连接同一Redis,但你的Flask服务所在的容器环境可能存在特殊的网络或配置差异。


1. 优先验证Docker网络连通性

你的docker-compose使用了外部网络common_net,这是最可能的问题点:

  • 进入backend容器执行网络测试:
    docker exec -it dw-backend-v2 bash
    # 测试Redis服务名解析
    ping redis
    # 测试端口连通性
    nc -zv redis 6379
    
  • 如果上述命令失败,说明Redis容器不在common_net网络中:
    1. 先确认Redis容器的网络归属:
      docker inspect YOUR_REDIS_CONTAINER_NAME | grep Networks
      
    2. 将Redis容器加入common_net:
      docker network connect common_net YOUR_REDIS_CONTAINER_NAME
      

2. 检查Flask服务的Redis连接配置有效性

确保你的代码正确读取了环境变量,而非硬编码错误地址:

  • 先在backend容器内确认环境变量是否正确加载:
    echo $RD_HOST $RD_PORT $RD_DB
    
  • 检查你的Redis连接代码,确保完全使用环境变量而非默认值(比如localhost),示例正确逻辑:
    import redis
    from os import getenv
    
    def init_redis():
        try:
            return redis.Redis(
                host=getenv("RD_HOST"),
                port=int(getenv("RD_PORT")),
                db=int(getenv("RD_DB")),
                password=getenv("RD_PWD", None),
                max_connections=int(getenv("RD_POOL_SIZE")),
                socket_connect_timeout=5  # 增加超时,避免无限等待
            )
        except Exception as e:
            print(f"Redis初始化失败: {str(e)}")
            raise
    

3. 排查Redis服务的绑定限制

如果Redis配置了仅本地绑定,会拒绝容器的远程连接:

  • 进入Redis容器,检查redis.conf中的bind参数:
    grep "bind" /path/to/redis.conf
    
  • 如果值为127.0.0.1,修改为0.0.0.0(允许所有IP访问),然后重启Redis服务。

4. 排除连接池与Gunicorn Worker的冲突

如果Gunicorn启动了过多Worker,每个Worker独立创建连接池,可能出现异常(虽然Errno99不是连接池满的典型错误,但可以排查):

  • 进入Redis服务,查看当前连接数:
    INFO clients
    
  • 调整Gunicorn的Worker数量(比如--workers=4),或减小Redis连接池大小,避免超出Redis的maxclients限制(默认10000)。

5. 补充:添加连接重试机制

即使网络正常,偶尔的连接波动也可能触发错误,在代码中加入重试逻辑增强稳定性:

from redis import Redis, ConnectionError
import time

def get_redis_client():
    retries = 3
    while retries > 0:
        try:
            return Redis(
                host=getenv("RD_HOST"),
                port=int(getenv("RD_PORT")),
                socket_connect_timeout=3
            )
        except ConnectionError:
            retries -= 1
            time.sleep(1)
    raise ConnectionError("无法连接到Redis服务,请检查网络配置")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:55:16