Django Celery 无法连接到 EC2 上的远程 RabbitMQ

Django Celery cannot connect to remote RabbitMQ on EC2

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

每当我用命令启动芹菜时:

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'}}

文件 /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

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

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

<ip_of_ec2_instance> 必须是 EC2 使用的内部 IP。不是用于 ssh 进入实例的 public 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 提供的初步故障排除帮助。

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

我在 ec2 上有 flask app 运行,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 服务器上