Подтвердить что ты не робот

ERR_CONTENT_LENGTH_MISMATCH на nginx и прокси на Chrome при загрузке больших файлов

Я получаю следующую ошибку на моей консоли 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/"
4b9b3361

Ответ 1

Кажется, что под давлением nginx пытался вытащить angular.js из своего кеша и не мог из-за проблем с разрешением. Вот что решило эту проблему:

[email protected]:/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

Ответ 2

Я пробовал все вышеперечисленное и все еще не мог заставить его работать. Даже прибегая к chmod 777. Единственное, что разрешило это для меня, - полностью отключить кеширование:

proxy_max_temp_file_size 0;

Хотя это не исправление и не подходит для производства, это было нормально для меня, поскольку я использую nginx только как часть локальной настройки разработки.

Ответ 3

Что сработало для меня, так это изменить proxy_temp_path на папку с разрешениями на чтение и запись (777)

location / {
    proxy_temp_path /data/tmp;
}

Ответ 4

Когда я попробовал вышеупомянутое решение, это не устранило проблему. Я также изменил разрешение на запись на месте, но это не сработало. Тогда я понял, что там что-то не так. В месте хранения файла у меня было что-то вроде

"/storage" + fileName + ".csv"

. Я тестировал среду Windows, и она отлично работала. Но позже, когда мы переместили приложение в среду Linux, оно перестало работать. Поэтому позже мне пришлось изменить его на

"./storage" + fileName + ".csv"

и он начал нормально работать.

Ответ 5

Добавление следующей строки в конфигурацию nginx было единственным, что зафиксировало ошибку net::ERR_CONTENT_LENGTH_MISMATCH для меня:

proxy_buffering off;