加载大文件时,nginx上的ERR_CONTENT_LENGTH_MISMATCH和Chrome上的代理

ami*_*mit 32 proxy google-chrome nginx

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

GET http://localhost/grunt/vendor/angular/angular.js net::ERR_CONTENT_LENGTH_MISMATCH 
Run Code Online (Sandbox Code Playgroud)

这仅在向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
Run Code Online (Sandbox Code Playgroud)

文件的实际大小:

$ ll vendor/angular/angular.js
-rw-rw-r--  1 xxxx  staff  873444 Aug 30 07:21 vendor/angular/angular.js
Run Code Online (Sandbox Code Playgroud)

正如您所看到Content-Length的,文件的实际大小是相同的,所以这很奇怪

以及此代理的nginx配置:

location /grunt/ {
    proxy_pass  http://localhost:9000/;
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

谢谢

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

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/"
Run Code Online (Sandbox Code Playgroud)

ami*_*mit 35

似乎在压力下,nginx试图angular.js从其缓存中撤出并且由于权限问题而无法解决.以下是解决此问题的方法:

root@amac-2:/usr/local/var/run/nginx $ chown -R _www:admin proxy_temp
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这是让nginx和browserSync协同工作以服务AngularJS项目的关键.如果你已经通过自制程序和OSX上的所有默认值安装了nginx,它应该是`sudo chown -R nobody:admin/usr/local/var/run/nginx/proxy_temp`.我的预感是这个问题是通过以root身份而不是$ USER切换到通过launchctl运行nginx而创建的. (5认同)
  • 感谢您的提示,我在升级到El Capitan之后用我的HomeBrew nginx遇到了这个问题 (2认同)
  • 如果有人仍然遇到这个问题 - 您可能需要仔细检查运行`nginx`的用户.在我的情况下,该文件夹具有适当的权限和所有权,但只是nginx在`nobody.nobody`下运行. (2认同)

djs*_*ner 27

我尝试了以上所有内容但仍无法使其正常工作.即使在诉诸之后chmod 777.解决它的唯一办法就是完全禁用缓存:

proxy_max_temp_file_size 0;

虽然不是修复,也不适合生产使用,但这对我来说还不错,因为我只使用nginx作为本地开发设置的一部分.


Mig*_*ota 18

将以下行添加到nginx配置是唯一修复net::ERR_CONTENT_LENGTH_MISMATCH错误的方法:

proxy_buffering off;
Run Code Online (Sandbox Code Playgroud)

  • @AndrewEinhorn这个答案提供了更多上下文:/sf/answers/3268634771/ (3认同)

小智 13

对我来说,补救措施是这两个设置:

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

加:

proxy_max_temp_file_size 0;
proxy_buffering off;
Run Code Online (Sandbox Code Playgroud)

在线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;
Run Code Online (Sandbox Code Playgroud)


小智 8

ps aux | grep "nginx: worker process"
Run Code Online (Sandbox Code Playgroud)

执行上述命令后,您将看到运行 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
Run Code Online (Sandbox Code Playgroud)

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

chown -R www-data:www-data /var/lib/nginx/
Run Code Online (Sandbox Code Playgroud)

希望它会起作用