在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
相关产品推荐
相关产品推荐

