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