Azure Web App 阻止Django应用并行AJAX请求排查求助
问题背景
基于Django 4.2.13 + Python 3.10的应用,在本地Linux环境及测试服务器(Linux + Nginx + Gunicorn)中,文件上传时通过AJAX请求展示处理进度的功能正常;但部署到Azure Web App后,主文件上传请求处理期间发起的并行AJAX进度查询请求始终处于Pending状态,服务器无相关日志记录,主请求完成后流程才恢复正常。
前端进度查询核心代码:
await sleep(400); while (current_row < total_rows) { $.post('ppro_bar/get_progress_data', {'test': ''}) .done(function(data) { if (typeof data.data != "undefined") { current_row = data.data.current_row; total_rows = data.data.total_rows; percent_progress = (current_row/total_rows)*100; progress_bar.innerHTML = ` <div class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" style="width: ${percent_progress}%" aria-valuenow="${percent_progress}" aria-valuemin="0" aria-valuemax="100"></div>`; } }); await sleep(100); }
解决思路
1. 解除Django会话独占锁
Django默认的数据库会话存储会对每个请求的会话记录加独占锁,直到请求结束。如果主文件上传请求长时间持有会话锁,后续AJAX请求会因等待锁释放而被阻塞。
- 改用缓存会话存储(推荐):修改
settings.pySESSION_ENGINE = "django.contrib.sessions.backends.cache" # 搭配Azure Redis缓存的示例配置 CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "your_azure_redis_connection_string", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } } } - 若必须使用数据库会话,设置
SESSION_SAVE_EVERY_REQUEST = False,并确保主请求尽早完成会话操作后释放锁。
2. 调整Gunicorn Worker数量
Azure Web App部署Django时,若Gunicorn的worker数量过少(如默认1个),主请求会占用唯一worker,导致后续请求排队等待。
- 修改Gunicorn启动命令,增加worker数(建议值为
2*CPU核心数+1):gunicorn --workers 4 --bind 0.0.0.0:8000 your_project.wsgi
3. 检查Azure Web App并发限制
低层级的App Service Plan(如免费/共享层)有严格的并发请求限制,可能导致并行请求被阻塞。
- 查看当前App Service Plan层级,若为基础/标准层以上,确认是否配置了自定义并发限制;
- 暂时降低前端AJAX请求频率(如把
sleep(100)改为sleep(500)),减少并行请求压力。
4. 异步化文件处理逻辑
主请求长时间占用连接会触发Azure网关的并行请求限制,建议将文件处理逻辑异步化:
- 使用Celery+Redis/RabbitMQ搭建任务队列,主请求仅负责接收文件、启动异步任务后立即返回任务ID;
- 前端通过任务ID定期AJAX查询任务进度(可借助
django-celery-results存储任务状态); - 任务处理完成后,前端跳转至结果页面。
5. 验证请求是否真的未到达服务器
Azure日志可能因采样规则未记录请求,可通过Application Insights确认:
- 在Azure Portal进入应用的Application Insights,查看「请求」面板,筛选AJAX请求路径(
ppro_bar/get_progress_data),确认请求是否到达服务器。
内容的提问来源于stack exchange,提问作者Branko Radojevic
相关产品推荐
相关产品推荐

