ERR несоответствие длины содержимого в 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/;
}
Есть идеи?
Спасибо
EDIT: нашел дополнительную информацию в журнале ошибок:
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/"
8 ответов:
Похоже, что под давлением 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
Я попробовал все вышеперечисленное и все еще не мог заставить его работать. Даже после обращения к
chmod 777. Единственное, что решило для меня, это полностью отключить кэширование:
proxy_max_temp_file_size 0;Хотя это не исправление и не подходит для использования в производстве, это было нормально для меня, так как я использую nginx только как часть локальной установки разработки.
Добавление следующей строки в конфигурацию nginx было единственным, что исправило ошибку
net::ERR_CONTENT_LENGTH_MISMATCHдля меня:proxy_buffering off;
Что мне удалось, так это изменить proxy_temp_path на папку с правами на чтение / запись (777)
location / { proxy_temp_path /data/tmp; }
Для нас оказалось, что у нашего сервера довольно маленький корень (т. е. /) наполненный.
В нем были горы журналов и файлов от пользователей в /home. Перемещение всего этого Крафта на другой установленный привод решило все проблемы.
Просто хотел поделиться, так как это может быть еще одной причиной проблемы.
Для меня средством были эти две установки:
В файле:
/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;
Когда я попробовал вышеупомянутое решение, это не исправило проблему. Я также изменил разрешение писать на месте, но это не сработало. Потом я понял, что сделал что-то не так. В месте для хранения файла у меня было что-то вроде
" / storage " + fileName +".csv "
. Я тестировал среду Windows, и она отлично работала. Но позже, когда мы перенесли приложение в среду Linux, оно перестало работать. Так что позже мне пришлось переодеться. это к
"./ хранение" + fileName +".csv "
И он начал работать нормально.
Comments