如何将Celery配置为使用55672端口而非15672?(Celery 3.1与RabbitMQ 2.7:[Errno 111] 连接被拒绝)

0 投票
1 回答
4912 浏览
提问于 2025-04-18 15:47

在不更改软件版本的情况下,如何配置Celery 3.1使用端口55672来访问RabbitMQ,而不是默认的15672?

情况

RabbitMQ的2.*版本使用端口55672来进行管理插件的访问,但Kombu 3.0默认使用端口15672来访问这个管理插件。(RabbitMQ的3.*版本使用的是15672端口。)

证据

当使用celery命令行工具时,出现了[Errno 111] 连接被拒绝的错误。

<!-- language: bash -->
$ celery list bindings
Traceback (most recent call last):
...snip...
pyrabbit.http.NetworkError: Error: <class 'socket.error'> 

Python调试器显示celery试图连接到错误的端口:15672。这是RabbitMQ 3.0及以上版本管理插件的端口。

(demo-celery-flask) $ python -m pdb ~/.virtualenvs/demo-celery-flask/bin/celery list bindings
> /home/zeb/.virtualenvs/demo-celery-flask/bin/celery(4)<module>()
-> import re
(Pdb) continue
Traceback (most recent call last):
    ...snip content...
NetworkError: Error: <class 'socket.error'> [Errno 111] Connection refused
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> /home/zeb/.virtualenvs/demo-celery-flask/local/lib/python2.7/site-packages/pyrabbit/http.py(104)do_call()
-> raise NetworkError("Error: %s %s" % (type(out), out))
(Pdb) list 95,104
95             try:
96                 resp, content = self.client.request(url,
97                                                     reqtype,
98                                                     body,
99                                                     headers)
...snip content...
102             except Exception as out:
103                 # net-related exception types from httplib2 are unpredictable.
104  ->             raise NetworkError("Error: %s %s" % (type(out), out))
(Pdb) print url
'http://127.0.0.1:15672/api/bindings'

字符串'15672'在kombu的代码中作为一个叫做manager_port的参数的默认值出现。

(demo-celery-flask)~/.virtualenvs/demo-celery-flask/lib/python2.7/site-packages$ rgrep 15672 celery/*
(demo-celery-flask)~/.virtualenvs/demo-celery-flask/lib/python2.7/site-packages$ rgrep 15672 kombu/*
...snip content...
kombu/utils/amq_manager.py:    port = port if port is not None else opt('manager_port', 15672)

搜索site:docs.celeryproject.org manager_port显示它是kombu.Connection对象的一部分。在网站搜索中没有找到1567255672

celery的配置文档中没有提到manager这个内容。(Celery v3.1,2014-08-02)

版本

  • Ubuntu 12.04(是的,它应该是14.04)
  • Celery 3.1(Cipater)
  • Kombu 3.0.12
  • RabbitMQ 2.7.1

RabbitMQ的管理插件已启用,并可以通过rabbitmqadmin命令行在端口55672访问。

1 个回答

0

在celery配置模块中添加 BROKER_TRANSPORT_OPTIONS = {"manager_port": 55672}


找到这个信息的过程包括以下几个步骤:

  • 查看 kombu/util/amq_manager.py 文件,发现15672是通过 opt('manager_port', 15672) 显示的。
  • 注意到opt是从 opt = client.transport_options.get 这个地方来的。
  • 在网上搜索 site:docs.celeryproject.org transport_options
  • 在redis传输文档中找到 BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600}
  • 进行猜测和验证,使用 BROKER_TRANSPORT_OPTIONS = {"manager_port": 55672}

撰写回答