отключить буферизацию запросов в nginx


Похоже, что nginx буферизует запросы перед передачей их на сервер updstream, в то время как это нормально для большинства случаев, для меня это очень плохо:)

Мой случай выглядит так:

У меня есть nginx в качестве frontend сервера для прокси 3 различных серверов:

  1. apache с типичным php-приложением
  2. shaveet (сервер comet с открытым исходным кодом), построенный мной с помощью python и gevent
  3. сервер загрузки файлов, построенный заново с gevent, который проксирует загрузку в Rackspace cloudfiles в то время как принятие загрузки от клиента.

#3-это проблема, прямо сейчас у меня есть то, что nginx буферизует весь запрос, а затем отправляет его на сервер загрузки файлов, который, в свою очередь, отправляет его в cloudfiles вместо отправки каждого куска по мере его получения (те, кто делает загрузку быстрее, поскольку я могу толкать 6-7 МБ/с в cloudfiles).

Причина, по которой я использую nginx, состоит в том, чтобы иметь 3 разных домена с одним IP, если я не могу этого сделать, мне придется переместить сервер fileupload на другую машину.

4 7

4 ответа:

Согласно Gunicorn, они предлагают использовать nginx для буферизации клиентов и предотвращения атак slowloris. Так что эта буферизация, скорее всего, хорошая вещь. Тем не менее, я вижу вариант ниже по той ссылке, которую я предоставил, где говорится об удалении прокси-буфера, не ясно, находится ли это в nginx или нет, но похоже, что это так. Конечно, это при условии, что у вас есть Бегущий Гуникорн, которого у вас нет. Возможно, он все еще полезен для вас.

EDIT: я сделал некоторые исследования показывают, что отключение буфера в nginx предназначено для исходящих данных длительного опроса. Nginx заявляет на своем сайтеwiki , что входящие запросы должны быть буферизованы перед отправкой вверх по потоку.

" обратите внимание, что при использовании модуля HTTP Proxy (или даже при использовании FastCGI) весь клиентский запрос будет буферизован в nginx перед передачей на серверные прокси-серверы. В результате счетчики хода загрузки не будут работать корректно, если они работают путем измерения данных получено бэкенд-серверами."

Как только эта функция [1] будет реализована, Nginx сможет действовать как обратный прокси-сервер без буферизации для загрузок (запросов баг-клиентов). Он должен приземлиться в 1.7, который является текущей магистралью.

[1] http://trac.nginx.org/nginx/ticket/251

Обновление

Эта функция доступна с 1.7.11 через флаг

proxy_request_buffering on | off;

Http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_request_buffering

Теперь доступен в nginx начиная с версии nginx-1.7.11.

См. документацию http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_request_buffering

Чтобы отключить буферизацию загрузки укажите

proxy_request_buffering off;

Я бы заглянул в haproxy, чтобы удовлетворить эту потребность.