На серверах lb01 и lb02 устанавливается Nginx для балансировки нагрузки (распределения запросов клиентов на пару Web-серверов(серверов приложений app01 и app02)), а также для отказоустойчивости. При выходе со строя одного из lb-ов второй из них автоматически становится активным сервером(цепляет на себя VIP(Virtual IP) на который прописаны сайты в ДНС)
Это достигается за счет настроенного KeepAlived на обоих loadbalancer-серверах. Именно KeepAlived постоянно мониторит доступность активного loadbalancer -сервера и в случае его недоступности по какой-либо причине VIP-адрес перемещается с проблемного loadbalancer -сервера на запасной.
Запасной(вторичный) loadbalancer -сервер становится активным до тех пор пока не поднимется основной(loadbalancer, который имеет больший вес, согласно настройкам KeepAlived – это lb01)
Балансировка нагрузки(раскидывание клиентских запросов) используется для повышения стабильности сервера за счет «группы» серверов.
В NGINX такая группа объединяется в один «облачный сервер» с помощью конструкции upstream с ключевым названием, в данном случае это backend. Встречая данное слово в конфиге nginx будет пробовать использовать upstream сервера этой группы.
Чтобы посетители в случае каких-то операций оставались на одном сервере используется хеширование ip адреса — ip_hash.
Для автоматического отключения перегруженного или не работающего сервера используется конструкция max_fails=2 fail_timeout=60
Если при запросе к серверу произошла ошибка, запрос будет передан на следующий сервер. Если произошло 2 ошибки в течение 60 секунд, то на 60 секунд сервер будет помечен неработающим, и в течение этого времени новые запросы не будут на него отправляться.
Итого имеем
VIP-адреc расшаренный/плавающий между двумя лоадбалансерами 192.168.1.126
Только активный в данный момент времени имеет на себе этот адрес( ip addr show покажет его)
1 2 3 4 |
lb01 — 192.168.1.61 lb02 — 192.168.1.62 app01- 192.168.1.63 app02 — 192.168.1.64 |
1.Установка и настройка Keepalived на lb01 и lb02
На обоих lb устанавливаем Keepalived и вносим необходимое значение в переменную ядра net.ipv4.ip_nonlocal_bind
1 |
# yum install keepalived |
Для того, чтобы разрешить Nginx прослушивать VIP-адрес(адрес, плавающий/расшаренный между двумя лоадбалансерами 192.168.1.126 )+включение маршрутизации пакетов.
1 |
# nano /etc/sysctl.conf |
1 2 |
net.ipv4.ip_forward = 1 net.ipv4.ip_nonlocal_bind = 1 |
1 |
# sysctl -p |
1 |
[root@lb01 ~]# nano /etc/keepalived/keepalived.conf |
1 2 3 4 5 6 7 8 9 |
vrrp_instance VI_1 { interface eth0 # interface to monitor state MASTER virtual_router_id 51 # Assign one ID for this route priority 100 # 100 on master, 50 on backup virtual_ipaddress { 192.168.1.126 # the virtual IP } } |
1 |
[root@lb02 ~]# nano /etc/keepalived/keepalived.conf |
1 2 3 4 5 6 7 8 9 |
vrrp_instance VI_1 { interface eth0 # interface to monitor state BACKUP virtual_router_id 51 # Assign one ID for this route priority 50 # 100 on master, 50 on backup virtual_ipaddress { 192.168.1.126 # the virtual IP } } |
Запускаем keepalived на обеих балансировщиках нагрузки + проверяем наличие VIP-адреса на активном балансировщике(lb01)
1 |
[root@lb01 ~]# /etc/init.d/keepalived start |
1 |
[root@lb01 ~]# ip addr show | grep 126 |
1 |
inet 192.168.1.126/32 scope global eth0 |
1 |
[root@lb02 ~]# /etc/init.d/keepalived start |
1 |
[root@lb02 ~]# ip addr show | grep 126 |
2.Установка и настройка Nginx на lb01 и lb02
Подключение официального репозитария Nginx
1 |
# nano /etc/yum.repos.d/nginx.repo |
1 2 3 4 5 6 7 8 |
[nginx] name=nginx repo #Для Centos6 baseurl=http://nginx.org/packages/centos/6/$basearch/ #Для Centos5 #baseurl=http://nginx.org/packages/centos/5/$basearch/ gpgcheck=0 enabled=1 |
Отключим установку Nginx с Centalt-репозитария(если это репозитарий был подключен)
1 |
# nano /etc/yum.repos.d/centalt.repo |
1 2 |
………… exclude=nginx* |
Установка и настройка Nginx в качестве балансировщика нагрузки
1 |
# yum install nginx |
1 |
# cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf~ |
1 |
# nano /etc/nginx/nginx.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
user nginx nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; access_log /var/log/nginx/access.log main; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; sendfile on; tcp_nopush on; keepalive_timeout 65; gzip on; gzip_disable "msie6"; include /etc/nginx/conf.d/*.conf; } |
1 |
# mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf~ |
1 |
# mv /etc/nginx/conf.d/example_ssl.conf /etc/nginx/conf.d/example_ssl.conf~ |
1 |
# nano /etc/nginx/conf.d/lb.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
upstream backend { ip_hash; server 192.168.1.63:80 max_fails=2 fail_timeout=60; server 192.168.1.64:80 max_fails=2 fail_timeout=60; } server { listen 80; server_name _; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { proxy_pass http://backend; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_503 http_504 http_502; proxy_connect_timeout 30; } } server { listen 443 ssl; server_name joomlanew.lb www.joomlanew.lb; ssl_certificate /etc/nginx/ssl/joomlanewlb.pem; ssl_certificate_key /etc/nginx/ssl/joomlanewlb.key; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { proxy_pass http://backend; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_503 http_502 http_504; proxy_connect_timeout 30; } } server { listen 443 ssl; server_name wordpressnew.lb www.wordpressnew.lb; ssl_certificate /etc/nginx/ssl/wordpressnewlb.pem; ssl_certificate_key /etc/nginx/ssl/wordpressnewlb.key; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { proxy_pass http://backend; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_503 http_502 http_504; proxy_connect_timeout 30; } } |
1 |
proxy_pass |
— проксирует запросы на бекэнды
1 |
proxy_next_upstream |
— указывает модулю проксирования, что надо переходить к следующему бекэнду в случае возникновения описанных ошибок.
1 |
proxy_set_header |
— передает данные о хосте (Host), реальном ip пользователя (X-Real-IP), и оригинальный заголовок HTTP (X-Forwarded-For)
1 |
proxy_redirect off |
– запрещает выполнять редирект
1 |
proxy_connect_timeout |
– описывает время ожидания ответа от бекэнда
3. Проверка синтаксиса,запуск и добавление в автозагрузку Nginx,Keepalived
1 |
# /etc/init.d/nginx configtest |
1 |
# /etc/init.d/nginx start |
1 |
# chkconfig --level 2345 nginx on |
1 |
# chkconfig --level 2345 keepalived on |
Альтернатива:
Источник:
http://nginx.org/en/docs/http/ngx_http_upstream_module.html
http://хостингсайта.рф/node/9
http://www.cyberciti.biz/faq/howto-linux-unix-setup-nginx-ssl-proxy/
http://www.hilik.org.ua/nginx-%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0-%D0%BE%D1%82%D0%BA%D0%B0%D0%B7%D0%BE/