ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Балансировка нагру зки в proxy



On Tue, 11 Jan 2005, Zherdev Anatoly wrote:

Возможно что эти вопросы уже задавись, но я не нашел архива по списку.

Можно ли как-то сделать балансировку нагрузки по backend серверам в
nginx. Или хотя бы на крайний случай, прописать резервный адрес для
backend сервера.

Сейчас proxy_pass резолвит бэкенд при каждой переконфигурации и, если
у бэкенда несколько адресов, то используются все. У всех адресов одинаковый
вес и они последовательно перебираются. Если при работе с бэкендом
произошла ошибка, то бэкенд исключается из списка работающих на 60 секунд.

Кроме того, есть директива proxy_next_upstream, которая задаёт условия,
при которых nginx будет пробовать работать с другим адресами прежде, чем
вернуть ошибку. Директива задаётся на уровне http, server и location.
По умолчанию параметры такие:

proxy_next_upstream   error timeout;

Полный список параметров:

error - ошибка при соединении, при передаче запроса или при чтении заголовка
        и первой части ответа.
timeout - таймаут при соединении, при передаче запроса или при чтении
        заголовка и первой части ответа.
invalid_header - неправильный или пустой заголовок ответа.
http_500 - 500 ответ.
http_404 - 404 ответ.

Нужно учесть, что переход к следующему бэкенду возможен только до начала
передачи ответа клиенту. Если ошибка произойдёт уже после того, как
начата передача ответа клиенту, то переход невозможен и соединение с
клиентом просто закрывается.

Параметр http_404 позволяет хранить какие-то файлы только на одном из
бэкендов. В этом случае nginx будут перебирать все бэкенды, пока не получит
другой ответ или же бэкенды не закончатся - в этом случае клиенту будет
передан ответ 404.

Что будет сделано ещё: будет возможность задавать явные адреса и веса
бэкендов, число ошибок и время исключения бэкенда из работы. Примерно так:

     server {
         location / {
             proxy_pass   http://some_backend/;
         }
     }

     upstream some_backend {
         server   backend0           w=10  f=5   t=60;
         server   backend1:8080      w=5   f=1;
         server   unix:/tmp/socket   w=1;
     }

Когда будет кэширование, то подобно директиве proxy_next_upstream
будет директива proxy_use_stale - если все бэкенды оказались недоступны
по указанным параметрам, а в кэше есть старый ответ, то он будет отдан
клиенту.

Для чего нужен proxy_temp_path, что пишется на файловую систему ?

nginx забирает ответ бэкенда как можно быстрее. Если ответ не помещается
в память, то он пишется во временный файл.

Первая часть ответа бэкенда принимается в буфер размером
proxy_header_buffer_size. Затем ответ принимается в буфера, заданные в
proxy_buffers. Эти буфера выделяются по мере необходимости, то есть,

proxy_buffers  256 32k;

означает, что при чтении ответа может быть использовано до 256 буферов
размером по 32К. Но если ответ меньше, то и выделено будет меньше.
По получении ответа он отдаётся клиенту. Если же все буфера заняты,
а клиент не принимает ответ, то ответ пишется во временный файл.

Есть ли какие-то средства, чтобы можно было узнать статус сервера
(время работы, сколько запросов сейчас отрабатывается, какие запросы
...) Что-то вроде server-status в apache ?

Пока нет.


Игорь Сысоев
http://sysoev.ru


 




Copyright © Lexa Software, 1996-2009.