我在终端上运行ERROR/MainProcess] consumer: Cannot connect to amqp://ec2celeryuser
时不断获得:celery -A tasks worker
。
基本上我要做的就是让celery / rabbitmq在(2)ec2实例中正常工作。将tasks.py
中的愚蠢任务传递给rabbitmq。
目前运行RabbitMQ很好。如果我运行sudo rabbitmqctl status
,则输出:
Status of node 'rabbit@ip-xx-xxx-xxx-xx' ...
[{pid,786},
2。实例2 - 芹菜屋
我尝试使用终端中的以下内容在instance 2
上针对实例1运行芹菜:
芹菜 - 任务工作者
我有一个文件celeryconfig.py
:
BROKER_URL = 'amqp://ec2celeryuser:mypasshere@xx.xxx.xx.xx:5672/celeryserver1/'
#CELERY SETTINGS
CELERY_IMPORTS = ("tasks",)
CELERY_RESULT_BACKEND = "amqp"
我有一个文件client.py
:
from tasks import add
result = add.delay(4, 4) # call task
result_sum = result.get(timeout=5) # wait to get result for a maximum of 5 seconds
我有一个文件tasks.py
:
from celery import Celery
app = Celery('tasks', broker='amqp://ec2celeryuser:mypasshere@xx.xxx.xx.xx:5672/celeryserver1/')
@app.task
def add(x, y):
return x + y
我已正确设置vhost
,用户ec2celeryuser
,并授予此用户以下权限:
sudo rabbitmqctl set_permissions -p /celeryserver1 ec2celeryuser ".*" ".*" ".*"
如果我在RabbitMQ上执行:sudo rabbitmqctl list_users
(实例1),则显示:
ec2celeryuser []
guest [administrator
我已经尝试了两个用户名和密码,但没有变化。
我一直关注Celery Guide,而tutorial没有太多运气。
我在这里做错了什么?显然存在连接问题,但我做错了什么?
谢谢!
答案 0 :(得分:3)
感谢用户natdempk
帮助我修复队列的配置语法。
问题是在rabbitmq中创建vhost
,如:
sudo rabbitmqctl add_vhost /celeryserver1
应该是什么时候:
sudo rabbitmqctl add_vhost celeryserver1
然后,我必须重置用户ec2celeryuser
的权限,如:
sudo rabbitmqctl set_permissions -p celeryserver1 ec2celeryuser ".*" ".*" ".*"
我意识到这一点的方式是:我访问了/var/log/rabbitmq/<last log file.log>
并且看到了:
=INFO REPORT==== 30-Apr-2014::12:45:58 ===
accepted TCP connection on [::]:5672 from xx.xxx.xxx.xxx:45964
=INFO REPORT==== 30-Apr-2014::12:45:58 ===
starting TCP connection <x.xxx.x> from from xx.xxx.xxx.xxx:45964
=ERROR REPORT==== 30-Apr-2014::12:46:01 ===
exception on TCP connection <x.xxx.x> from from xx.xxx.xxx.xxx:45964
{channel0_error,opening,
{amqp_error,access_refused,
"access to vhost 'celeryserver1/' refused for user 'ec2celeryuser'",
'connection.open'}}
自从修复虚拟主机以来,我现在很高兴看到:
[2014-04-30 13:08:10,101: WARNING/MainProcess] celery@ip-xx-xxx-xx-xxx ready.
答案 1 :(得分:1)
所以我在这里看到了一些错误。首先,tasks.py
中RabbitMQ的代理网址似乎不正确。它应该如下所示。
app = Celery('tasks', broker='amqp://ec2celeryuser:ec2celerypassword@xx.xxx.xx.xx/celeryserver1/')
此外,您可能希望在运行工作进程时指定希望芹菜提供的应用程序。您可以通过从celery -A tasks worker
目录中运行tasks.py
来执行此操作。
另一件事是client.py
中的代码调用您的任务似乎不正确。从芹菜文档中,您可以按如下方式调用该任务:
from tasks import add
result = add.delay(4, 4) # call task
result_sum = result.get(timeout=5) # wait to get result for a maximum of 5 seconds
修复这些问题可能会解决您的问题,或者至少可以让您更接近。