在加载大文件时,使用nginx和代理时,在Chrome上出现ERR_CONTENT_LENGTH_MISMATCH错误

59

我在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 中,我只需重新启动并刷新页面。 - saber tabatabaee yazdi
16个回答

62

将以下行添加到nginx配置中是我所做的唯一修复net :: ERR_CONTENT_LENGTH_MISMATCH错误的事情:

proxy_buffering off;

1
谢谢,这解决了我的问题。有人能解释一下为什么这个有效吗? - Andrew Einhorn
3
这个答案提供了更多的上下文信息:https://dev59.com/gVoU5IYBdhLWcg3wAjnV#46694782 - Miguel Mota
最终,在我的开发环境中找到了解决方案。 - Hippasus

43

2
谢谢你的提示,我在升级到El Capitan后遇到了HomeBrew nginx的问题。 - Jonathan del Strother
我很高兴它仍然有用! - amit
2
如果有人仍然遇到这个问题 - 你可能需要再次检查nginx正在运行的用户。在我的情况下,文件夹具有适当的权限和所有权,但是nginx只是在nobody.nobody下运行。 - tftd
@amitkapit:你能发布一下如何解决Ubuntu 14.04 LTS中的这个问题吗? - Kamalakannan J
8
这是使nginx和browserSync一起为一个AngularJS项目提供服务的关键。如果您使用homebrew在OSX上安装了nginx并采用所有默认设置,则应为 sudo chown -R nobody:admin /usr/local/var/run/nginx/proxy_temp。我猜测,这个问题是因为从以$USER身份运行nginx切换到以root身份通过launchctl运行nginx而引起的。 - notbrain
显示剩余4条评论

33

我尝试了上述的所有方法,甚至使用了 chmod 777,但仍然无法使它工作。唯一解决问题的方法是完全禁用缓存:

proxy_max_temp_file_size 0;

虽然这不是一个修复方法,也不适合在生产环境中使用,但对于我来说是可以的,因为我只是将nginx用作本地开发环境的一部分。


24

对我来说,解决方法是这两个设置:

在文件中:/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;

1
为什么除了 proxy_buffering 之外,还需要 proxy_max_temp_file_sizeproxy_max_temp_file_size 的文档说明中指出 当启用了来自代理服务器的响应缓冲时,这意味着在 proxy_buffering off 时没有任何影响:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_max_temp_file_size。 - Justin Raymond
正如@JustinRaymond所提到的,你不需要这两个东西一起使用。考虑设置的后果确实是有意义的。 - Lukasz Siemiradzki

10
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/路径的? - Marc
这是您的nginx目录。 - Niyaz Ahamad
在我的情况下,对于Amazon Linux 2,输入以下命令可以解决问题!sudo chown -R ec2-user /var/lib/nginx/ - user3528623

4

对我们来说,问题是由于服务器的根目录(即 /)空间不足导致的。/home 目录下的用户日志和文件堆积如山。将这些杂物移动到另一个挂载的驱动器上解决了问题。

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


2
砰。如果您正在使用Docker进行工作,请检查这个。祝您愉快,安迪。 - Edward

3
如果以前有人使用不同的用户运行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/*

这正是我的情况。非常感谢。 - Erick Jimenez

1
我的解决方法是将proxy_temp_path更改为一个具有读写权限的文件夹(777)。
location / {
    proxy_temp_path /data/tmp;
}

1
将权限更改为777是不安全的,您不应该在任何对互联网开放的服务器上这样做! - amit

1
针对在 macOS 上使用 Homebrew 安装的 Nginx,我使用以下步骤追踪并解决了问题:
运行命令 nginx -h 来查找错误日志位置。寻找以下行:

-e filename : set error log file (default: /opt/homebrew/var/log/nginx/error.log)

将您的错误日志路径复制下来,并使用 tail 命令查看加载页面时所报告的错误信息。
tail -f /opt/homebrew/var/log/nginx/error.log

我看到其中一行显示了一个权限被拒绝的错误:

open() "/opt/homebrew/var/run/nginx/proxy_temp/9/01/0000000019" 失败 (13: Permission denied) while reading upstream

这意味着您缓存的目录对于nginx用户来说具有不正确的权限。

停止nginx。

brew services stop nginx

删除所有临时文件夹(位置在权限错误日志行中)。
sudo rm -rf /opt/homebrew/var/run/nginx/*

重新启动nginx
brew services start nginx

做完这个步骤后,nginx会使用正确的权限重新创建临时文件夹。此时,您可以尝试重新加载之前失败的页面。请注意保留HTML标签。

1
我曾经遇到过同样的问题。增加安装nginx的目录文件夹的空间,解决了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接