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

在EC2上部署Python Celery Worker遇111连接拒绝错误求助

问题描述

技术栈:Python、Django、AWS、AWS RabbitMQ、Celery

我司网站已部署在EC2实例上且运行正常,启动Celery Worker时持续出现111: Connection refused错误。已确认Celery和RabbitMQ服务均处于运行状态,所有资源已配置在正确的VPC和安全组中,推测是配置问题。

相关配置文件如下:

settings.py

CELERY_BROKER_URL = 'amqps://<username>:<password>@<awspath>.mq.us-west-2.amazonaws.com:5671'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_TASK_DEFAULT_QUEUE = env("CELERY_TASK_DEFAULT_QUEUE", default="default")
CELERY_BROKER_TRANSPORT_OPTIONS = {
   "region": env("AWS_REGION", default="us-west-2"),
}
CELERY_RESULT_BACKEND = None

Procfile

celery: celery -A bsw_site worker -l INFO

init.py

from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

__all__ = ('celery_app',)

错误日志(注:该日志为Nginx相关,与Celery问题无直接关联,需补充Celery自身启动日志)

2022/10/20 20:57:13 [error] 4189#4189: *35 connect() failed (111: Connection refused) while connecting to upstream, client: 10.176.11.163, server: , request: "GET /favicon.ico HTTP/1.1", upstream: "http://127.0.0.1:8000/favicon.ico", host: "<company_website_link>", referrer: "<company_website_link>"

nginx_conf.conf

user                    nginx;
error_log               /var/log/nginx/error.log warn;
pid                     /var/run/nginx.pid;
worker_processes        auto;
worker_rlimit_nofile    200000;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    fastcgi_read_timeout 7200;
    proxy_read_timeout 7200;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    include       conf.d/*.conf;

    map $http_upgrade $connection_upgrade {
        default     "upgrade";
    }

    server {
        listen        80 default_server;
        access_log    /var/log/nginx/access.log main;

        client_header_timeout 60;
        client_body_timeout   60;
        client_max_body_size  50M;
        keepalive_timeout     60;
        gzip                  off;
        gzip_comp_level       4;
        gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        # Include the Elastic Beanstalk generated locations
        include conf.d/elasticbeanstalk/*.conf;
    }
}

排查与解决方案

1. 优先获取Celery自身启动日志

当前提供的错误日志是Nginx连接Django后端的报错,和Celery Worker启动失败无关。需执行Celery启动命令并捕获完整日志,比如:

celery -A bsw_site worker -l DEBUG

从Celery日志中可直接看到连接RabbitMQ的具体错误信息,是定位问题的核心依据。

2. 验证RabbitMQ连接参数与网络连通性

  • 确认<username>/<password>是AWS RabbitMQ控制台创建的独立RabbitMQ用户凭证,而非AWS IAM密钥。
  • 在EC2实例上测试RabbitMQ端点连通性:
    # 测试AMQPS端口连通
    openssl s_client -connect <awspath>.mq.us-west-2.amazonaws.com:5671
    
    若连接失败,重新检查安全组配置:
    • RabbitMQ实例安全组需允许EC2所在安全组的**5671端口(AMQPS)**入站流量
    • EC2实例安全组需允许5671端口的出站流量
    • 确认EC2与RabbitMQ在同一VPC,或已通过VPC peering/中转网关连通

3. 修正Celery Broker的SSL配置

AWS RabbitMQ的AMQPS连接需明确SSL参数,补充配置如下:

# settings.py顶部导入ssl模块
import ssl

CELERY_BROKER_URL = 'amqps://<username>:<password>@<awspath>.mq.us-west-2.amazonaws.com:5671'
CELERY_BROKER_TRANSPORT_OPTIONS = {
    "region": env("AWS_REGION", default="us-west-2"),
    'ssl': {
        'cert_reqs': ssl.CERT_NONE  # 若需严格证书验证,可替换为ssl.CERT_REQUIRED并配置CA证书
    }
}

4. 验证Celery应用结构与队列配置

  • 确认celery -A bsw_site中的bsw_site是Django项目根模块,且该模块下存在celery.py文件,示例结构:
    # celery.py
    import os
    from celery import Celery
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bsw_site.settings')
    app = Celery('bsw_site')
    app.config_from_object('django.conf:settings', namespace='CELERY')
    app.autodiscover_tasks()
    
  • 检查CELERY_TASK_DEFAULT_QUEUE指定的队列已在AWS RabbitMQ控制台创建,未创建队列会导致连接失败。

5. 排除环境变量加载问题

临时在settings.py中硬编码CELERY_TASK_DEFAULT_QUEUE和AWS_REGION的值,测试是否因环境变量未正确加载导致配置失效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:50:27