Рубрики
Uncategorized

Развертывания с одним tap с Nginx и Docker: настройка для балансировки нагрузки ⚖

Добро пожаловать назад, в предыдущей статье мы кратко представили обратные прокси и как мы могли бы использовать … Tagged with Nginx, Docker, DevOps, Cloud.

Развертывания с одним tap с Nginx и Docker (серия 3 деталей)

Добро пожаловать в ответ, в Предыдущая статья , мы кратко представили обратные прокси и как мы могли бы использовать некоторые из них, а именно Nginx , чтобы загрузить баланс наше приложение для более легкий масштаб и порция Анкет Мы также завершили окончательную архитектуру, которую мы будем после нашего окончательного результата:

Сегодня мы перейдем прямо в основы Nginx , так что сначала убедитесь, что вы установили его на машине.

После того, как вы его установили, мы сможем перейти в папку конфигурации, где на самом деле происходит все магии. Начните с перемещения по этому пути /так далее/nginx/ (Если вы на Linux), вы должны увидеть nginx.conf Файл, запустите его, используя ваш любимый текстовый редактор, и давайте посмотрим там. Файл не является пустым, и в нем уже есть некоторые конфигурации по умолчанию, давайте удаляем все и начнем с нуля.

Мы узнаем сегодня 3 основные настройки :

  1. Обслуживание локальных файлов
  2. Обслуживание размещенного URL
  3. Доступ к нескольким экземплярам через Балансировки нагрузки

Обслуживание локальных файлов

Основной скелет A nginx.conf Файл должен (в большинстве сценариев) содержать эти две директивы.

http {

}

events {

}

Мы оставим События На данный момент пусто и сосредоточьтесь на другой директиве, http Вот где мы будем настраивать Nginx как http -сервер Анкет

Прежде чем мы продолжим, обратите внимание, что мы останавливаемся и запустим Nginx несколько раз, когда применяем изменения в conf Файл, поэтому, если Nginx еще не работает, запустите его, используя nginx командование Если он уже работает, и нам нужно перезапустить его, нам придется остановить это, используя nginx -s Stop команда, а затем запустите его еще раз, используя nginx . Если вы в Linux, убедитесь, что вы запускаете эти команды в повышенном гранте, используя судо .

Давайте добавим HTTP -сервер, который слушает в порте 8080 :

http {
    server {
        listen 8080;        
    }
}

events { }

Сохраните файл, перезапустите Nginx и перейдите к Localhost: 8080 , вы должны увидеть следующий экран приветствия:

Nginx вытащил этот статический HTML -файл из пути по умолчанию, потому что мы еще не установили. Сейчас мы установим один, я создал простой HTML -файл с именем index.html в папке под названием Nginx_article На рабочем столе:


  
    CUSTOM NGINX PAGE, YAY!
  

Его полный путь должен быть /home/{myusername}/desktop/Nginx_article/ Помните, я использую Linux, поэтому этот путь может быть немного другим в вашем случае, также не забудьте заменить {myusername} с именем пользователя вашей учетной записи (конечно, без вьющихся скобок). Теперь давайте настроим Nginx, чтобы указать на эту веб -страницу, когда мы нажимаем на номер порта 8080 :

http {
    server {
        listen 8080;
        root /home/{myusername}/Desktop/Nginx_Article/;
    }
}

events { }

Перезагрузить Nginx и Reload Localhost: 8080 , и вы должны увидеть наше index.html красиво подается.

Теперь давай пойдем Уровень выше Что, если у нас есть несколько каталогов, которые нужно подавать, а не один корень? Легкий,

http {

    server {
        listen 8080;

        location /images {
            root /home/{myusername}/Desktop/Nginx_Article_Another_Directory/;
        }

               location /videos {
            root /path/to/another/root/;
        }
    }

}
events { }

Здесь мы использовали корень Директива внутри Место Директива, эта настройка попросит Nginx служить этому каталогу: /home/{myusername}/desktop/nginx_article_another_directory/images в случае Localhost: 8080/Images был запрошен.

Не забудьте создать каталог на вашей машине и, возможно, добавьте несколько изображений для тестирования с просьбой их.

Важное примечание: Каталог /картинки должен иметь index.html Файл, который будет обслуживаться по умолчанию Или Вам придется попросить конкретный файл, например: Localhost: 8080/Images/cat.jpg , и если файлы не сохранены в /картинки , предыдущий запрос вернется Запрещенный статус Анкет

Другим способом отображения пути является использование псевдоним Директива, как показано ниже:

http {

    server {
        listen 8080;

        location /documents {
            alias /home/{myusername}/Desktop/Nginx_Article_Another_Directory/top_secret;
        }
    }

}
events { }

псевдоним Директива попросит Nginx служить этому каталогу: home/{myusername}/desktop/nginx_article_another_directory/top_secret в случае Localhost: 8080/документы был запрошен.

🧾 Давайте суммируем

  1. В случае псевдоним каталог, мы должны предоставить полный путь, по которому Nginx должен был ориентироваться, с другой стороны, корень Каталог только что имел корневой путь каталога, и значение местоположения должно быть добавлено к этому пути.
  2. Нет фактического каталога с именем /документы Внутри Nginx_article_another_directory , мы просто создаем «Псевдоним» для каталога /top_secret Анкет

Обслуживание размещенного URL

Допустим, мы строим обратный прокси для www.example.com , мы хотим, чтобы пользователи просматривали сайт из нашего собственного домена, это можно легко сделать с помощью следующей конфигурации:

http {

    server {
        listen 8080;
        location / {
            proxy_pass http://www.example.com/;
        }
    }

}

events { }

Попробуйте навигацию на Localhost: 8080 После перезапуска nginx вы должны увидеть ту же страницу, что и на example.com.

Это можно использовать так же при обслуживании локально размещенного приложения (в нашем случае Бэкэнд -приложение ), которое доступно через порт 5000 В

http {

    server {
        listen 8080;
        location / {
            proxy_pass http://127.0.0.1:5000/;
        }
    }

}

events { }

Доступ к нескольким экземплярам с помощью балансировки нагрузки

Для этого варианта использования мы собираемся развернуть простое приложение Hello World с минимальной настройкой, все, что вам нужно, это рабочая настройка Docker на вашей машине. Отправляйтесь в свое любимое приложение терминала и раскрутите 3 экземпляра одного и того же приложения, каждый из которых на его Собственный контейнер , мы будем использовать «HelloWorld» Docker Image , который выставлен внутри порта 80 , при запросе, он печатает идентификатор контейнера для ответа:

foo@bar:~$ docker run -p 1111:80 -d strm/helloworld-http
478405720f2106d718edb1602812528ae53011cb196dc3731447c64d0bd8f2ff

foo@bar:~$ docker run -p 1112:80 -d strm/helloworld-http
a374ce45bf07b9747573e7feb1ae9742e72d2a31d74c2da3caa43abd5586a108

foo@bar:~$ docker run -p 1113:80 -d strm/helloworld-http
422efc18f418772cb96ea6088f2f801854ad4da21436da2c485f3ef80cca20ec

Примечание Этот Docker печатает идентификатор каждого контейнера после каждой команды RUN, также заметите, что мы развернули 3 экземпляра приложения, каждый доступный из -за пределов своего корпуса через порты : 1111 , : 1112 , : 1113 Анкет Так, например, чтобы перейти к первому случаю приложения, вам нужно перейти к Localhost: 1111 , и так далее.

Теперь давайте поиграем с conf Файл, чтобы настроить его, чтобы сбалансировать входящую нагрузку на наши 3 экземпляра.

http {

    upstream allinstances{
        server 127.0.0.1:1111;
        server 127.0.0.1:1112;
        server 127.0.0.1:1113;
    }

    server {
        listen 8080;
        location / {

            proxy_pass http://allinstances/;

        }
    }

}

events { }

Похоже, мы добавили новую директиву в нашу колоду, вверх по течению , где наш proxy_pass теперь указывает на.

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

По сути, это говорит Nginx Круглый робин Каждый входящий запрос так, чтобы каждый сервер обслуживал равное количество запросов. Каждый раз, когда вы нажимаете кнопку обновления, вас будут встречаться с другим сервером.

Вы можете проявить творческий подход с Директивой местоположения, возможно, вы захотите разделить пользователей на два proxy_passes , так /странный перейдет к 1111 или 1113 и /даже перейдет к порту 1112 Анкет

Что если ваше приложение сохраняет пользовательские данные в памяти? Затем вам нужно сделать сеанс пользователя «липким», хэшируя IP -адреса пользователей, чтобы гарантированно достигнуто того же сервера, пока его IP -адрес не изменился:

upstream allinstances{
    ip_hash; # << Will hash the user's IP address and resolve to a single server
    server 127.0.0.1:1111;
    server 127.0.0.1:1112;
    server 127.0.0.1:1113;
}

После добавления ip_hash Команда, независимо от того, сколько вы обновляете страницу, вы всегда будете обслуживаться одним и тем же сервером.

Я думаю, что теперь у вас есть основы, которые могут вас поднять. В нашем Следующая статья Мы будем упаковывать всю установку в контейнеры (включая NGINX) и развернуть ее через один Docker-Compose командование

Я хотел бы закончить это маленькой, но мощной цитатой Оскара Уайльда, «Опыт — это имя, которое все дают своим ошибкам».

Продолжайте в том же духе 🚀.

Развертывания с одним tap с Nginx и Docker (серия 3 деталей)

Оригинал: «https://dev.to/paulafahmy/one-tap-deployments-with-nginx-and-docker-configuring-for-load-balancing-56b»