Есть nginx, который принимает https GET запросы и отдает их бэкенду по http.
Задача стоит такая, чтобы отдавать ответ клиенту, по мере выдачи его
бэкендом, а не тогда, когда бэкенд окончит request.
Пробовал играться с буферами для этой цели, вроде:
location /myurl/ {
proxy_buffers 2 1;
proxy_busy_buffers_size 1;
proxy_header_buffer_size 1;
proxy_pass http://backend/;
}
Предпологая, что в этом случае nginx будет отдавать ответ backend'а
клиенту сразу, как только получит хоть один байт.
Но в итоге лишь получают от nginx 502 Bad Gateway.
Можно ли как-то решить эту задачу стандартными средствами?
Я уже задавал этот вопрос Игорю Сысоеву, но ступил и некорректно
сформулировал задачу. Спросил, можно ли потоково передавать запрос
клиента бэкенду. Он ответил что это невозможно в текущей реализации.
А что насчет обратной задачи? Передавать ответ бэкенда по мере его выдачи
клиенту.
proxy_header_buffer_size не может быть меньше, чем размер заголовка ответа,
из-за этого и 502.
nginx передаёт ответа бэкенда по мере его поступления, но при этом
ещё и буферизует. Что-то близкое к потоку могло бы получится при таких
настройках:
proxy_header_buffer_size 512;
proxy_buffers 2 512;
proxy_busy_buffers_size 512;
proxy_max_temp_file_size 0;
Но если ответ https, то там используется 16K буфер для уменьшения
оверхеда SSL.
Игорь Сысоев
http://sysoev.ru