【问题标题】:Celery didn't operate well because of errno 104由于 errno 104,Celery 无法正常运行
【发布时间】:2014-12-24 19:09:09
【问题描述】:

我在 rabbitmq-server 上执行 celery 时遇到问题。我搜索并找到了a link,但这对我没有帮助。 我的环境是 ubuntu 14.04、python 2.7.6、celery 3.1.15、Django 1.7。 参考a link,我在本地安装了rabbitmq-server。我在 rabbitmq-server 中添加了用户、vhost 并设置了权限。

$ sudo rabbitmqctl add_user tonyg password
$ sudo rabbitmqctl add_vhost vir_host
$ sudo rabbitmqctl set_permissions -p vir_host tonyg ".*" ".*" ".*"

我的 celery 在 django 中的设置如下。

BROKER_URL = 'amqp://tonyg:password@localhost:5672//vir_host'
CELERY_RESULT_BACKEND = 'amqp://tonyg:password@localhost:5672//vir_host'
CELERY_ACCEPT_CONTENT = [u'application/x-python-serialize', u'image/jpeg', u'image/bmp', u'image/png', u'image/tiff']
CELERY_TIMEZONE = 'Asia/Tokyo'
CELERY_ENABLE_UTC = True
CELERY_IGNORE_RESULT = False

除了默认配置,我没有设置任何关于 rabbitmq-server 的内容。

我是这样切芹菜的。

$ celery -A MyProj worker -l info

-------------- celery@ip-172-31-3-10 v3.1.15 (Cipater)
---- **** ----- 
--- * ***  * -- Linux-3.13.0-36-generic-x86_64-with-Ubuntu-14.04-trusty
-- * - **** --- 
- ** ---------- [config]
- ** ---------- .> app:         MyProj:0x7f7453328b10
- ** ---------- .> transport:   amqp://tonyg:**@localhost:5672//vir_host
- ** ---------- .> results:     amqp://tonyg:password@localhost:5672//vir_host
- *** --- * --- .> concurrency: 1 (prefork)
-- ******* ---- 
--- ***** ----- [queues]
 -------------- .> celery           exchange=celery(direct) key=celery


[tasks]
  . MyProj.tasks. ......
  . MyProj.tasks. ......

[2014-10-29 15:07:50,241: ERROR/MainProcess] consumer: Cannot connect to amqp://tonyg:**@127.0.0.1:5672//vir_host: [Errno 104] Connection reset by peer.
Trying again in 2.00 seconds...

[2014-10-29 15:07:55,251: ERROR/MainProcess] consumer: Cannot connect to amqp://tonyg:**@127.0.0.1:5672//vir_host: [Errno 104] Connection reset by peer.
Trying again in 4.00 seconds...

当我使用默认访客标识符设置 celery 时,

BROKER_URL = 'amqp://guest:guest@localhost:5672//'
CELERY_RESULT_BACKEND = 'amqp://guest:guest@localhost:5672//'

它运行良好。我不知道为什么。有人可以帮我吗?谢谢。

【问题讨论】:

    标签: django rabbitmq celery


    【解决方案1】:

    运行rabbitmqctl list_vhosts。输出将是:

    Listing vhosts ...
    /
    vir_host
    ...done.
    

    因此 URL 必须是:

    amqp://tonyg:**@localhost:5672/vir_host
    

    【讨论】:

    • 网址正确。但是用户没有管理员权限通过虚拟主机进行连接。
    • @Krzysztof Szularz 非常感谢。我以为我已经尝试过 amqp://tonyg:**@localhost:5672/vir_host。但是,我又试了一次。它确实有效!我犯了一个愚蠢的错误。但是,我想知道为什么设置 (amqp://tonyg:**@localhost:5672/vir_host) 在 Mac OS X 中运行良好。无论如何,非常感谢。
    • 我不明白这个问题。 amqp://tonyg:**@localhost:5672/vir_host 运行良好,因为它是您创建的虚拟主机的有效 URL。带有两个斜杠的那个不是有效的,除非 vhost 被称为 /vir_host,但事实并非如此。
    • @Krzysztof Szularz 我输入了错误的网址。 5分钟后我无法修改评论。我在 Mac OS X 上设置了 BROKER_URL = 'amqp://tonyg:password@localhost:5672//vir_host',但它确实工作正常。你知道为什么吗?
    • @KrzysztofSzularz 我真诚地道歉。这是我的错误@BlueFrog 你的虚拟主机名可能是/vir_host 但不是vir_host
    【解决方案2】:

    感谢@Krzysztof Szularz 的回答。原来你的网址不正确。应该是

    BROKER_URL = 'amqp://tonyg:password@localhost:5672/vir_host'
    

    现在您正在通过 localhost 进行连接,并且工作正常。如果你想远程连接,它不会工作。您的帐户只是一个访客帐户,它没有管理员权限。因此,该用户只能通过 locahost 进行连接。如果您希望该用户从虚拟主机访问,您需要授予他执行此操作的权限。

    运行此命令以授予用户管理员权限。

    rabbitmqctl set_user_tags tonyg administrator
    

    您可以阅读more about this here。

    【讨论】:

    • @KrzysztofSzularz 忘记了他只通过本地主机连接。
    • 感谢您的回复:)
    猜你喜欢
    • 2022-08-16
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多