Отказоустойчивый веб-сервер на Linux c помощью NGINX

Отказоустойчивый веб-сервер на Linux c помощью NGINX

1.Введение

Предлагаю вашему вниманию схему по организации отказоустойчивого сервера приложений — например для высоко нагруженных проектов, таких как веб-сервера с посещаемостью от 1000 чел/час.
Отказоустойчивый сервер ubuntu
В данной схеме дублирован каждый узел:
— балансировщики nginx. Будут слушать веб сервера(бэкэнды) и вещать их в сеть. Осуществлояется кэширование в режиме прокси(proxy_chache). Так как на сайте присутствуют и зарегистрированные пользователи и обычные посетители, то кэширование осуществляется по следующей схеме:
— гостям данные отдаются из кеша (обновляются согласно настройкам кеширования — proxy_cache_valid)
— авторизованным пользователям данные всегда отдаются напрямую, кроме случая когда:
— бекэнд сервер выдает ошибку определенную в proxy_cache_use_stale
— если бекэнд не работает или выдает ошибку определенную в proxy_cache_use_stale гостю выдается ответ из кеша не зависимо от его устаревания
— определение зарегистрированного пользователя осуществляется по наличию определенной куки (её название зависит от движка сайта)
— веб сервер — nginx (фронтэнд) для статического содержимого, apache2 для динамического(как бэкэнд). Хостинг размещается на  хранилище Gluster Fs(т.е. Дублируется на вебсервера nginx+apache). Для ускорения php используем hhvm в режиме fastcgi для apache(бэкэнд) и nginx(frontend). Так-же оставили php-fpm в качестве резерва. Веб сервер будет обращаться к mysql прокси.
— mysql proxy(2 шт) с общим адресом для обращения приложений к mysql. В случае выхода одно из прокси из строя его заменит второй(настроим hearbeat). Так же серверы  слушают запросы на порте 3306 и распределяют их между серверами баз данных
— mysql северы (backend) с репликацией в режиме мастер-мастер и кэшированием(memchached) для ускорения. Два сервера дублируют друг друга, и в случае выхода одного из строя доступ к базам данных останется, т.е это никак не скажется на работоспособности веб-серверов.
На Днс сервере будет 2 А записи, каждая из которых будет указывать на ip адрес одного из балансировщиков

Для увеличения отказоустойчивости предлагается увеличить количество вебсерверов и серверов баз данных. В случае увеличения серверов баз данных репликация пойдет по кругу.
Так же можно использовать вариант с  MySQL репликацией на Redis cache server через Ruby, Gearman, triggers, and MySQL UDF. Давайте далее рассмотрим всё на примерах.

ВАРИАНТ №1.  Отказоустойчивый веб-сервер nginx(keepalive)+glusterfs+mysqlreplication

Что мы будем иметь в итоге:

2 nginx балансировщика(keep alive), фронтенды будут слушать веб сервера php(php-fpm). Так же они будут «страховать друг друга», имея один виртуальный ip — 10.1.9.176. Ip серверов 10.1.9.173 и 10.1.9.174

2 веб сервера php(php-fpm+mysql+nginx) c gluster fs для синхронизации файлов и с репликацией баз данных. Ip 10.1.9.175 и 10.1.9.177.

Операционная система: debian 8 minimal(net install) с доступом по ssh.

Server1: debian-test-1.domain.local 10.1.9.173 – основной loadbalancer(MASTER)

Server2: debian-test-2.domain.local 10.1.9.174 – резервный loadbalancer(BACKUP)

VIP(virtual IP) – 10.1.9.176 — плавающий/расшаренный между балансировщиками нагрузки виртуальный IP-адрес,на который прописаны сайты в DNS

2.1Установка Keepalived

(в зависимостях подтянет ipvsadm-утилиту для администрирования ipvs (ip virtul server))

Включаем маршрутизацию пакетов на обоих балансерах

Проверяем
sysctl -p

Далее редактируем server1;

Запускаем keepaliver

Проверяем его

Видим это

Далее на втором серваке (server 2);

Запускаем keepaliver

Проверяем его

Видим это(если первый сервак выключить или остановить keepalived на 1 серваке)

2.2 Установка PHP серверов

В качестве php сервера выберем PHP-FPM

Далее перейдем к настройке.

Настройка состоит из двух этапов — настройки «Nginx» и «PHP-FPM». Для начала необходимо остановить процессы (демоны) «Nginx» и «PHP-FPM», например, командами

ывыв

Настройка PHP-FPM

На обоих серверах( не балансировщиках) web-server 1 и web-server 2 производим почти аналогичную настройку

Прежде всего, следует открыть файл «/etc/php5/fpm/php.ini» для редактирования, например, командой

после чего, найти строчку содержащую «cgi.fix_pathinfo», которая по-умолчанию выглядит так (закомментирована)

и привести её к виду

Это призвано устранить опасность неправильно трактования (и возникающей уязвимости) запросов вида «/image.gif/foo.php» (см. Don’t trust the tutorials: check your configuration!, Nginx 0day exploit for nginx + fastcgi PHP).
Если планируется загрузка больших файлов (важно для ownCloud версий < 8, в новой версии 8 и выше имеется отдельный файл для этих настроек), то можно увеличить максимальный объем загружаемых данных, например, до 200 МБ

и ниже

Затем сохранить изменения в файле.

Следует сохранить изменения в файле и перезапустить «PHP-FPM», например, командой

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

 

Установка и Настройка glusterfs

Настроим firewall:

Приведем к виду /etc/hosts на webserver-1

GNU nano 2.2.6 Файл: /etc/hosts

Приведем к виду /etc/hosts на webserver-2

GNU nano 2.2.6 Файл: /etc/hosts

Установим gluster-fs

apt-get install glusterfs-server -y

Теперь переходим на первый веб сервер и выполняем команду.

Далее. переходим на второй веб сервер и выполняем команду.

Проверяем статус на каждом серваке

gluster peer status

Hostname: debian-server-web-2
Uuid: f98ad7a2-2e72-4748-ad10-8fdfe41a813c
State: Peer in Cluster (Connected)
root@debian-server-web-1:/home/human#

Всё ок.

Теперь создадим кластерное хранилище с именем volume1,

В данной команде:

volume1 — название хранилища

replica 2 — количество серверов реплик

debian-server-web-1:/gluster-storage -В данном случае debian-server-web-1 имя сервера gluster, а /gluster-storage путь к папке в которой будут храниться изменения в фс Gluster.

Вывод команды должне быть таким:

Вывод команды должен быть таким:

Теперь установим клиентскую часть, для подключения созданной фс.

Выполните данные действия на каждом веб сервере:

Устанавливаем необходимые компоненты.

Создаем директорию для монтирования (Выполняем на каждом веб сервере).

Настройка Nginx

Приведем конфиг nginx к необходимому виду. Для этого в старом клнфиге удалим все строки и вставим новые( в виме режим редактирования активируется клавишей ins):

Вставим след содержимое(старое удалим)

Сохранимся (esc, затем wq и enter). Все можем в базе создавать юзера

mysql -u root -p

create database wordpress;

exit

Далее, для тестов, установим wordpress

Перейдем по ip 10.1.9.177 (webserver-2) (на это серв мы ставили всё) и закончим установку wordpress. Введем пользователся bd root и пароль, который мы указали при установке. остальное придумайте сами.

One thought on “Отказоустойчивый веб-сервер на Linux c помощью NGINX

  1. Здравствуйте!
    Спасибо за такую полезную информацию!
    У меня возникло несколько вопросов —
    1. На DNS сервер я всё-таки прописываю две А-записи с балансироващиками, или же, цитирую: «VIP(virtual IP) – 10.1.9.176 — плавающий/расшаренный между балансировщиками нагрузки виртуальный IP-адрес,на который прописаны сайты в DNS»

    2. Можно ли обойтись без apache для бекенда ?

    3. Текст поплыл в абзаце — В данной схеме дублирован каждый узел:

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

Войти с помощью: 

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