Целевая аудитория

Я адресовал эту статью людям, которые хотят узнать о HAProxy, Docker, Containers, Node.js.


Цели обучения

Прочитав эту статью, вы будете знать, как сделать следующее:

  • Создайте простое приложение node.js и образ докера для него.
  • Создайте и настройте конфигурацию HAProxy и образ докера для него.
  • Настраивать docker-compose.yml конфигурация.
  • Используйте docker compose для запуска всего приложения.
  • Выполните вызовы API для тестирования HAProxy.


Что такое HAProxy?


Определение вики

HAProxy это бесплатное программное обеспечение с открытым исходным кодом, которое обеспечивает высокодоступный балансировщик нагрузки и обратный прокси-сервер для приложений на основе TCP и HTTP, который распределяет запросы между несколькими серверами..Он написан на C и имеет репутацию быстрого и эффективного (с точки зрения использования процессора и памяти). источник


Конфигурация


Внешний интерфейс

Когда HAProxy используется в качестве обратного прокси перед внутренними серверами, frontend Раздел определяет IP-адреса и порты, к которым могут подключаться клиенты. Вы можете добавить сколько угодно frontend разделы по мере необходимости для представления различных веб-сайтов или приложений в Интернете. источник

# haproxy.cfg file

frontend myapp
    mode http # proxy mode --> http(layer 7), tcp(layer 4)
    bind *:80 # listen all ip adresses with port number 80
    default_backend myserver # default pool of backend servers
...

Войти в полноэкранный режим

Выйти из полноэкранного режима

The "mode" of the "backend" section that receives traffic from a "frontend" section should be the same. The configuration won't work if there's a mismatch.
Войти в полноэкранный режим

Выйти из полноэкранного режима


Бэкенд

Разделы внешнего интерфейса HAProxy принимают входящие соединения, которые затем могут быть перенаправлены на пул серверов. backend раздел, где определяются те пулы серверов, которые будут обслуживать запросы.источник


# haproxy.cfg file

#backend section
backend myserver
    mode http # mode has to be same as frontend
    server s1 localhost:11
    server s2 localhost:22
    server s3 localhost:33


Войти в полноэкранный режим

Выйти из полноэкранного режима


Проверка здоровья

HAProxy держит только исправные серверы в ротации для балансировки нагрузки. Он проверяет состояние каждого сервера, используя один из режимов проверки работоспособности, описанных в этом разделе.

Вы можете увидеть пример конфигурации для проверки работоспособности ниже:

backend myserver
    mode http
    option httpchk # enable http health check 

    server s1 localhost:80 check
    server s2 localhost:81 check
    server s3 localhost:82 check
Войти в полноэкранный режим

Выйти из полноэкранного режима


Тайм-аут

If you’re unsure as to what it means, it’s simple: when hitting a timeout, your first reaction should **not** be to increase the timeout. You should investigate why something is taking so long that you hit a timeout somewhere and **fix the root cause**
Войти в полноэкранный режим

Выйти из полноэкранного режима

Вы можете проверить основные тайм-ауты HAProxy в таблице ниже:

имяобъяснение
клиент тайм-аутаУстановите максимальное время бездействия на стороне клиента.
время ожидания подключенияУстановите максимальное время ожидания успешной попытки подключения к серверу.
сервер тайм-аутаУстановите максимальное время бездействия на стороне сервера.


Файл конфигурации для этой демонстрации

Мы будем использовать эту конфигурацию для демонстрации.

defaults
    mode http
    timeout client 10s
    timeout server 10s

frontend f
    bind *:80
    default_backend servers

backend b
    server s1 127.0.0.1:1111
    server s2 127.0.0.1:2222
    server s3 127.0.0.1:2222

Войти в полноэкранный режим

Выйти из полноэкранного режима


Создание простого HTTP-сервера

Мы создадим простой веб-сервер HTTP, используя node.js и http библиотека.

Выполните следующие шаги, чтобы создать приложение node.js:
1- создать папку приложения
2- создайте файл index.js и скопируйте и вставьте следующий код

const http = require("http");

const defaultPort = 1111;
const portNumber = process.env.PORT || defaultPort;

const httpServer = http.createServer((req, res) => {
  res.statusCode = 200;
  res.end("Hi, listening on port: " + portNumber);
});

httpServer.listen(portNumber, "0.0.0.0", () => {
  console.log(httpServer.address());
});
Войти в полноэкранный режим

Выйти из полноэкранного режима

3- Создать package.json

Вы можете создать package.json файл с помощью следующей команды

npm init -y # yes to skip every question
Войти в полноэкранный режим

Выйти из полноэкранного режима

4- установить http библиотека

Вы можете установить пакет узла, используя npm install команда

npm i http
Войти в полноэкранный режим

Выйти из полноэкранного режима


Dockerfile для приложения HAProxy и Node.js

Мы будем использовать докер для запуска серверов HAProxy и Node.js, и мы будем тестировать наше приложение с помощью простых HTTP-запросов.


Dockerfile для приложения Node

Вы можете скопировать и вставить следующий фрагмент, чтобы создать образ докера для приложения node.js.

FROM node:13
WORKDIR /home/node/app
COPY app /home/node/app
RUN npm install
CMD npm run app
Войти в полноэкранный режим

Выйти из полноэкранного режима

Чтобы создать образ докера, используйте следующую команду:

docker build -t nodeapp .
Войти в полноэкранный режим

Выйти из полноэкранного режима


Dockerfile для HAProxy

FROM haproxy
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
CMD ["haproxy", "-f", "/usr/local/etc/haproxy/haproxy.cfg"]
Войти в полноэкранный режим

Выйти из полноэкранного режима

Чтобы создать образ докера, используйте следующую команду:

docker build -t haproxy .
Войти в полноэкранный режим

Выйти из полноэкранного режима


Тестовые образы Docker

Вы можете протестировать образы докеров, используя docker run команда.

docker run -p 8080:8080 nodeapp
Войти в полноэкранный режим

Выйти из полноэкранного режима

Это запустит наше приложение node.js на порту 8080. Вы можете использовать curl просьба протестировать приложение.

curl -v localhost:8080
Войти в полноэкранный режим

Выйти из полноэкранного режима


Докер сочиняет

Написать это инструмент для определения и запуска мультиконтейнерных Докер Приложения. С Написатьвы используете файл YAML для настройки служб вашего приложения.
источник

#docker-compose.yml
version: "3"
services:
  app1:
    image: app
    environment:
      - PORT=1111
    ports:
      - "1111:1111"
  app2:
    image: app
    environment:
      - PORT=2222
    ports:
      - "2222:2222"
  app3:
    image: app
    environment:
      - PORT=3333
    ports:
      - "3333:3333"
  haproxy:
    image: haproxy
    ports:
      - "80:80"
    volumes:
      - ./haproxy:/usr/local/etc/haproxy
Войти в полноэкранный режим

Выйти из полноэкранного режима

Введите следующую команду, чтобы запустить все приложение (node.js и сервер haproxy):

docker compose up
Войти в полноэкранный режим

Выйти из полноэкранного режима

Это запустит все приложение, и теперь вы можете протестировать приложение, выполняя простые HTTP-запросы. HAProxy по умолчанию использует циклический алгоритм для обработки того, какие серверы будут выбраны при поступлении запросов.

Пример логов в докере:

haproxy_test-app1-1     | { address: '0.0.0.0', family: 'IPv4', port: 1111 }
haproxy_test-app3-1     | { address: '0.0.0.0', family: 'IPv4', port: 3333 }
haproxy_test-app2-1     | { address: '0.0.0.0', family: 'IPv4', port: 2222 }
Войти в полноэкранный режим

Выйти из полноэкранного режима

Как видите, мы видим, что наши три приложения node.js запущены, и мы можем сделать запрос.

Вы можете увидеть коды здесь: