在 Centos 中使用 RabbitMQ 时出现 Django 和 Celery 错误“[Errno 111] Connection Refused”
Django and Celery error when using RabbitMQ in Centos "[Errno 111] Connection Refused"
我使用 Django 和 Celery 以及 RabbitMQ 作为消息代理。在 Windows 中开发时,我安装了 RabbitMQ 并在 Django 中配置了 Celery,如下所示:
celery.py
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'main.settings')
app = Celery('DjangoExample')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
init.py
from .celery import app as celery_app
__all__ = ['celery_app']
当 运行 Celery 在我的开发 Windows 机器中时,一切正常,任务正在按预期执行。
现在我正在尝试在 Centos7 机器中部署该应用程序。
我安装了 RabbitMQ 并使用以下命令尝试了 运行 Celery:
celery -A main worker -l INFO
但是我收到“连接被拒绝”错误:
[2021-02-24 17:39:58,221: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.
我的 settings.py 中没有 Celery 的任何特殊配置,因为它在没有它的情况下在 Windows 中工作正常。
您可以在此处找到 settings.py:
https://github.com/adrenaline681/DjangoExample/blob/master/main/settings.py
这里是celery报错的截图:
这是我的 RabbitMQ 服务器的状态,显示它当前已安装并且 运行。
这是 RabbitMQ 管理插件 Web 界面的图片,我们可以看到用于 amqp 的端口:
有谁知道为什么会这样?
如何让 Celery 在 Centos7 中与 RabbitMQ 一起正常工作?
非常感谢!
我遇到了类似的问题,SELinux 阻止了这两个进程之间的访问,我指的是 RabbitMQ 和 Python。要检查我的猜测,请暂时禁用 selinux 并检查它是否正常。如果没问题,那么您必须配置 selinux 以授予访问权限 Python 以连接 Rabbitmq。要暂时禁用 SELinux,您可以 运行 in shell
# setenforce 0
查看更多here about disabling SELinux either temporarily or permanently. But actually I would not recommend disabling SELinux. Actually it is better to configure SELinux to grant access. See more about SELinux here.
您说您正在 Windows 上开发,但您显示了一些看起来像 Linux 的输出。您使用的是 Docker 还是其他容器?
我不知道您使用的是 Docker 还是其他一些容器,但您可以根据您的设置调整我的建议。
如果您使用 docker,则需要将 Django 的 settings.py 配置为 docker 容器 运行 RabbitMQ 而不是 127.0.0.1。您为 settings.py 文件提供的 URL 不起作用,所以我看不到您的内容。
这是我的 CELERY_... 设置:
# Celery settings
CELERY_BROKER_URL = 'amqp://user:TheUserName@rabbitmq'
CELERY_RESULT_BACKEND = 'redis://redis:6379/'
我将其设置为我用于托管每个服务的 container_name 的名称,因为我的 docker-compose 文件包含这些:
services:
rabbitmq:
...
container_name: rabbitmq
redis:
...
container_name: redis
我使用 Django 和 Celery 以及 RabbitMQ 作为消息代理。在 Windows 中开发时,我安装了 RabbitMQ 并在 Django 中配置了 Celery,如下所示:
celery.py
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'main.settings')
app = Celery('DjangoExample')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
init.py
from .celery import app as celery_app
__all__ = ['celery_app']
当 运行 Celery 在我的开发 Windows 机器中时,一切正常,任务正在按预期执行。
现在我正在尝试在 Centos7 机器中部署该应用程序。 我安装了 RabbitMQ 并使用以下命令尝试了 运行 Celery:
celery -A main worker -l INFO
但是我收到“连接被拒绝”错误:
[2021-02-24 17:39:58,221: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.
我的 settings.py 中没有 Celery 的任何特殊配置,因为它在没有它的情况下在 Windows 中工作正常。
您可以在此处找到 settings.py: https://github.com/adrenaline681/DjangoExample/blob/master/main/settings.py
这里是celery报错的截图:
这是我的 RabbitMQ 服务器的状态,显示它当前已安装并且 运行。
这是 RabbitMQ 管理插件 Web 界面的图片,我们可以看到用于 amqp 的端口:
有谁知道为什么会这样? 如何让 Celery 在 Centos7 中与 RabbitMQ 一起正常工作?
非常感谢!
我遇到了类似的问题,SELinux 阻止了这两个进程之间的访问,我指的是 RabbitMQ 和 Python。要检查我的猜测,请暂时禁用 selinux 并检查它是否正常。如果没问题,那么您必须配置 selinux 以授予访问权限 Python 以连接 Rabbitmq。要暂时禁用 SELinux,您可以 运行 in shell
# setenforce 0
查看更多here about disabling SELinux either temporarily or permanently. But actually I would not recommend disabling SELinux. Actually it is better to configure SELinux to grant access. See more about SELinux here.
您说您正在 Windows 上开发,但您显示了一些看起来像 Linux 的输出。您使用的是 Docker 还是其他容器?
我不知道您使用的是 Docker 还是其他一些容器,但您可以根据您的设置调整我的建议。
如果您使用 docker,则需要将 Django 的 settings.py 配置为 docker 容器 运行 RabbitMQ 而不是 127.0.0.1。您为 settings.py 文件提供的 URL 不起作用,所以我看不到您的内容。
这是我的 CELERY_... 设置:
# Celery settings
CELERY_BROKER_URL = 'amqp://user:TheUserName@rabbitmq'
CELERY_RESULT_BACKEND = 'redis://redis:6379/'
我将其设置为我用于托管每个服务的 container_name 的名称,因为我的 docker-compose 文件包含这些:
services:
rabbitmq:
...
container_name: rabbitmq
redis:
...
container_name: redis