读取上游时,上游发送的数据多于“Content-Length”标头中指定的数据。

读取上游时,上游发送的数据多于“Content-Length”标头中指定的数据。

我有 django 应用程序(基于 Mezzanine)。

我的 nginx 配置如下:

upstream myhost {
    server 127.0.0.1:8000;
}

server {

    listen 80;
    server_name www.myhost.ru myhost.ru;
    client_max_body_size 10M;
    keepalive_timeout    15;

    location / {
        proxy_redirect      off;
        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-Protocol    $scheme;
        proxy_pass          http://myhost;
    }

    location /static/ {
        root            /home/myhost/virtualenvs/myhost/project;
        access_log      off;
        log_not_found   off;
    }

    location /robots.txt {
        root            /home/myhost/virtualenvs/myhost/project/static;
        access_log      off;
        log_not_found   off;
    }

    location /favicon.ico {
        root            /home/myhost/virtualenvs/myhost/project/static/img;
        access_log      off;
        log_not_found   off;
    }

}

在浏览器中我看到“内部服务器错误”。

我在 /var/log/nginx/errir.log 中看到以下错误:

2013/04/20 12:24:57 [warn] 11479#0: *1 upstream sent more data than specified in "Content-Length" header while reading upstream, client: 89.189.170.4, server: www.rureads.ru, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8000/", host: "myhost.ru"
2013/04/20 12:38:14 [warn] 11481#0: *19 upstream sent more data than specified in "Content-Length" header while reading upstream, client: 89.189.170.4, server: www.rureads.ru, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8000/", host: "myhost.ru"

什么原因可能导致此问题?如何解决?

答案1

修改 nginx 配置:

proxy_buffering off;

答案2

好吧,我为此苦苦挣扎了好一阵子。就我而言,我的 django 应用程序中潜伏着一个与 mezzanine 相关的导入错误(使用 django 开发服务器时不会显示)。出于某种原因(可能是 gunicorn 错误?),此导入错误未显示在浏览器中(即使 DEBUG=True)或由 gunicorn 记录。相反,我只是从 nginx 收到“内部服务器错误”,并在 nginx 错误日志中收到“上游发送了更多指定的数据...”消息。gunicorn 日志只是记录了请求,好像一切正​​常。由于没有任何地方记录任何特定错误,我花了很长时间才找到导入错误并修复它。就我而言,我能够让 django 错误页面仅通过在设置中注释掉所有 MIDDLEWARE_CLASSES 并设置 DEBUG=True 来显示。这揭示了导入错误,我已修复它。然后,我重新启用了 MIDDLEWARE_CLASSES,重新启动了 gunicorn 工作者,一切正常!

希望这可以为某些人节省一些时间。

相关内容