Развертывания с одним tap с Nginx и Docker (серия 3 деталей)
Добро пожаловать в ответ, в Предыдущая статья , мы кратко представили обратные прокси и как мы могли бы использовать некоторые из них, а именно Nginx , чтобы загрузить баланс наше приложение для более легкий масштаб и порция Анкет Мы также завершили окончательную архитектуру, которую мы будем после нашего окончательного результата:
Сегодня мы перейдем прямо в основы Nginx , так что сначала убедитесь, что вы установили его на машине.
После того, как вы его установили, мы сможем перейти в папку конфигурации, где на самом деле происходит все магии. Начните с перемещения по этому пути /так далее/nginx/
(Если вы на Linux), вы должны увидеть nginx.conf
Файл, запустите его, используя ваш любимый текстовый редактор, и давайте посмотрим там. Файл не является пустым, и в нем уже есть некоторые конфигурации по умолчанию, давайте удаляем все и начнем с нуля.
Мы узнаем сегодня 3 основные настройки :
- Обслуживание локальных файлов
- Обслуживание размещенного URL
- Доступ к нескольким экземплярам через Балансировки нагрузки
Обслуживание локальных файлов
Основной скелет 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/документы
был запрошен.
🧾 Давайте суммируем
- В случае
псевдоним
каталог, мы должны предоставить полный путь, по которому Nginx должен был ориентироваться, с другой стороны,корень
Каталог только что имел корневой путь каталога, и значение местоположения должно быть добавлено к этому пути. - Нет фактического каталога с именем
/документы
Внутри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»