Azure App Service无法成功运行Celery及Celery Beat问题求助
问题根因
故障由两个配置错误共同导致:
- Gunicorn启动参数存在语法错误
启动命令里使用了全角长破折号—代替Linux命令标准的双短横参数前缀--,同时--bind参数未指定Azure App Service默认探测的8000端口,参数和等号之间还有多余空格,导致Gunicorn根本没有正常启动、没有在8000端口监听HTTP请求。这也是为什么能看到Celery定时任务正常执行(Celery命令参数没有错误,后台启动成功),但HTTP接口完全无响应、容器健康检查失败。 - 进程启动逻辑不符合Azure App Service容器运行规则
把Gunicorn、Celery Worker、Celery Beat三个进程全部用&放到后台运行,启动脚本执行到末尾时Shell进程会直接退出,所有后台子进程会被系统回收;即使进程没有被回收,平台也会因为主进程没有持续前台运行、收不到预期的8000端口HTTP响应,判定容器启动失败。
修复步骤
- 修正startup.sh脚本内容
脚本第一行添加标准Bash解释器声明,将Celery相关进程放到后台启动,最后用exec前缀前台启动Gunicorn,让Gunicorn成为容器主进程(PID=1),保证平台能正常探测端口、收集日志、传递运行信号。
修正后的完整脚本内容如下:
#!/bin/bash # 后台启动Celery Worker,日志输出到临时目录避免阻塞标准输出 celery -A api.celery worker -l info --logfile=/tmp/celery_worker.log & # 后台启动Celery Beat celery -A api.celery beat -l info --logfile=/tmp/celery_beat.log & # 前台启动Gunicorn,监听0.0.0.0:8000 exec gunicorn --bind=0.0.0.0:8000 --timeout 600 api.wsgi
- 给脚本添加可执行权限
本地项目根目录下执行chmod +x startup.sh后再重新部署,避免平台执行脚本时出现权限拒绝错误。 - 核对应用配置
进入App Service > 配置 > 应用程序设置,确认没有自定义WEBSITES_PORT参数值,如果有自定义端口,需要把Gunicorn监听端口改成对应值。
验证方法
- 先把启动命令临时改成单独的Gunicorn启动行
gunicorn --bind=0.0.0.0:8000 --timeout 600 api.wsgi,重启服务确认管理后台、API接口能正常访问,排除Django项目本身的启动错误。 - 确认Gunicorn正常后,再换回完整的startup.sh脚本配置重启,检查Celery定时任务执行状态、接口访问状态均正常即可。
内容的提问来源于stack exchange,提问作者Kllicks
相关产品推荐
相关产品推荐

