Nginx & reverse proxy: load balancing
Igor Sysoev
is at rambler-co.ru
Sun Jan 2 19:20:42 MSK 2005
On Sun, 2 Jan 2005, Mike Kolesnikov wrote:
> Игорь, не планируется ли добавление возможности load balancing в
> прокси-модуль nginx? Скажем, список URL backend'ов в директиве
> proxy_pass, и случайный выбор одного из URL для редиректа... Было бы
> очень удобно для мега-сайтов. Правда, тут сразу встает вопрос проверки
> бэкендов на работоспособность и игнорирование неработающих серверов, но
> это в принципе необязательно, т.к. может быть реализовано внешним
> скриптом с подменой конфига nginx-у.
Сейчас proxy_pass резолвит бэкенд при каждой переконфигурации и, если
у бэкенда несколько адресов, то используются все. У всех адресов одинаковый
вес и они последовательно перебираются. Если при работе с бэкендом
произошла ошибка, то бэкенд исключается из списка работающих на 60 секунд.
Кроме того, есть директива proxy_next_upstream, которая задаёт условия,
при которых nginx будет пробовать работать с другим адресами прежде, чем
вернуть ошибку. Директива задаётся на уровне http, server и location.
По умолчанию парамтеры такие:
proxy_next_upstream error timeout invalid_header http_500;
Параметры такие:
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 backend w=10 f=5 t=60;
server backend:8080 w=5 f=1;
server unix:/tmp/socket w=1;
}
Кстати, когда будет кэширование, то подобно директиве proxy_next_upstream
будет директива proxy_use_stale - если все бэкенды оказались недоступны,
а в кэше есть старый ответ, то он будет отдан клиенту.
> P.S. Может кто случайно архивирует где-нибудь в www этот список
> рассылки? Я подозреваю, что много интересных вопросов всплывало и
> обсуждалось, хотелось бы приобщиться.
Пока доступного архива нет. Возможно, я скоро выложу его в сыром виде
за прошлый год.
Игорь Сысоев
http://sysoev.ru
More information about the nginx-ru
mailing list