Re: Transfer-Encoding: chunked для статических файлов

Валентин Бартенев vbart at nginx.com
Mon Mar 25 10:15:15 UTC 2013


On Monday 25 March 2013 13:21:28 Руслан Шарипов wrote:
> Добрый день.
> 
> Подскажите, поддерживает ли nginx возможность отдавать статические
> файлы чанками?
> 

В этом нет практического смысла. Теоретически можно его заставить это делать
через какой-нибудь обработчик, который сделает размер ответа неизвестным 
(например пропускать через SSI, sub filter, или addition filter).

> Если запросить ресурс, который nginx будет проксировать, то
> Transfer-Encoding: chunked включается. Например, запрашиваем ресурс,
> который формируется wsgi-бэкендом: curl
> http://server.example.com/api/v1/file/foobar/status, то ответ будет
> таким:
> 
> HTTP/1.1 200 OK
> Server: nginx/1.2.1
> Date: Mon, 25 Mar 2013 09:09:08 GMT
> Content-Type: application/json
> Transfer-Encoding: chunked
> Connection: close
> 
> d
> {"status": 0}
> 0
> 
> Т.е. все хорошо, ответ пришел чанками.
> 

Не всегда. Всё зависит от ресурса. Если размер ответа неизвестен, то будет 
использоваться chunked transfer encoding, при условии, что клиент его 
поддерживает.

> Но если запросить ресурс, который представляет из себя просто
> статичный файл и обрабатывается вот таким location'ом:
> 
>  location /files/ {
>   root /home/uploader/receiver;
>   chunked_transfer_encoding on;
>  }
> 
> То имеем такую картину:
> 
> Запрос: curl http://server.example.com/files/foobar
> Ответ:
> 
> HTTP/1.1 200 OK
> Server: nginx/1.2.1
> Date: Mon, 25 Mar 2013 09:05:02 GMT
> Content-Type: application/octet-stream
> Content-Length: 819098
> Last-Modified: Mon, 25 Mar 2013 08:38:21 GMT
> Connection: keep-alive
> Accept-Ranges: bytes
> 
> ...data
> 
> Т.е. nginx отдает файл "спрошняком", не деля его на чанки. Можно ли
> добиться того, чтобы nginx разбивал на чанки не только ответы от
> бэкендов, но и статические файлы? (здесь же возникает вопрос, как
> настаивать размер чанка)
> 
> Спасибо.
> 
> p.s. возможно задачу можно решить иначе, поэтому также поясню зачем
> мне это надо. Если верить некому Бену
> (https://groups.google.com/forum/?fromgroups=#!topic/python-tornado/kvZma1J
> Y1hc), то штатный http-клиент из tornado позволяет использовать
> streaming_callback
> (http://www.tornadoweb.org/en/stable/httpclient.html) только в том
> случае, если ответ от сервера не "сплошной", а разбит на чанки.
> 

Некий Бен скорее всего неправ, и streaming_callback работает вне зависимости
от chunked transfer encoding. Во всяком случае, никаких явных указаний на
обратное я не нашел. И было очень бы странно, если бы он это требовал.

--
Валентин Бартенев
http://nginx.org/en/donation.html


Подробная информация о списке рассылки nginx-ru