Azure环境下Docker+Gunicorn+Nginx部署Django应用故障排查
你在Azure上用Docker、Gunicorn和Nginx部署Django应用,本地运行正常,但部署后加载内容前崩溃,结合你提供的配置和日志,从以下几个方向排查:
1. 修复entrypoint脚本的语法与权限
你的entrypoint脚本前几行有多余缩进,可能导致命令执行异常,建议修改为:
#!/bin/sh python manage.py migrate --no-input python manage.py collectstatic --no-input DJANGO_SUPERUSER_PASSWORD=$SUPER_USER_PASSWORD python manage.py createsuperuser --username $SUPER_USER_NAME --email $SUPER_USER_EMAIL --noinput gunicorn myfuture.wsgi:application --bind 0.0.0.0:8000
同时在Django的Dockerfile中添加一行,确保脚本有执行权限:
RUN chmod +x /entrypoint.sh
2. 验证环境变量配置
本地.env文件包含的SECRET_KEY、数据库配置等关键信息,Azure容器部署时需确认这些变量已正确注入:
- 若用Azure App Service部署,需在应用设置里手动添加所有
.env中的变量(容器镜像不会自动包含本地.env文件) - 检查
SUPER_USER_NAME、SUPER_USER_PASSWORD、SUPER_USER_EMAIL是否配置正确,缺失会导致创建超级用户失败,中断脚本执行
3. 修正Django的ALLOWED_HOSTS配置
本地运行时ALLOWED_HOSTS可能设为['localhost', '127.0.0.1'],部署到Azure后需添加Azure应用域名(如xxx.azurewebsites.net)或公网IP:
# settings.py ALLOWED_HOSTS = ['你的Azure域名', '公网IP', 'django_gunicorn']
可暂时设为ALLOWED_HOSTS = ['*']测试是否为此问题导致请求被拒绝(生产环境不建议)
4. 完善Nginx代理配置
当前Nginx配置缺少必要的请求头传递,Django依赖Host头处理请求,修改default.conf:
upstream django { server django_gunicorn:8000; } server{ listen 80; location / { proxy_pass http://django; 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; } location /static/ { alias /static/; } }
5. 检查数据库连接
若本地用SQLite,容器重启后数据会丢失,建议改用Azure托管数据库(如PostgreSQL/MySQL),并确保settings.py中的数据库配置正确指向Azure实例,同时Azure防火墙规则允许容器IP访问数据库。
6. 添加容器健康检查
在docker-compose.yml中给django_gunicorn服务添加健康检查,确保Gunicorn完全启动后Nginx再转发请求:
services: django_gunicorn: volumes: - static:/static env_file: - .env build: context: . ports: - "8000:8000" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 10s timeout: 5s retries: 5 nginx: build: ./nginx volumes: - static:/static ports: - "80:80" depends_on: django_gunicorn: condition: service_healthy
同时在Django中添加健康检查视图:
# views.py from django.http import HttpResponse def health_check(request): return HttpResponse("OK", status=200) # urls.py from django.urls import path from . import views urlpatterns = [ # 其他路由 path('health/', views.health_check, name='health_check'), ]
7. 查看完整容器日志
当前日志仅显示Gunicorn启动成功,无崩溃错误信息,用以下命令查看django_gunicorn容器的完整日志:
docker-compose logs django_gunicorn
若为Azure App Service部署,可在门户的「日志流」中查看完整容器输出,定位崩溃的具体原因(如数据库连接失败、环境变量缺失等)
内容的提问来源于stack exchange,提问作者Diego.dmb

