Flask+Celery报错kombu.exceptions.OperationalError:连接被拒绝求助
Flask集成Celery异步任务连接拒绝问题排查与解决
核心原因分析
报错kombu.exceptions.OperationalError: [Errno 111] Connection refused本质是Celery无法连接到配置的Redis Broker,常见原因包括Redis未运行、连接配置错误、Celery Worker未启动等。
分步排查与修复
1. 确认Redis服务状态
- 执行命令
redis-cli ping,若返回PONG则Redis正常运行;若报错,需启动Redis服务:- Ubuntu/Debian:
sudo systemctl start redis-server - Windows:直接运行Redis安装目录下的
redis-server.exe
- Ubuntu/Debian:
2. 验证Redis连接配置
- 检查
celery_config.py中的broker_url和result_backend:- 确认端口
6379是Redis实际监听端口(可通过redis-cli CONFIG GET port查看) - 若Redis设置了密码,需在URL中添加认证信息:
redis://:your_password@localhost:6379/1 - WSL环境注意:若Redis在Windows主机运行,需将
localhost替换为Windows主机的IP地址(如192.168.x.x)
- 确认端口
3. 正确启动Celery Worker
- 在项目根目录执行启动命令,确保指向正确的Celery实例:
celery -A app.celery_app worker --loglevel=infoapp.celery_app对应app.py中初始化的Celery对象- 观察启动日志,确认是否输出
Connected to redis://localhost:6379/1类的成功连接信息
4. 修复任务与Celery App的关联
- 当前
backend_jobs.py中的@shared_task可能未关联到正确的Celery App,导致任务使用默认配置无法连接Broker。修改方式:
或者在# backend_jobs.py from application.worker import celery_init_app from flask import current_app celery_app = celery_init_app(current_app) @celery_app.task(ignore_result=False) def say_hello(): return "Hello world"app.py中确保Celery App实例被导入到任务模块的上下文环境中。
5. 检查端口占用与防火墙
- 确认6379端口未被其他程序占用:
- Linux:
netstat -tuln | grep 6379 - Windows:
netstat -ano | findstr :6379
- Linux:
- 若有防火墙规则,确保允许本地或跨网络的Redis端口连接。
验证修复
启动Flask应用和Celery Worker后,访问/test_route,若返回包含task_id的JSON响应,且Celery Worker日志中显示任务被接收执行,则问题解决。
内容的提问来源于stack exchange,提问作者Subhrajit Samanta
相关产品推荐
相关产品推荐

