重装Ubuntu后Django Celery连接Redis报域名解析临时失败错误
Django+Celery连接Redis报域名解析故障排查方案
故障现象
运行Django项目时触发如下报错:
redis.exceptions.ConnectionError: Error -3 connecting to redis:6379. Temporary failure in name resolution
已知前置状态:
- 服务器
redis.service处于active运行状态,redis-cli可正常连接操作本地Redis - 故障在重装Ubuntu系统后出现,重装前同项目可正常运行
- 初步定位报错触发点为Celery尝试访问
redis:6379环节 - 项目代码中内置的Redis相关配置如下:
CELERY_RESULT_BACKEND = os.environ.get('REDISCLOUD_URL', 'redis://localhost:6379/0') CACHEOPS_REDIS = os.environ.get('CACHEOPS_REDIS', 'redis://localhost:6379/9') CACHES = { 'default': { 'BACKEND': 'redis_lock.django_cache.RedisCache', 'LOCATION': 'redis://127.0.0.1:6379/', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'DB': 3, } } }
根因判断
报错中实际连接的主机名是redis,和代码默认配置里的localhost/127.0.0.1不符,核心原因是高优先级的环境变量覆盖了代码默认配置:
代码中Celery、CACHEOPS的Redis地址优先读取系统环境变量,重装系统后如果导入了旧的环境变量配置(来自shell配置文件、systemd服务参数、项目env文件、Docker残留配置等),把Redis地址设置为redis://redis:6379/xxx格式,本地/etc/hosts又没有redis主机名对应的解析规则,就会触发域名解析失败错误。
排查步骤
- 进入项目运行对应的用户环境,打印相关环境变量确认是否存在错误配置:
echo $REDISCLOUD_URL echo $CACHEOPS_REDIS
- 全局扫描系统配置文件,定位错误地址来源:
sudo grep -r "redis://redis:6379" /etc/ /home/
- 若使用systemd管理Celery进程,检查对应服务文件的
Environment配置段是否存在错误Redis地址 - 检查本地
/etc/hosts文件,确认本地回环映射配置正常:
cat /etc/hosts # 正常配置必须包含以下两行 # 127.0.0.1 localhost # ::1 localhost
解决方法
- 清除错误环境变量:
- 临时环境变量问题:执行
unset REDISCLOUD_URL CACHEOPS_REDIS后重启项目即可 - 配置文件持久化的错误变量:找到
~/.bashrc、~/.profile、/etc/environment、项目.env文件中对应的错误配置行删除,执行source对应文件生效 - systemd服务配置错误:修改服务文件后执行
sudo systemctl daemon-reload,再重启相关服务
- 临时环境变量问题:执行
- 若业务配置必须使用
redis作为主机名访问本地Redis,直接在/etc/hosts中添加解析映射:
127.0.0.1 redis
- 测试环境可直接修改代码配置,跳过环境变量读取逻辑,硬编码为本地可访问地址,彻底避免覆盖问题:
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0' CACHEOPS_REDIS = 'redis://127.0.0.1:6379/9'
- 所有配置修改完成后,重启Celery进程、Django服务,验证连接状态即可。
内容的提问来源于stack exchange,提问作者z.abduev
相关产品推荐
相关产品推荐

