Nginx, проксирование, балансировка, отказоустойчивость.
Nginx (читается энжин икс) — легковесный HTTP сервер, его автор Игорь Сысоев.
Насколько я понимаю стратегию разработки nginx, основной упор делается на развитие возможностей, обеспечивающих проксирование и отказоустойчивость. Этим в nginx занимаются два модуля:
- ngx_http_upstream
- 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 |