Docker中Django+Gunicorn报‘Error handling request (no URI read)’问题求助
Django + Gunicorn Docker容器请求处理错误排查与解决
问题现象
在Docker容器内使用Gunicorn运行Django应用时,日志中频繁出现以下错误:
[2024-11-13 18:50:11 +0000] [9] [ERROR] Error handling request (no URI read)
Traceback (most recent call last):
File "/usr/local/lib/python3.13/site-packages/gunicorn/workers/sync.py", line 133, in handle
req = next(parser)
...
SystemExit: 1
尽管请求最终能返回响应,但处理耗时显著增加。
解决方法
1. 切换Gunicorn Worker类型并调整数量
默认的同步worker在高并发或长连接场景下易触发请求解析错误,建议:
- 安装
gevent异步依赖,改用异步worker启动:pip install gevent gunicorn config.wsgi:application --bind 0.0.0.0:8000 --worker-class gevent --workers 4 - worker数量建议设置为容器CPU核心数的
2倍+1,根据实际资源调整
2. 升级Gunicorn并配置超时参数
该错误常与请求头解析异常有关,可通过以下方式修复:
- 升级Gunicorn至最新稳定版:
pip install --upgrade gunicorn - 启动时增加超时与长连接配置,避免连接挂起:
gunicorn config.wsgi:application --bind 0.0.0.0:8000 --timeout 30 --keep-alive 5
3. 排查Docker网络配置
- 确认
docker-compose.yml的端口映射无冲突,避免8000端口被其他容器占用 - 进入容器内部直接测试服务,排除网络转发问题:
docker exec -it app curl http://127.0.0.1:8000
4. 优化Django应用设置
- 生产环境务必关闭
DEBUG模式,减少调试相关的性能开销 - 检查并移除不必要的中间件,简化请求处理流程
原配置文件
Dockerfile
FROM python:3.13.0-alpine3.20 ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 WORKDIR /app RUN apk update && \ apk add --no-cache jq python3-dev build-base gcc jpeg-dev zlib-dev libpq-dev COPY Pipfile.lock . RUN jq -r '.default | to_entries[] | .key + .value.version ' Pipfile.lock > requirements.txt && \ pip install -r requirements.txt COPY . . ENTRYPOINT ["sh", "./entrypoint.sh"]
docker-compose.yml
services: app: build: . container_name: app volumes: - .:/app - ./src/media:/app/src/media ports: - "8000:8000" depends_on: - db env_file: - .env restart: always db: image: postgres:17.0-alpine3.20 container_name: postgres_db volumes: - postgres_data:/var/lib/postgresql/data env_file: - .env restart: always volumes: postgres_data:
Gunicorn启动命令
gunicorn config.wsgi:application --bind 0.0.0.0:8000
内容的提问来源于stack exchange,提问作者Mikhailo
相关产品推荐
相关产品推荐

