You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

远程向Ubuntu服务器的Celery应用发送任务失败,求助解决

问题排查与解决方案

1. 先修正Celery配置的拼写错误

你代码里的brocker是笔误,正确参数名是broker——这个错误会直接导致Celery无法正确连接消息队列,先把两处代码里的brocker改成broker:

服务器端的tasks.py:

from celery import Celery

app = Celery(
    'tasks',
    broker='pyamqp://<username>:<password>@localhost//',
    backend='rpc://',
)

@app.task
def add(x, y):
    return x + y

本地笔记本的调用代码:

from celery import Celery

app = Celery(
    'tasks',
    broker='pyamqp://<username>:<password>@192.168.1.9//',
    backend='rpc://',
)

# 必须用完整的任务名'tasks.add'
result = app.send_task('tasks.add', (2,2))
# 可以加超时获取结果来验证
print(result.get(timeout=10))

2. 确保Docker RabbitMQ的端口映射到宿主机

Docker运行的RabbitMQ默认不会对外暴露端口,外部设备无法访问。启动容器时必须映射AMQP的5672端口(如果需要管理界面也可以映射15672):

新启动容器命令:

docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management

如果已有运行的容器,先停止删除再重新启动(或者用docker commit保存状态后再映射)。

验证端口连通性:在本地笔记本执行nc -zv 192.168.1.9 5672,能连通说明端口映射生效。

3. 给RabbitMQ用户配置远程访问权限

默认情况下RabbitMQ的用户(比如guest)仅允许localhost访问,需要给你的用户设置全局权限:

  1. 进入RabbitMQ容器:
docker exec -it rabbitmq bash
  1. 执行权限配置命令(替换<username>为你的实际用户名):
rabbitmqctl set_permissions -p / <username> ".*" ".*" ".*"
rabbitmqctl set_user_tags <username> administrator

或者通过管理界面(http://192.168.1.9:15672)操作:登录后进入Admin→Users,编辑目标用户,将Permissions的Configure/Write/Read都设为.*,并确保用户有权限访问/虚拟主机。

4. 放开Ubuntu Server的防火墙端口

Ubuntu默认用ufw防火墙,需要允许5672端口的TCP流量:

sudo ufw allow 5672/tcp
sudo ufw reload

执行sudo ufw status确认规则已生效。

5. 验证RPC后端(可选)

如果用rpc://后端仍有问题,可以临时换成文件或Redis后端测试,比如:

# 服务器和本地的Celery配置都改后端
backend='db+sqlite:///celery_results.db'

排除RPC本身的连接问题。

最终验证步骤

  1. 重启RabbitMQ容器:docker restart rabbitmq
  2. 重启服务器上的Celery Worker:celery -A tasks worker --loglevel=INFO -c 2 -E
  3. 在本地笔记本重新运行任务发送代码,若能返回4则说明远程调用成功。

内容的提问来源于stack exchange,提问作者Romn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 12:40:21