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

Digital Ocean上Django集成Celery发送邮件超时问题求助

Django + Celery 调用delay()超时问题排查方案

核心问题定位

你的情况是Django视图调用delay()时请求超时,但Django Shell用私有IP调用delay()正常,结合部署架构(Digital Ocean应用平台 + 独立Droplet的Redis/Celery),问题大概率出在网络连通性配置或环境变量不一致上。

分步排查与解决

1. 确认Redis的网络绑定配置

默认Redis仅绑定127.0.0.1,只能本地访问,必须修改为允许Droplet外部(DO应用平台)访问:

  • 编辑Redis配置文件(通常路径为/etc/redis/redis.conf):
    • 将bind 127.0.0.1 ::1改为bind 0.0.0.0(允许所有IP访问),或绑定Droplet的私有IP
    • 若已设置Redis密码,可保留protected-mode yes;未设置密码则改为protected-mode no
  • 重启Redis服务:sudo systemctl restart redis-server

2. 验证DO应用平台到Droplet的端口连通性

DO应用平台的出站流量需要能访问Droplet的6379端口:

  • 在Droplet的防火墙(ufw)中开放6379端口给DO应用平台的IP段:
    sudo ufw allow from <DO应用平台IP/段> to any port 6379
    
    (若不清楚应用平台IP,可临时开放所有IP测试:sudo ufw allow 6379,验证通过后再限制访问范围)
  • 在应用平台的运行环境中测试连通性:
    nc -zv <Droplet私有IP> 6379
    
    输出succeeded!则连通正常,否则需检查防火墙规则或DO的网络策略。

3. 确保Django部署环境的Celery配置正确

Shell中能运行但视图不行,大概率是部署环境的settings配置与本地不一致:

  • 检查应用平台部署时的CELERY_BROKER_URL和CELERY_RESULT_BACKEND是否使用了Droplet的私有IP(公网IP可能在应用平台内无法访问,或被防火墙拦截)
  • 避免硬编码敏感信息,建议用环境变量传递Redis地址和密码:
    # settings.py
    import os
    CELERY_BROKER_URL = os.getenv('CELERY_BROKER_URL', 'redis://localhost:6379')
    CELERY_RESULT_BACKEND = os.getenv('CELERY_RESULT_BACKEND', 'redis://localhost:6379')
    
    然后在DO应用平台的环境变量中配置正确的私有IP地址。

4. 检查Celery Worker的连接状态

启动Worker时查看日志,确认是否成功连接Redis:

  • 启动Worker命令:celery -A Whurthy worker -l info
  • 日志中出现Connected to redis://<IP>:6379/0则连接正常;若出现Connection refused或超时错误,检查Redis配置、密码、端口是否正确。

5. 排除任务队列堆积问题

若Redis队列有堆积或Worker未正常消费,也可能导致Django请求超时:

  • 在Redis中查看任务队列:redis-cli KEYS "celery*",若存在celery队列,用LLEN celery查看队列长度;若长度持续增加,说明Worker未消费任务,检查Worker是否启动、是否有权限访问Redis。

额外建议

  • 生产环境不要开放Redis公网端口,仅允许DO应用平台的私有IP段访问,同时设置强密码
  • 给Celery任务添加超时时间,避免任务长时间占用资源
  • 用celery -A Whurthy inspect ping检查Worker是否在线

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:55:17