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

Nginx+Gunicorn+Django每3次请求显示默认页面问题求助

问题描述

在Debian 11.2系统上,采用Nginx 1.18.0反向代理Gunicorn 20.1.0(监听8000端口)部署Django应用,架构为:Nginx <-:8000-> Gunicorn <--> Django。

异常表现:

  • 每3次请求(第1、4、7、10次等)会返回Nginx默认模板,对应Nginx访问日志中返回字节数为396的请求;正常请求返回Django页面,对应日志字节数6723。
  • Nginx和Gunicorn的error.log均无报错(此前有错误记录,确认日志功能正常),服务器资源充足。
  • 已尝试调整Gunicorn和Nginx的超时时间、开启Gunicorn debug级日志,问题未解决。
  • 关键更新:Gunicorn访问日志显示未收到出现异常的请求。

附相关配置文件

Gunicorn配置文件(示例)

bind = "127.0.0.1:8000"
workers = 3
timeout = 30
accesslog = "/var/log/gunicorn/access.log"
errorlog = "/var/log/gunicorn/error.log"
loglevel = "debug"

Nginx站点配置文件(示例)

server {
    listen 80;
    server_name your-domain.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /static/ {
        root /path/to/your/django/app;
        expires 30d;
    }
}
排查思路与解决方案

1. 排查Nginx站点配置冲突

  • 列出已启用的Nginx站点:ls /etc/nginx/sites-enabled/,检查是否存在默认的default站点仍在启用,这可能导致Nginx在匹配请求时交替命中默认站点和自定义站点。
  • 查看完整生效配置:nginx -T,确认自定义站点的server_name是否精准匹配请求域名,是否存在其他server块(如server_name _的默认配置)优先或随机匹配请求。
  • 解决措施:禁用默认站点(unlink /etc/nginx/sites-enabled/default),确保自定义站点是唯一匹配目标,重启Nginx:systemctl restart nginx。

2. 检查Nginx请求转发逻辑

  • 由于Gunicorn未收到异常请求,说明Nginx未将这些请求转发到后端,而是直接返回默认页。检查proxy_pass配置是否存在路径匹配问题:确保URL末尾无多余斜杠(如http://127.0.0.1:8000而非http://127.0.0.1:8000/)。
  • 在location /块中添加proxy_redirect off;,避免Nginx对响应进行不必要的重定向处理。
  • 排查是否存在Nginx模块(如ngx_http_upstream_module)的特殊配置影响请求调度,比如错误的健康检查或负载均衡规则。

3. 验证请求的Host头匹配

  • 异常请求可能因Host头不匹配自定义站点的server_name,导致Nginx路由到默认站点。临时修改自定义站点的server_name为_(匹配所有请求),测试是否仍出现默认页,验证是否为匹配规则问题。
  • 若默认站点未删除,可在默认站点配置中添加访问日志,记录异常请求的Host、User-Agent等信息,定位请求特征。

4. 排查网络层面的请求分流

  • 检查服务器防火墙、前端负载均衡/CDN等设备,确认是否存在请求被分流到Nginx的默认监听端口或其他站点。
  • 查看网络连接状态:ss -tulpn,确认Nginx仅在预期端口监听,无其他进程占用端口导致请求被拦截。

5. 确认Gunicorn监听状态

  • 检查Gunicorn的bind配置是否为127.0.0.1:8000,确保仅接受本地Nginx的转发请求,避免外部请求直接访问。
  • 重启Gunicorn:systemctl restart gunicorn,查看进程状态:ps aux | grep gunicorn,确认worker进程正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:47:30