【问题标题】:ERR_CONTENT_LENGTH_MISMATCH on nginx and proxy on Chrome when loading large files加载大文件时,nginx 上的 ERR_CONTENT_LENGTH_MISMATCH 和 Chrome 上的代理
【发布时间】:2014-11-17 14:02:00
【问题描述】:

我的 chrome 控制台出现以下错误:

GET http://localhost/grunt/vendor/angular/angular.js net::ERR_CONTENT_LENGTH_MISMATCH 

这只发生在同时向 nginx 发送请求时,例如当浏览器缓存为空并且整个应用程序加载时。将上述资源作为单个请求加载成功。

以下是此请求的标头,从 Chrome 复制:

Remote Address:127.0.0.1:80
Request URL:http://localhost/grunt/vendor/angular/angular.js
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8,de;q=0.6,pl;q=0.4,es;q=0.2,he;q=0.2,gl;q=0.2
Cache-Control:no-cache
Connection:keep-alive
Cookie:gs_u_GSN-265185-D=1783247335:2567:5000:1377697930719
Host:localhost
Pragma:no-cache
Referer:http://localhost/grunt/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.122 Safari/537.36
Response Headersview source
Accept-Ranges:bytes
Cache-Control:public, max-age=0
Connection:keep-alive
Content-Length:873444
Content-Type:application/javascript
Date:Tue, 23 Sep 2014 11:08:19 GMT
ETag:"873444-1411465226000"
Last-Modified:Tue, 23 Sep 2014 09:40:26 GMT
Server:nginx/1.6.0

文件的实际大小:

$ ll vendor/angular/angular.js
-rw-rw-r--  1 xxxx  staff  873444 Aug 30 07:21 vendor/angular/angular.js

你可以看到Content-Length和文件的实际大小是一样的,所以这很奇怪

以及该代理的 nginx 配置:

location /grunt/ {
    proxy_pass  http://localhost:9000/;
}

有什么想法吗?

谢谢

编辑:在错误日志中找到更多信息:

2014/09/23 13:08:19 [crit] 15435#0: *8 open() "/usr/local/var/run/nginx/proxy_temp/1/00/0000000001" failed (13: Permission denied) while reading upstream, client: 127.0.0.1, server: localhost, request: "GET /grunt/vendor/angular/angular.js HTTP/1.1", upstream: "http://127.0.0.1:9000/vendor/angular/angular.js", host: "localhost", referrer: "http://localhost/grunt/"

【问题讨论】:

  • 在我的 laravel 中,我只需重新启动并刷新页面。

标签: google-chrome nginx proxy


【解决方案1】:

在 nginx 配置中添加以下行是为我修复 net::ERR_CONTENT_LENGTH_MISMATCH 错误的唯一方法:

proxy_buffering off;

【讨论】:

  • 谢谢,这解决了我的问题。谁能解释一下为什么会这样?
  • @AndrewEinhorn 这个答案提供了更多的上下文:stackoverflow.com/a/46694782/1439168
  • 终于,我的开发环境有了解决方案。
【解决方案2】:

似乎迫于压力,nginx 试图从其缓存中拉出angular.js,但由于权限问题而未能成功。以下是解决此问题的方法:

root@amac-2:/usr/local/var/run/nginx $ chown -R _www:admin proxy_temp

_www:admin 在您的情况下可能会有所不同,具体取决于哪个用户拥有 nginx 进程。查看有关 ServerFault 的更多信息:

https://serverfault.com/questions/534497/why-do-nginx-process-run-with-user-nobody

【讨论】:

  • 感谢您的提示,升级到 El Capitan 后,我使用 HomeBrew nginx 遇到了这个问题
  • 我很高兴它仍然有用!
  • 如果有人仍然遇到这个问题 - 您可能需要仔细检查运行 nginx 的用户。在我的情况下,该文件夹具有适当的权限和所有权,但只是 nginx 在nobody.nobody 下运行。
  • @amitkapit :您能否发布如何在 Ubuntu 14.04 LTS 中解决此问题?
  • 这是让 nginx 和 browserSync 协同工作以服务于 AngularJS 项目的关键。如果您已经通过自制软件安装了 nginx,并且在 OSX 上使用了所有默认值,那么它应该是 sudo chown -R nobody:admin /usr/local/var/run/nginx/proxy_temp。我的预感是这个问题是通过以 root 而不是 $USER 的身份通过 launchctl 切换到运行 nginx 造成的。
【解决方案3】:

我尝试了以上所有方法,但仍然无法正常工作。即使求助于chmod 777为我解决的唯一一件事就是完全禁用缓存:

proxy_max_temp_file_size 0;

虽然这不是一个修复程序并且对生产使用没有好处,但这对我来说没问题,因为我只是将 nginx 用作本地开发设置的一部分。

【讨论】:

    【解决方案4】:

    对我来说,补救措施是以下两种设置:

    在文件中: /etc/nginx/nginx.conf

    添加:

    proxy_max_temp_file_size 0;
    proxy_buffering off;
    

    client_max_body_size 128M;server_names_hash_bucket_size 256; 之间:

    http {
    
    client_max_body_size 128M;
    proxy_max_temp_file_size 0;
    proxy_buffering off;
    server_names_hash_bucket_size 256;
    

    【讨论】:

    • 除了proxy_buffering,为什么还需要proxy_max_temp_file_sizeproxy_max_temp_file_size 的文档声明 When buffering of responses from the proxied server is enabled,暗示 proxy_buffering off: nginx.org/en/docs/http/… 时没有效果
    • 正如@JustinRaymond 所说,您不需要将这两件事放在一起。考虑设置的后果确实很有意义。
    【解决方案5】:
    ps aux | grep "nginx: worker process"
    

    执行上述命令后,你会看到运行 nginx 的用户

    例如。

    www-data 25356  0.0  0.0  68576  4800 ?        S    12:45   0:00 nginx: worker process
    
    www-data 25357  0.0  0.0  68912  5060 ?        S    12:45   0:00 nginx: worker process
    

    现在你必须运行下面的命令来授予权限

    chown -R www-data:www-data /var/lib/nginx/
    

    希望能成功

    【讨论】:

    • 你是怎么找到/var/lib/nginx/的位置的?
    • 这将是你的 nginx 目录
    • 就我的 Amazon Linux 2 而言,键入以下内容即可解决! sudo chown -R ec2-user /var/lib/nginx/
    【解决方案6】:

    对我们来说,事实证明我们的服务器相当小的根(即 /)已满。

    它在 /home 中有大量来自用户的日志和文件。将所有这些杂乱无章的东西移到另一个已安装的驱动器上解决了问题。

    只是想分享,因为这可能是问题的另一个原因。

    【讨论】:

    • 轰隆隆。如果您在 docker 中工作,请检查此。干杯安迪。
    【解决方案7】:

    如果过去有人以其他用户身份运行 nginx,缓存文件夹的所有权可能会被扭曲。我得到了

    /var/cache/nginx# LANG=C ls -l proxy_temp/
    total 40
    drwx------ 18 nginx nginx 4096 Jul 14  2016 0
    drwx------ 19 nginx nginx 4096 Jul 14  2016 1
    drwx------ 19 nginx nginx 4096 Jul 14  2016 2
    drwx------ 19 nginx nginx 4096 Jul 14  2016 3
    drwx------ 19 nginx nginx 4096 Jul 14  2016 4
    drwx------ 19 nginx nginx 4096 Jul 14  2016 5
    drwx------ 19 nginx nginx 4096 Jul 14  2016 6
    drwx------ 18 nginx nginx 4096 Jul 14  2016 7
    drwx------ 18 nginx nginx 4096 Jul 14  2016 8
    drwx------ 18 nginx nginx 4096 Jul 14  2016 9
    

    当 nginx 以 www-data 运行时。所以解决方案是将 nginx 的缓存目录的所有权更改为运行 nginx 的用户。在本案中

    /var/cache/nginx# chown -R www-data:www-data *
    

    或者,甚至更简单

    # rm -r /var/cache/nginx/*
    

    【讨论】:

    • 这正是我的情况。非常感谢。
    【解决方案8】:

    对我有用的是将 proxy_temp_path 更改为具有读/写权限的文件夹 (777)

    location / {
        proxy_temp_path /data/tmp;
    }
    

    【讨论】:

    • 将权限更改为 777 是不安全的,您不应该在任何对互联网开放的服务器上这样做!
    【解决方案9】:

    我有同样的问题。 增加安装nginx的目录文件夹的空间,解决了这个问题。

    【讨论】:

      【解决方案10】:

      当我尝试上述解决方案时,它并没有解决问题。我还更改了在该位置上写字的权限,但它没有用。然后我意识到我在那里做错了什么。在存储文件的位置,我有类似

      "/storage" + 文件名 + ".csv"

      。我在 Windows 环境下进行测试,效果很好。但后来当我们将应用程序移至 Linux 环境时,它停止工作。所以后来我不得不把它改成

      “./storage”+文件名+“.csv”

      它开始正常工作了。

      【讨论】:

        【解决方案11】:

        对我来说,解决方案是:

        sudo chown -R nginx:nginx /var/cache/nginx/fastcgi_temp/
        

        【讨论】:

          【解决方案12】:

          对于使用 HAProxy 作为代理并获得这些完全相同的症状的任何人,增加超时值为我解决了问题:

          超时连接 5000 超时客户端 50000 超时服务器 50000

          【讨论】:

            【解决方案13】:

            唯一对我有帮助的是 nginx 站点 .conf 文件中的以下设置:

            proxy_read_timeout 720s;
            proxy_connect_timeout 720s;
            proxy_send_timeout 720s;
            

            【讨论】:

              【解决方案14】:

              对我来说,除了 a 之外,我也遇到了同样的错误

              不同的文件夹/var/lib/nginx/

              我把所有者改成nginx了

              chown -R nginx:nginx /var/lib/nginx/。那没用。

              然后我检查了谁拥有 nginx worker process by

              ps aux| grep nginx

              它作为 nginx 运行,但是当我查看 nginx.conf 文件时;我发现用户是 nginx 但它没有任何组。所以,我给用户 nginx 添加了 nginx;原来是这样的

              user nginx nginx

              现在我重新启动系统并解决了问题。我想我本来可以用的

              chown -R nginx /var/lib/nginx/

              这可能也有效。因此,如果有人面临这个问题;首先进入var/log/nginx

              检查发生权限错误的位置

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2017-07-02
                • 2021-10-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-03-25
                • 2016-08-19
                相关资源
                最近更新 更多