【问题标题】:Django Celery cannot connect to remote RabbitMQ on EC2Django Celery 无法连接到 EC2 上的远程 RabbitMQ
【发布时间】:2015-05-19 09:04:34
【问题描述】:

我在 EC2 上的两个实例上创建了一个 rabbitmq 集群。我的 django 应用程序将 celery 用于异步任务,而后者又将 RabbitMQ 用于消息队列。

每当我用命令启动 celery 时:

python manage.py celery worker --loglevel=INFO

python manage.py celeryd --loglevel=INFO  

我不断收到以下与远程 RabbitMQ 相关的错误消息:

[2015-05-19 08:58:47,307: ERROR/MainProcess] consumer: Cannot connect to amqp://myuser:**@<ip-address>:25672/myvhost/: Socket closed.
Trying again in 2.00 seconds...

我使用以下方式设置权限:

sudo rabbitmqctl set_permissions -p myvhost myuser ".*" ".*" ".*"

然后在两个集群节点上重新启动 rabbitmq-server。然而,它没有帮助。

在日志文件中,我看到如下几个条目:

=INFO REPORT==== 19-May-2015::08:14:41 ===
accepting AMQP connection <0.1981.0> (<ip-address>:38471 -> <ip-address>:5672)

=ERROR REPORT==== 19-May-2015::08:14:44 ===
closing AMQP connection <0.1981.0> (<ip-address>:38471 -> <ip-address>:5672):
{handshake_error,opening,0,
                 {amqp_error,access_refused,
                             "access to vhost 'myvhost' refused for user 'myuser'",
                             'connection.open'}}

【问题讨论】:

  • python worker 和 RabbitMQ 是不同的实例吗?
  • 是的。 Celery worker 在我的笔记本电脑上,而 rabbitmq 在 EC2 上
  • 好的,问题是您的实例位于 EC2 的防火墙后面,它不接受来自外部的请求。
  • 但在安全组中,我将端口 5672、4369 和 25672 保持打开状态。
  • 你是不是把RabbitMQ的配置改成在localhost外监听了?

标签: django amazon-ec2 rabbitmq celery


【解决方案1】:

文件/usr/local/etc/rabbitmq/rabbitmq-env.conf 包含NODE_IP_ADDRESS 的条目,以将其仅绑定到本地主机。从配置中删除NODE_IP_ADDRESS 条目会将端口绑定到所有network inferfaces

来源:https://superuser.com/questions/464311/open-port-5672-tcp-for-access-to-rabbitmq-on-mac

【讨论】:

  • /usr/local/etc下没有这个目录。
  • 我写的路径是在Mac里。我猜你那时使用Linux。请您检查一下是否在/usr/local/rabbitmq 中?
  • 那里也看不到。在我的 Ubuntu 14.04 系统上 rabbitmq-env.conf 的手册页显示路径是 /etc/rabbitmq/rabbitmq-env.conf。该文件不存在,所以我想我将创建一个新文件。
  • 在配置文件中添加了 NODE_IP_ADDRESS=0.0.0.0 条目。还是不行。
  • 我现在没有Linux机器来测试它,抱歉。我发现在 Ubuntu 中默认文件在 /etc/default/rabbitmq-server
【解决方案2】:

原来我没有创建合适的配置文件。就我而言(Ubuntu 14.04),我必须创建以下两个配置文件:

$ cat /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_NODE_IP_ADDRESS=<ip_of_ec2_instance>

&lt;ip_of_ec2_instance&gt; 必须是 EC2 使用的内部 IP。不是用于 ssh 进入实例的公共 IP。可以使用ip a命令获取。

$ cat /etc/rabbitmq/rabbitmq.config
[
    {mnesia, [{dump_log_write_threshold, 1000}]},
    {rabbit, [{tcp_listeners, [25672]}]},
    {rabbit, [{loopback_users, []}]}
].

我认为{rabbit, [{tcp_listeners, [25672]}]}, 行是我遗漏的最重要的配置之一。

感谢 @dgil 提供最初的故障排除帮助。

【讨论】:

    【解决方案3】:

    问题已得到解答。但是如果其他人发现它有用的话,只需留下我遇到的类似问题的笔记

    我有一个 flask appec2 上运行,amqp as a broker on port 5672ec2 elasticcache memcached as a backend。 amqp 经纪人在处理被解雇的任务时遇到了麻烦 - 所以我通过修复来解决它

    假设您安装了rabbitmq-server (sudo apt-get install rabbitmq-server),添加用户并设置属性

    sudo add_user username password
    set_permissions username ".*" ".*" ".*"
    

    重启服务器:sudo service rabbitmq-server restart

    在你的烧瓶应用中进行 celery 配置

    broker_url=amqp://username:password@localhost:5672// (Set as above)
    backend=cache+memcached://(ec2 cache url):11211/ 
    

    (cache+memcached:// 把我绊倒了——没有它我一直收到导入错误(无法导入模块)

    在安全组中的 ec2 实例上打开端口 5672。

    现在,如果您启动 celery worker,它应该会拾取被启动的任务并将结果存储在您的 memcached 服务器上

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 2018-12-27
      • 2014-04-03
      • 2015-10-31
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      相关资源
      最近更新 更多