Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Проблема: upstream buffer is too sma ll
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 mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru
|