Azure Linux Web应用自动重启及Django部署优化咨询
问题根因说明
镜像大小未超15GB配额仍然触发资源不足重启,核心原因是混淆了两类独立的配额限制:
Azure Linux Web App的15GB限制是容器镜像存储配额,仅限制拉取到平台的镜像文件大小;容器运行时实际可用的可写磁盘空间、内存容量,完全由所选定价层决定,和镜像本身大小没有直接关联。
Django运行过程中产生的本地日志、临时缓存文件、WSGI worker进程内存泄漏、用户上传文件默认落本地、静态资源重复生成,都会快速吃满运行时分配的临时磁盘和内存,触发平台健康检查机制,强制重启容器。
优化部署方案
一、镜像瘦身,降低基础资源开销
5-6GB的镜像体积本身就会占用大量启动时内存和临时磁盘空间,常规Django项目的生产镜像完全可以控制在1GB以内:
- 换用slim/alpine版本的Python基础镜像,不要用带全量系统工具、调试依赖的官方默认镜像,比如用
python:3.11-slim-bookworm替代python:3.11,单基础镜像体积就能从900MB+降到150MB左右 - 采用多阶段构建:构建阶段单独安装gcc、python-dev等编译类依赖,运行阶段仅拷贝编译完成的Python依赖包和项目代码,不要把构建工具、pip缓存、测试用例、.git目录、开发环境配置打进生产镜像,参考构建模板:
# 构建阶段 FROM python:3.11-slim-bookworm AS builder WORKDIR /build RUN apt-get update && apt-get install -y --no-install-recommends gcc python3-dev COPY requirements.txt . RUN pip install --user --no-cache-dir -r requirements.txt # 运行阶段 FROM python:3.11-slim-bookworm WORKDIR /app COPY --from=builder /root/.local /root/.local COPY . . ENV PATH=/root/.local/bin:$PATH CMD ["gunicorn", "yourproject.wsgi:application", "--bind", "0.0.0.0:8000"]
- 不要把大体积静态资源、媒体文件、AI模型打包进镜像,这类资源统一存到对象存储服务
- 构建镜像时加
--no-cache-dir参数,避免pip缓存、系统包缓存残留在镜像层里
二、运行时资源占用优化
- 替换WSGI服务配置:用gunicorn搭配meinheld worker,比默认的sync worker、uWSGI内存占用低30%左右;worker数量按照
CPU核心数*2+1配置,不要开过多worker抢占内存;添加--max-requests 1000 --max-requests-jitter 50启动参数,每个worker处理1000个请求后自动重启,避免Python内存泄漏累积占满内存 - 关闭本地日志落盘:把Django应用日志、gunicorn访问日志全部配置为输出到stdout/stderr,交给平台自带的日志系统收集,不要在容器内写日志文件占用磁盘
- 临时目录路径调整:如果业务必须生成本地临时文件,把
/tmp目录映射到平台提供的共享存储路径,不要占用容器自身的可写临时层 - 关闭Django的DEBUG模式,避免调试模式下生成的SQL查询缓存、请求上下文缓存长期占用内存
三、适配PaaS平台特性调整架构
- 静态资源、媒体文件全走对象存储:安装对应存储SDK,配置Django的
STATICFILES_STORAGE、DEFAULT_FILE_STORAGE后端直接对接对象存储,执行python manage.py collectstatic时直接把静态文件同步到对象存储,完全不占用容器本地磁盘 - 打开平台持久化存储开关:配置
WEBSITES_ENABLE_APP_SERVICE_STORAGE=true,启用的持久化存储独立于容器运行时临时磁盘配额,不会被临时资源占满,也不会在容器重启时清空数据 - 配置资源阈值告警:在平台侧设置可用内存、临时磁盘占用率告警,当占用超过80%时提前排查异常进程,不要等平台触发强制重启
四、备选部署选型
如果做了以上优化后资源仍然紧张,可以根据业务情况调整部署目标:
- 升级定价层:免费层、共享层的运行时临时磁盘仅1GB、内存仅1-2GB,很容易被打满,基础B系列及以上定价层有10GB+临时磁盘、1.75GB以上内存,足够支撑大部分中小流量Django应用
- 换用容器实例类服务部署:如果应用本身内存、磁盘需求较高,可选择支持自定义资源配额的容器服务部署,不受App Service固定配额限制
内容的提问来源于stack exchange,提问作者Kallol Mistry
相关产品推荐
相关产品推荐

