celery + redis 无法连接到 amqp://guest:**@127.0.0.1:5672//: [Errno 111] 连接被拒绝

Posted

技术标签:

【中文标题】celery + redis 无法连接到 amqp://guest:**@127.0.0.1:5672//: [Errno 111] 连接被拒绝【英文标题】:celery + redis Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused 【发布时间】:2020-06-07 14:43:29 【问题描述】:

我无法运行 celery worker + redis + django。如果我运行这个命令来检查 celery worker 是否准备好接收任务:

celery -A car_rental worker -l info

我收到了这个错误:

[2020-02-24 00:14:42,188: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.
Trying again in 2.00 seconds...

在我的 settings.py 我有这个:

BROKER_URL = 'redis://localhost:6379'

requirements.txt:

amqp==2.5.2, asgiref==3.2.3, billiard==3.6.2.0, celery==4.4.0, redis==3.4.1

celery.py:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'car_rental.settings')

app = Celery('car_rental')

app.config_from_object('django.conf:settings', namespace='CELERY')

app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: 0!r'.format(self.request))

car_rental/init.py:

from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

__all__ = ('celery_app',)

而我的项目结构是这样的:

 car_rental
           /car_rental
               __init__.py
               celery.py
               setting.py

我不明白的是我在broker_url = 'redis://localhost:6379' 中使用,但在错误中我有:Cannot connect to amqp://guest:**@127.0.0.1:5672//

【问题讨论】:

Celery 将忽略参数broker_url,因为 Celery 只会查找以 CELERY_ 开头的参数,我认为默认情况下 Celery 会尝试连接到 rabbitmq 服务器;这就是为什么我收到错误Cannot connect to amqp://guest:**@127.0.0.1:5672// 【参考方案1】:

我完全按照 Dantheman91 的说明配置了 celery,但我仍然面临同样的问题。

我的项目中没有使用 settings.py,而是在名为 settings 的模块中使用 base.py、development.py、production.py 和 test.py。

所以,如果有人在这些角色/实例之间切换,不要忘记在 celery.py 中进行更改。

在类似的情况下,使用:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj_name.settings.development')

它应该和你在项目的 manage.py 中使用的一样。

【讨论】:

这解决了我的问题。【参考方案2】:

在这种情况下,如果您将参数从 BROKER_URL 更改为 CELERY_BROKER_URL,它应该可以工作。当你在这里给它命名空间时:

app.config_from_object('django.conf:settings', namespace='CELERY')

此时您需要将 BROKER_URL 参数重命名为 CELERY_BROKER_URL。

CELERY_BROKER_URL = 'redis://localhost:6379'

另一个例子:

app.config_from_object('django.conf:settings', namespace='CAR')
CAR_BROKER_URL = 'redis://localhost:6379'

【讨论】:

以上是关于celery + redis 无法连接到 amqp://guest:**@127.0.0.1:5672//: [Errno 111] 连接被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

Celery sqs 尝试连接到 amqp:无法连接到 amqp://guest:**@127.0.0.1:5672//

创建第一个 Celery 任务 - Django。错误 - “错误/MainProcess] 消费者:无法连接到 amqp://guest:**@127.0.0.1:5672//:”

芹菜工人无法连接到 docker 实例上的 redis

Django无法连接到docker中的redis

Celery 无法连接到 RabbitMQ 服务器

芹菜不起作用:无法连接到 amqp://guest:**@127.0.0.1:5672//