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/"
Ответы
Ответ 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;