Настроить веб-сервер с балансировкой. FrontEnd — nginx, BackEnd — apache.
Цель: в результате выполнения ДЗ вы создадите базовый скелет web-сервера с балансировкой нагрузки.
В данном задании тренируются навыки:
- декомпозиции предметной области;
- установка ПО на сервер, работа с файлами конфигурации;
- построения элементарной архитектуры FrontEnd/BackEnd web-сервера с балансировкой нагрузки.
Необходимо:
- установить nginx и apache;
- настройить работу apache на порты отличные от порта 80;
- настройть работу nginx на порт 80;
- настроить upstream в nginx для BackEnd apache;
- настроить перенаправление обращения nginx на upstream.
Для выполнения задания было решено использовать наиболее близкую к реальной архитектуру, состоящую из 4 виртуальных серверов, подключенных к виртуальной сети:
- Frontend-сервер. Внешний IP 185.177.., внутренний IP 10.0.1.1
- Backend-сервер №1. Внутренний IP 10.0.1.2
- Backend-сервер №2. Внутренний IP 10.0.1.3
- Backend-сервер №3. Внутренний IP 10.0.1.4
Входящие запросы принимаются Frontend-сервером, после чего средствами nginx распределяются между backend-серверами №№ 2-4.
В рамках исходного задания подразумевается размещение всех компонентов на одном сервере, что в реальной ситуации не даст никакой выгоды с точки зрения отказоустойчивости или производительности, а потому было принято решение использовать вышеописанную архитектуру. При реализации же на одном сервере в рамках Apache использовались бы вирутальные хосты VirtualHost.
Размещение на одном сервере nginx + apache оправдано в случае, если Nginx используется для отдачи статического контента, а за динамическим контентом происходит перенаправление запросов на Apache. Это позволяет получить некоторый выигрыш в скорости отдачи статического контента.
На каждый из backend-серверов была произведена установка веб-сервера Apache.
Для одновременного развертывания на нескольких серверах использовался вызов ssh в цикле:
for i in $(seq 1 3); do ssh "10.0.1.$(($i + 1))" "${CMD}"; done;Команда установки Apache:
yum install -y httpdПоскольку в рамках выбранной архитектуры каждый сервер Apache находится на отдельном виртуальном сервере, то реальной необходимости в изменении порта нет. Тем не менее, с целью соблюдения требований задания, для каждого экземпляра Apache был изменен параметры Listen с указанием порта, отличного от 80.
sed -i.bak "s/^Listen.*$/Listen ${PORT}/" /etc/httpd/conf/httpd.confДля удобства предварительной проверки корректности работы для каждого сервера была создана своя стартовая страница:
for i in $(seq 1 3); do ssh "10.0.1.$(($i + 1))" "echo Apache$i | tee /var/www/html/index.html"; done;Далее все экземпляры Apache были активированы и запущены:
systemctl enable httpd && systemctl start httpdВ первую очередь для удобства адресации backend были добавлены строки в файл /etc/hosts:
10.0.1.2 apache1
10.0.1.3 apache2
10.0.1.4 apache3
Это позволит в дальнейшем использовать удобочитаемые адреса серверов без необходимости использования DNS-сервера. А в случае изменения адреса какого-то из серверов достаточно будет поправить только /etc/hosts, не изменяя другие конфигурационные файлы.
Поскольку пакет Nginx находится в отдельном репозитории, то предварительно выполнена установка информации о данном репозитории:
yum install -y epel-releaseДалее уже непосредственно установка Nginx:
yum install -y nginxСоздание списка upstream в отдельном конфигурационном файле:
NGINX_UPSTREAM="/etc/nginx/conf.d/upstream.conf"
echo "upstream httpd {" > $NGINX_UPSTREAM
for i in %(seq 1 3); do
echo " server apache$i:${PORT};" >> $NGINX_UPSTREAM
done
echo "}" >> $NGINX_UPSTREAMВ основном конфигурационном файле Nginx /etc/nginx/nginx.conf указано перенаправление на группу httpd:
location / {
proxy_pass http://httpd;
}
Далее активация и запуск Nginx:
systemctl enable nginx && systemctl start nginxПри многократном обращении из браузера к внешнему IP-адресу происходит перенаправление запроса с Nginx на один из backend-серверов. Поскольку в файле конфигурации nginx явно не указан порядок выбора сервера, то используется алгоритм round-robin и переадресации очередного запроса происходит по очереди на каждый сервер. Это подтверждается последовательным отображением страниц с текстом "Apache1", "Apache2" и "Apache3" (порядок может быть нарушен при наличии запросов от других пользователей).
Дополнительно был написан скрипт httpd.sh для возможности ускоренного развертывания. В дальнейшем скрипт может быть доработан для полностью автоматизированного развертывания аналогичной архитектуры за один запуск.