Кластеризация web серверов apache с помощью nginx

Захотелось посмотреть как поднимать кластер web-серверов для организации распредленной нагрузки на базе FreeBSD. Наиболее простым и эффективным решением является наша, отечественная разработка nginx.
Для тестирования поднял три виртуальные машины с FreeBSD 7.2. node1.domain.ru node2.domain.ru и nlb.domain.ru (нужно чтобы они были нормально прописаны в DNS и резолвились). На node1 и node2 поднял Apache и закинул одинаковый контент (хеадер у страниц только обозначил 1 и 2 соответственно, чтобы видеть куда именно отправился запрос, но это только в целях эксперимента, в жизни контент должен быть идентичен).
На nlb машине установил nginx:

/usr/ports/www/nginx
make config
кроме стандартных директив выбрал
HTTP_UPSTREAM_FAIR

make
make install
rehash

прописал в /etc/rc.conf
nginx_enable="YES"

Конфигурационный файл лежит здесь:
/usr/local/etc/nginx/nginx.conf

Вот пример работающего конфига для организации распределенной нагрузки:

worker_processes 1;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;

upstream backend {
server node1.domain.ru weight=1 max_fails=2 fail_timeout=20s;
server node2.domain.ru weight=1 max_fails=2 fail_timeout=20s;
}

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

Хоть подробное описание на русском всех параметров есть на http://sysoev.ru/nginx/ , кратенько расскажу о параметрах серверов:
weight - вес сервера. В моем случае имею 50 на 50, так как оба сервера имеют равный вес.
max_fails - количество неотработанных запросов перед принятием решения о сбойности сервера.
fail_timeout - то время за которое должно произойти нужное количество неотработавших запросов, чтобы признать сервер сбойным.

И все. Запустил апачи, запустил nginx. Зашел браузером на страничку http://nlb.domain.ru и увидел ответ от одной из нод. Потыкал быстро и много раз F5 и увидел как возвращается контент то с одного то с другого сервера.
Погасил одну из нод, снова понажимал F5. Стал получать контент только от работающей ноды, с попеременными задержками из за принятия решения nginx-ом о неработоспособности ноды к которой он обратился, но контент все равно получал каждый раз. Так что получаем не просто roundrobin, но и еще некоторую отказоустойчивость на уровне дочерних нод. Если свалится машина с nginx, то конечно избыточность нод не поможет.

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

Поделиться

Опубликовать в Facebook
Опубликовать в LiveJournal

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>