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

Nginx日志每5秒出现HEAD请求排查求助(Django+Gunicorn架构)

解决Nginx每5秒出现HEAD / 302请求的问题

嘿,咱们先拆解下你的问题:系统跑起来没报错,但Nginx日志每隔5秒就蹦出来一条来自内网IP 10.112.113.1 的 HEAD / HTTP/1.1 请求,返回302状态码。结合你贴的Nginx配置,我来梳理下可能的原因和解决办法:

一、先搞清楚302是哪来的

你的Nginx配置里,80端口的server块会直接返回301跳转到HTTPS,但日志里的状态码是302,说明这个请求最终是Django应用返回的,不是Nginx的301重定向。

为啥这么说?如果请求是打在80端口,日志里应该是301;现在是302,说明请求到了443端口的server块,然后被代理到Django,由Django返回了302(比如你的Django根路由/没配对应的视图,或者默认重定向到了admin后台之类的页面)。

二、为啥每隔5秒就来一次?

这个固定频率太典型了——十有八九是健康检查机制在搞事情:

  • 可能是服务器内部的监控脚本(比如系统自带的服务监控、或者你自己搭的监控工具)
  • 也可能是云服务商的负载均衡健康检查(如果你的服务器在云平台上)
  • 至于Nginx upstream的主动健康检查?你的配置里没加相关指令,而且请求是发往/不是直接连socket,这个可能性很低。

三、怎么解决?

根据你的需求,有几种处理方式可选:

1. 在Nginx层面直接处理HEAD请求,别麻烦Django

如果这个健康检查只是要确认服务活着,不需要触发Django的逻辑,可以在443的server块里加个专门处理HEAD /的location:

location = / {
    if ($request_method = HEAD) {
        return 200;
    }
    try_files $uri @proxy_to_app;
}

这样,所有针对/的HEAD请求会被Nginx直接返回200,不会转发到Django,自然就不会有302日志了,同时也能满足健康检查的需求。

2. 调整Django根路由,返回200而非302

如果希望让Django来处理这个请求,你可以修改Django的urls.py,给根路由/加个简单的健康检查视图:

from django.http import HttpResponse
from django.urls import path

def health_check(request):
    return HttpResponse(status=200)

urlpatterns = [
    # 你的其他路由...
    path('', health_check, name='health_check'),
]

这样Django收到HEAD /请求时就会返回200,日志里就不会再出现302了。

3. 找到并关闭不必要的健康检查

如果这个请求是你不需要的监控脚本发的,可以找找对应的脚本(比如在/etc/cron.d/或者监控工具的配置文件里),调整检查频率或者直接关掉。不过除非你确定这个健康检查没用,不然不建议这么做——毕竟监控还是有点用的。

四、验证一下

先临时把上面的Nginx配置加上,然后重启Nginx:

sudo systemctl restart nginx

盯着日志看一会儿,如果之后的HEAD请求返回200,就说明配置生效啦。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:38:21