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

Docker容器中Prometheus采集Django指标报400错误求助

问题分析与解决方案

核心排查方向

400 Bad Request通常和请求头或Django的安全配置相关,结合你的场景,重点排查以下几点:

1. 确认ALLOWED_HOSTS是否真的生效

虽然你设置了ALLOWED_HOSTS = ['*'],但有可能配置未实际生效:

  • 进入store_backend容器,执行python manage.py shell,输入from django.conf import settings; print(settings.ALLOWED_HOSTS),确认输出为['*']。
  • 检查.env文件是否存在覆盖ALLOWED_HOSTS的环境变量,比如ALLOWED_HOSTS=localhost这类配置,若代码中用os.getenv读取该变量,会覆盖硬编码的['*']。

2. 查看Django容器的具体错误日志

这是定位问题最直接的方式:

  • 执行docker logs store_backend,找到Prometheus请求对应的400错误条目,日志通常会给出具体原因(比如Invalid HTTP_HOST header、CSRF验证失败等)。
    例如若日志显示Invalid HTTP_HOST header: 'store_backend:8888',即使ALLOWED_HOSTS=['*'],部分WSGI服务器(如gunicorn)可能对带端口的Host头有特殊处理,此时可尝试在ALLOWED_HOSTS中显式添加'store_backend'或'store_backend:8888'。

3. 调整Prometheus采集方式(两种可选)

方式一:通过Nginx代理采集(推荐)

本地访问正常是因为走了Nginx,而Prometheus直接请求后端容器可能缺失必要的请求头。修改prometheus.yml,让Prometheus通过Nginx采集:

scrape_configs:
  - job_name: 'django'
    static_configs:
      - targets: ['store_nginx:80']
    metrics_path: '/prometheus/metrics'

这种方式和本地访问逻辑完全一致,Nginx会自动传递正确的Host头给后端,避免直接访问的头问题。

方式二:给Prometheus请求添加Host头

如果要直接访问后端容器,在prometheus.yml中添加Host头模拟本地访问的请求:

scrape_configs:
  - job_name: 'django'
    static_configs:
      - targets: ['store_backend:8888']
    metrics_path: '/prometheus/metrics'
    headers:
      Host: 'localhost'

4. 检查WSGI服务器绑定地址

确保你的WSGI服务器(如gunicorn)绑定的是0.0.0.0:8888,而非127.0.0.1:8888。若绑定本地回环地址,容器内部其他服务虽能建立连接,但请求会被拒绝(不过你的场景返回400,大概率不是这个问题,但可做确认)。


内容的提问来源于stack exchange,提问作者kroxx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:04:56