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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:37:15