Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

README.md

Домашнее задание №2

Настроить веб-сервер с балансировкой. FrontEnd — nginx, BackEnd — apache.

Цель: в результате выполнения ДЗ вы создадите базовый скелет web-сервера с балансировкой нагрузки.

В данном задании тренируются навыки:

  • декомпозиции предметной области;
  • установка ПО на сервер, работа с файлами конфигурации;
  • построения элементарной архитектуры FrontEnd/BackEnd web-сервера с балансировкой нагрузки.

Необходимо:

  • установить nginx и apache;
  • настройить работу apache на порты отличные от порта 80;
  • настройть работу nginx на порт 80;
  • настроить upstream в nginx для BackEnd apache;
  • настроить перенаправление обращения nginx на upstream.

Решение

Общая архитектура

Для выполнения задания было решено использовать наиболее близкую к реальной архитектуру, состоящую из 4 виртуальных серверов, подключенных к виртуальной сети:

  1. Frontend-сервер. Внешний IP 185.177.., внутренний IP 10.0.1.1
  2. Backend-сервер №1. Внутренний IP 10.0.1.2
  3. Backend-сервер №2. Внутренний IP 10.0.1.3
  4. Backend-сервер №3. Внутренний IP 10.0.1.4

Входящие запросы принимаются Frontend-сервером, после чего средствами nginx распределяются между backend-серверами №№ 2-4.

Обоснование

В рамках исходного задания подразумевается размещение всех компонентов на одном сервере, что в реальной ситуации не даст никакой выгоды с точки зрения отказоустойчивости или производительности, а потому было принято решение использовать вышеописанную архитектуру. При реализации же на одном сервере в рамках Apache использовались бы вирутальные хосты VirtualHost.

Размещение на одном сервере nginx + apache оправдано в случае, если Nginx используется для отдачи статического контента, а за динамическим контентом происходит перенаправление запросов на Apache. Это позволяет получить некоторый выигрыш в скорости отдачи статического контента.

Установка и настройка 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

Установка и настройка Nginx

В первую очередь для удобства адресации 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 для возможности ускоренного развертывания. В дальнейшем скрипт может быть доработан для полностью автоматизированного развертывания аналогичной архитектуры за один запуск.