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

部署apscheduler到生产环境出现WebSocket 502 Bad Gateway握手错误如何解决

解决方案

1. 替换为支持ASGI的应用服务器

Gunicorn 默认仅支持WSGI协议,无法处理Channels需要的ASGI请求,这是WebSocket握手502的核心原因,本地Django自带runserver默认支持ASGI所以运行正常。推荐使用Gunicorn+UvicornWorker的组合,兼顾进程管理和ASGI支持:

  • 安装依赖
    pip install uvicorn[standard]
  • 调整启动命令,指向项目asgi入口文件
    gunicorn 你的项目名.asgi:application -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000

2. 修正Nginx WebSocket转发配置

需要在Nginx配置中添加WebSocket专用的头部转发规则,否则无法完成握手:

location /ws/ { # 替换为你实际的WebSocket路由前缀
    proxy_pass http://127.0.0.1:8000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_read_timeout 86400; # 长连接超时时间可按需调整
}

3. 修复apscheduler多进程重复启动的潜在问题

你当前的调度器启动逻辑会在每个Web worker进程启动时都执行一次,多进程部署时会出现调度器重复启动、任务重复执行的问题,可根据场景选择修复方案:

  • 生产环境建议将调度器作为独立进程单独部署,不和Web服务共用进程
  • 临时测试可先将Web worker数量调整为1,避免重复启动

4. 验证排查步骤

  • 先跳过Nginx,直接用WebSocket客户端访问ASGI服务器的接口,确认服务端可以正常响应握手,排除服务端配置问题
  • 查看Nginx错误日志,确认没有连接拒绝、超时类报错
  • 检查Django配置中的ALLOWED_HOSTS、CSRF_TRUSTED_ORIGINS,确认已添加生产环境域名,用到Channel Layer的话也要确认CHANNEL_LAYERS配置正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:00:01