Ноя 28 2008

Nginx, проксирование, балансировка, отказоустойчивость.

Nginx (читается энжин икс) — легковесный HTTP сервер, его автор Игорь Сысоев.

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

  1. ngx_http_upstream
  2. ngx_http_proxy_module

С помощью модуля upstream, описывается так называемая ферма бекэнд HTTP серверов, на которые nginx будет проксировать запросы.

Допустим у нас есть 3 сервера, на которые надо проксировать запросы, в конфигурационном файле это будет описано так:

upstream hilik {
    server 192.168.0.1 weight=2 max_fails=10  fail_timeout=30s;
    server 192.168.0.2 weight=2 max_fails=10  fail_timeout=30s;
    server 192.168.0.3 weight=4 max_fails=10  fail_timeout=30s;
}

Немного разъяснений:
upstream hilik — так мы описываем имя нашей фермы вебсерверов. Это имя в дальнейшем будет использоваться в настройках модуля proxy

server 192.168.0.1 — таким образом задаются адреса серверов, которые входят в ферму.

weight=4 — этот параметр предназначен для балансировки нагрузки и означает что данный сервер будет обслуживать 4 запроса подряд, 5-й запрос пойдет на следующий по списку сервер.

max_fails=10 fail_timeout=30s — эти 2 параметра связанны и означают, что если за 30 секунд произойдет 10 сбоев сервера(сервер ответит 10 раз кодами отличными от 2ХХ или 3ХХ или не ответит вообще), то будет исключен из работы на 30 секунд.

Теперь можно перейти к настройке виртуального хоста (VirtualHost) и модуля проксирования:

server {
        listen       89.252.34.107:80;
        server_name  hilik.org.ua www.hilik.org.ua;
        reset_timedout_connection  on;
        location / {
                proxy_pass http://hilik/;
                proxy_next_upstream error timeout invalid_header http_500 http_503;
                proxy_set_header   Host             $host;
                proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
                proxy_redirect off;
                proxy_connect_timeout 30;
        }
}

Описание виртуалхоста начинается с дерективы server. В nginx все сервера Name Based, это когда у вас на одном ip может отвечать целый ряд виртуальных серверов, описанных в одном запущеном nginx, а различаются они по имени передаваемом в заголовке Host:

Директива listen, описывает ip адрес и порт на котором «слушает»(принимает запросы) виртуальный сервер.

server_name — описывает имена которые будет обслуживать виртуальный сервер

reset_timedout_connection — заставляет nginx принудительно закрывать соединения в состоянии ожидания по истечению таймаута.

Дальше у нас идет описание что делать с запросами пришедшими в наш сервер. Описываются все варианты с помощью директивы location. Поскольку мы все запросы перенаправляем в upstream, то location у нас будет один единственный, описывающий все URI.

В нем и задаются действия с пришедшими запросами:
проксируем на бекэнды директивой proxy_pass
proxy_next_upstream указывает модулю проксирования, что надо переходить к следующему бекэнду в случае возникновения описанных ошибок.
proxy_set_header устанавливает заголовки
proxy_redirect off; — запрещает выполнять редирект
proxy_connect_timeout — описывает время ожидания ответа от бекэнда.

Мне всегда нравился простой и понятный язык конфигов nginx.

Проверить новую конфигурацию nginx, можно выполднив команду:

nginx -t

в случае, если с файлом настроек все в порядке, ответ будет такой:

2008/11/28 11:05:54 [info] 52907#0: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
2008/11/28 11:05:54 [info] 52907#0: the configuration file /usr/local/etc/nginx/nginx.conf was tested successfully

в этом случае можно рестартовать сервер

/usr/local/etc/rc.d/nginx restart

или заставить его перечитать настройки

killall -HUP nginx

Добавить в закладки:

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

Украинская Баннерная Сеть