Re: Проблема: upstream buffer is too small

Maxim Dounin mdounin на mdounin.ru
Пн Сен 27 18:01:50 MSD 2010


Hello!

On Mon, Sep 27, 2010 at 04:56:33PM +0400, Илья Винокуров wrote:

> > Либо я не понял что вы хотите, либо непонятно, где вы тут видите противоречие.
> > 
> > Есть какой-то server, в нём есть location с proxy_pass и proxy_cache.
> > 
> > curl дёргает урл, nginx лезет на бекенд, забирает ответ, ответ попал в кеш.
> > Теперь второй бекенд (точно так же как curl) дёргает этот же урл,
> > nginx отдаёт ответ из кеша.
> > 
> 
> Текущая схема:
> 
> Запрос
>   |
>   v
> nginx
>   |                   
>   v
> backend -----------------> service
> 
> 
> Запрос приходит на nginx, mod_perl овый backend идет за контентом к service.
> Если service тормозит, то на backend'е выстраиваются толпы апачей и всем плохо.
> 
> Но дело в том, что nginx знает с какими параметрами backend будет вызывать service
> И вызов service можно сделать из nginx. А бекенд возьмет данные из кеша nginx'а
> 
> Запрос
>   |
>   v
> nginx -----------------> service
>  | ^
>  | |
>  v |
> backend
> 
> В этом случае при торможении service бекенду плохо не будет - 
> все "зависшие" соединения останутся на nginx, который 
> справляется со множеством соединений гораздо лучше апача...
> 
> Схема словами:
> 
> 1) Приходит запрос на nginx.
> 2) Nginx знает из запроса с какими параметрами должен сходить 
> backend к service.
> 3) Nginx прокачивает свой кэш нужным запросом
> 4) Nginx передает запрос backend'у
> 5) Backend идет за контентом не к service, а к nginx в его кэш.
> 6) Если в кэше не оказалось данных от service, схема вырождается 
> в первую и фатальных ошибок не происходит.
> 
> Вот, что мне хочется.
> 
> Надеюсь, я смог донести Вам свою мысль.

Без сторонних модулей должна сработать какая-то такая схема с 
двойным проксированием:

<!--#include virtual="/precache/..." wait="yes" -->

location /precache/ {
    proxy_pass http://localhost/realcache/;
    proxy_method HEAD;
    proxy_pass_request_body off;
    proxy_pass_request_headers off;
}

location /realcache/ {
    proxy_pass ...service...;
    proxy_cache ...
}

Детали:

- В подзапросе из ssi метод при проксировании ставится в HEAD, 
  чтобы тела ответа с той стороны не присылали.

- При втором проксировании с proxy_cache кеш сам поменяет запрос 
  на GET и закеширует результат.

Как вариант - опять же с двойным проксированием, но проксировать 
на сервис, и при втором проксировании добавлять X-Accel-Redirect 
на реальный бекенд.  Это наверное несколько прямее чем 

Maxim Dounin



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