Використовуємо офіційний docker-образ NGINX в InfoboxCloud: частина 1

За останній рік в Docker Hub стало доступно вже більше 100 000 образів, а завантажувалися образи з Docker Hub вже більше 300 мільйонів разів. З них більше 20 мільйонів завантажень припали на 70 офіційних образів розробників Docker, таких як Oracle, CentOS і NGINX.

NGINX використовується на понад 40% найбільших сайтів у світі, не тільки як веб-сервер, але і як реверс-проксі сервер, балансувальник навантаження і HTTP кеш. Офіційний образ NGINX був завантажений 3.4 мільйона разів.



У цій статті ви дізнаєтеся:
  • як розгорнути і використовувати Docker-образ з NGINX.
  • як швидко розгорнути реверс-проксі на NGINX і кілька сайтів в Docker
  • як розгорнути геораспределенную інсталяцію, яка складається з декількох сайтів і реверс-проксі в кожному з 3х регіонів InfoboxCloud.
Якщо раніше ви не використовували Docker, рекомендується до прочитання:
Використовуємо Docker і не хвилюємося про vendor-lock
Занурюємося в Docker: Dockerfile і комунікація між контейнерами
Огляд нововведень Docker Engine з 1.0 до 1.8. Введення в Docker Compose

У кінці статті ми роздаємо пробні версії InfoboxCloud безкоштовно.

Підготовка оточення

1. Створіть сервер з CentOS 7 для установки Docker InfoboxCloud. Для роботи Docker зараз необхідна саме віртуальна машина, тому при створенні сервера обов'язково встановіть галочку «Дозволити управління ядром ОС».

Як правильно створити сервер в InfoboxCloud для DockerЯкщо у вас ще немає доступу в InfoboxCloud – замовте його.

Після реєстрації ви отримаєте дані для доступу до панелі управління на email. Увійдіть в панель управління за адресою: https://panel.infobox.ru

В розділі «Хмарна інфраструктура» вашої підписки натисніть «Новий сервер» (при необхідності підписка змінюється в правому верхньому кутку у випадаючому меню).



Задайте потрібні параметри сервера. Обов'язково виділіть сервера 1 публічний IP–адресу і встановіть галочку «Дозволити управління ядром ОС», як показано на скріншоті нижче.



У списку доступних операційних систем виберіть CentOS 7 і завершіть створення сервера.



Після цього дані для доступу до сервера прийдуть вам на електронну пошту.

Після створення сервера з CentOS 7 підключіться до нього по SSH.

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

Виконайте команду для установки Docker і Compose:
bash <(curl-s http://repository.sandbox.infoboxcloud.ru/scripts/docker/centos7/install.sh)

Після цього docker і compose будуть встановлені. Можна створити образ з встановленим docker панелі управління, натиснувши на сервер і далі «Створити образ».

Після цього образу з Docker можна буде створювати нові сервера і не виконувати цей крок повторно.

Створення стерпного оточення

Наше переноситься оточення складається з:
  • Dockerfile – файл, що описує процес побудови контейнера
  • docker-compose.yml — файл, що описує процес запуску контейнера або набору контейнерів
  • файлів сайту в директорії html
  • файлів конфігурації nginx в директорії conf
Краще тримати переноситься оточення в репозиторії наприклад на github, при оновленні файлів сайту або конфігурації перебудовувати контейнер. Це дозволить бути впевненими, що при необхідності ви зможете переразвернуть налаштований на сайті за лічені хвилини. Також ви можете швидко піднімати сайт в окремому контейнері для розробки.

Для роботи з git встановіть його на сервері.
yum install-y git

Скопіюйте наше просте переноситься оточення з github командою:
git clone https://github.com/InfoboxHosting/DockerNginxSimpleStaticSite.git

Перейдіть в директорію оточення командою:
cd DockerNginxSimpleStaticSite/

Побудуйте образ Docker допомогою команди
docker-compose build

Розкрийте образ в контейнер командою
docker-compose up-d

Спробуйте зайти на сервер по IP. Преднастроенный статичний сайт був успішно розгорнуто.



Якщо виконати
docker ps
можна побачити на сайті в списку контейнерів.



Давайте розберемося, з чого складається переноситься оточення.



У файліconf/nginx.conf знаходиться конфігурація nginx:
nginx.conf
user www-data;
worker_processes 1;
pid /run/nginx.pid;

events {
worker_connections 4086;
use epoll;
multi_accept on;
}

http {

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;

access_log/var/log/nginx/access.log;
error_log/var/log/nginx/error.log;

gzip on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css-text/xml text/javascript application/x-javascript application/xml;
gzip_disable "msie6";

include/etc/nginx/conf.d/*.conf;
include/etc/nginx/sites-enabled/*;

server {
listen 80;
server_name domain.tld www.domain.tld;

location / {
root /usr/share/nginx/html;
}
}
}


, де domain.tld потрібно замінити на домен вашого сайту.

Конфігурація веб-сервера сайту зберігається в переносимом оточенні, завдяки чому при розгортанні не потрібно заново налаштувати веб-сервер.

Докорінно стерпного оточення перебуває Dockerfile, який використовує офіційний образ NGINX і додає в нього ваш сайт з папки html і конфігурацію NGINX з папкиconf.

FROM nginx

MAINTAINER Yuri Trukhin "trukhinyuri@infoboxcloud.com"

COPY conf/nginx.conf /etc/nginx/nginx.conf
COPY html/ /usr/share/nginx/html


Детальніше про Dockerfile було розказано статті.

Також в корені папки стерпного оточення створіть файлdocker-compose.yml з наступним вмістом:
sitename:
build: .
ports:
- 80:80
restart: always

У ньому сказано, що потрібно розгортати оточення sitename, спершу побудувавши його з Dockerfile в тій же директорії. Порт 80 контейнера необхідно прокинути на порт 80 хоста. У разі падіння NGINX рестартовать його.

Детальніше про Compose було розказано статті.
Якщо ви зміните сайт або файл конфігурації nginx – просто відновити образ командою
docker-compose build

Потім розгорніть образ в контейнер:
docker-compose up-d


Нам не потрібно кожен раз хвилюватися про налаштування сервера. Одного разу розроблене переноситься оточення з Docker дозволить швидко робити розгортання.

Для виконання рекомендацій з наступного розділу зупиніть і видаліть розгорнутий контейнер, оскільки він займає порт 80 на хості, який нам знадобиться.

Для цього виконайте:
docker ps

Скопіюйте в буфер обміну container_id.
Зупиніть контейнер командою:
docker stop bc88ee61a933

, де замість bc88ee61a933 вставити ваш container_id.
Видаліть контейнер:
docker rm bc88ee61a933

, де замість bc88ee61a933 вставити ваш container_id.

Розгортаємо кілька сайтів з реверс-проксі

В даному розділі ми розгорнемо кілька статичних сайтів з різними доменами і реверс-проксі. Для виконання цієї частини статті вам знадобиться направити на ip–адресу сервера ваші домени DNS:
  • А-запис domain1.tld потрібно направити на виділений публічний IP–адреса вашого сервера. domain1.tld – домен першого сайту.
  • А-запис domain2.tld потрібно направити на виділений публічний IP–адреса вашого сервера. domain2.tld – домен другого сайту.
Необхідні ip–адреси можна знайти на панелі управління InfoboxCloud.



Що робити, якщо у вас немає доменів
Варіант 1. Налаштуйте hosts

Цей варіант відмінно підходить для тестування, але буде працювати тільки з вашого комп'ютера.

Додайте записи про домени в файл hosts вашого комп'ютера.
В OS X і Linux додати записи в файл/etc/hosts.



У Windows потрібно запустити блокнот від імені адміністратора. Для цього у полі пошуку введіть Notepad або «Блокнот» (у російській версії Windows) і виберіть пункт запустити від імені адміністратора.



Відкрийте файл C:\Windows\System32\drivers\etc\hosts. Якщо в блокноті він буде не видно — виберіть поруч з кнопкою «Відкрити» тип файлів «Всі файли».



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



Після тестів не забудьте видалити ці записи з файлу hosts.

Варіант 2. Придбайте необхідні домени
Наприклад, це можна зробити тут.


Тепер підключіться до сервера з Docker в InfoboxCloud по SSH.
Клонуйте підготовлений репозиторій для 2х сайтів з балансировщиком навантаження.
cd ~

git clone https://github.com/InfoboxHosting/DockerNginxSimpleBalancer.git




Перейдіть в директорію стерпного оточення балансувальника:
cd ~/DockerNginxSimpleBalancer/balancer

Запустіть побудова балансувальника і залежних образів однією командою:
docker-compose build

Розгорніть балансувальник і залежні образи:
docker-compose up-d

Примітка: файли docker-compose.yml у папках кожного з фронтендов в даному прикладі не використовуються.

Відкрийте в браузері домен першого сайту:



Тепер перевірте, що коректно відкривається і другий сайт:



Щоб сайти відкривалися не з прописаним domain1.com і domain2.com у ваших/etc/hostsпотрібно поправити файл~/DockerNginxSimpleBalancer/balancer/conf/nginx.conf:

nginx.conf
user www-data;
worker_processes 1;
pid /run/nginx.pid;

events {
worker_connections 4086;
use epoll;
multi_accept on;
}

http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;

access_log/var/log/nginx/access.log;
error_log/var/log/nginx/error.log;

gzip on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css-text/xml text/javascript application/x-javascript application/xml;
gzip_disable "msie6";

include/etc/nginx/conf.d/*.conf;
include/etc/nginx/sites-enabled/*;

server {
listen 80;
server_name domain1.com www.domain1.com;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://frontend1:80;
}
}
server {
listen 80;
server_name domain2.com www.domain2.com;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://frontend2:80;
}
}
}


Замініть domain1.com і domain2.com на адреси сайтів, перекомпілюйте програму \ образ і переразверните контейнер:
cd ~/DockerNginxSimpleBalancer/balancer

docker-compose build

docker-compose up-d


Розгортаємо кілька геораспределенных сайтів

Створіть по серверу з docker в кожному з регіонів InfoboxCloud: Москва, Санкт-Петербург, Амстердам як показано в розділі «Підготовка оточення» і встановіть git командою:
yum install-y git

Як підключити додаткові регіони хмарипанелі управління перейдіть на головну сторінку і натисніть «Замовити нову послугу».



Виберіть послугу «Хмарні сервери».



Виберіть регіон і завершіть процес замовлення до кінця.



Підключення додаткових регіонів безкоштовно, але потрібно, щоб на рахунку було більше 500 рублів.

Перемикатися між регіонами можна в правому верхньому куті на панелі керування в випадаючому меню.



Для виконання цієї частини статті вам знадобиться направити на ip–адресу сервера ваші домени DNS:
  • 3 запису A для вашого домену першого сайту, кожна з яких буде вказувати на сервер в Москві, Амстердамі і Санкт-Петербурзі відповідно.
  • 3 запису A для вашого домену другого сайту, кожна з яких буде вказувати на сервер в Москві, Амстердамі і Санкт-Петербурзі відповідно.
  • запис виду Аspb.domain.com вказує на сервері в Санкт-Петербурзі. Замість domain.com потрібно використовувати ваш службовий домен.
  • запис А виду msk.domain.com вказує на сервері в Москві. Замість domain.com потрібно використовувати ваш службовий домен.
  • запис виду Аams.domain.com вказує на сервері в Амстердамі. Замість domain.com потрібно використовувати ваш службовий домен.


Необхідні ip–адреси можна знайти на панелі управління InfoboxCloud.

Збережіть підготовлені переносяться оточення на кожен із серверів:
git clone https://github.com/InfoboxHosting/DockerNginxGeoRedundantBalancer.git


На кожному із серверів відредагуйте файл~/DockerNginxGeoRedundantBalancer/balancer/conf/nginx.conf замініть domain1.com на ім'я домену першого сайту, domain2.com на ім'я домену другого сайту, domain.com на ім'я службового домену.

Замість ручного перейменування можна виконати команду на кожному з серверів:
bash ~/DockerNginxGeoRedundantBalancer/rename.sh domain.com domain1.com domain2.com

, в якій замість domain.com вкажіть ім'я службового домену замість domain1.com – ім'я першого сайту, domain2.com – ім'я другого сайту.

Оригінальний nginx.conf
user www-data;
worker_processes 1;
pid /run/nginx.pid;

events {
worker_connections 4086;
use epoll;
multi_accept on;
}

http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;

access_log/var/log/nginx/access.log;
error_log/var/log/nginx/error.log;

gzip on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css-text/xml text/javascript application/x-javascript application/xml;
gzip_disable "msie6";

include/etc/nginx/conf.d/*.conf;
include/etc/nginx/sites-enabled/*;

upstream frontend1 {
#!!!replace domain.com
#!!!remove backup word in your location
server spb.domain.com:8000 backup;
server msk.domain.com:8000 backup;
server ams.domain.com:8000 backup;
}
upstream frontend2 {
#!!!replace domain.com
#!!!remove backup word in your location
server spb.domain.com:8001 backup;
server msk.domain.com:8001 backup;
server ams.domain.com:8001 backup;
}

server {
listen 80;
#!!!replace domain1.com
server_name domain1.com www.domain1.com;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://frontend1;
}
}
server {
listen 80;
#!!!replace domain2.com
server_name domain2.com www.domain2.com;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://frontend2;
}
}
}


nginx.conf після внесення змін для Амстердама
user www-data;
worker_processes 1;
pid /run/nginx.pid;

events {
worker_connections 4086;
use epoll;
multi_accept on;
}

http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;

access_log/var/log/nginx/access.log;
error_log/var/log/nginx/error.log;

gzip on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css-text/xml text/javascript application/x-javascript application/xml;
gzip_disable "msie6";

include/etc/nginx/conf.d/*.conf;
include/etc/nginx/sites-enabled/*;

upstream frontend1 {
#!!!replace domain.com
server spb.plugndo.com:8000 backup;
server msk.plugndo.com:8000 backup;
server ams.plugndo.com:8000;
}
upstream frontend2 {
#!!!replace domain.com
server spb.plugndo.com:8001 backup;
server msk.plugndo.com:8001 backup;
server ams.plugndo.com:8001;
}

server {
listen 80;
#!!!replace domain1.com
server_name site1.plugndo.com www.site1.plugndo.com;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://frontend1;
}
}
server {
listen 80;
#!!!replace domain1.com
server_name site2.plugndo.com www.site2.plugndo.com;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://frontend2;
}
}
}



nginx.conf після внесення змін для Санкт-Петербурга
user www-data;
worker_processes 1;
pid /run/nginx.pid;

events {
worker_connections 4086;
use epoll;
multi_accept on;
}

http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;

access_log/var/log/nginx/access.log;
error_log/var/log/nginx/error.log;

gzip on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css-text/xml text/javascript application/x-javascript application/xml;
gzip_disable "msie6";

include/etc/nginx/conf.d/*.conf;
include/etc/nginx/sites-enabled/*;

upstream frontend1 {
#!!!replace domain.com
server spb.plugndo.com:8000;
server msk.plugndo.com:8000 backup;
server ams.plugndo.com:8000 backup;
}
upstream frontend2 {
#!!!replace domain.com
server spb.plugndo.com:8001;
server msk.plugndo.com:8001 backup;
server ams.plugndo.com:8001 backup;
}

server {
listen 80;
#!!!replace domain1.com
server_name site1.plugndo.com www.site1.plugndo.com;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://frontend1;
}
}
server {
listen 80;
#!!!replace domain1.com
server_name site2.plugndo.com www.site2.plugndo.com;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://frontend2;
}
}
}



nginx.conf після внесення змін для Москви
user www-data;
worker_processes 1;
pid /run/nginx.pid;

events {
worker_connections 4086;
use epoll;
multi_accept on;
}

http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;

access_log/var/log/nginx/access.log;
error_log/var/log/nginx/error.log;

gzip on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css-text/xml text/javascript application/x-javascript application/xml;
gzip_disable "msie6";

include/etc/nginx/conf.d/*.conf;
include/etc/nginx/sites-enabled/*;

upstream frontend1 {
#!!!replace domain.com
server spb.plugndo.com:8000 backup;
server msk.plugndo.com:8000;
server ams.plugndo.com:8000 backup;
}
upstream frontend2 {
#!!!replace domain.com
server spb.plugndo.com:8001 backup;
server msk.plugndo.com:8001;
server ams.plugndo.com:8001 backup;
}

server {
listen 80;
#!!!replace domain1.com
server_name site1.plugndo.com www.site1.plugndo.com;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://frontend1;
}
}
server {
listen 80;
#!!!replace domain1.com
server_name site2.plugndo.com www.site2.plugndo.com;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://frontend2;
}
}
}


Тепер для Москви передите у відповідну папку:
cd DockerNginxGeoRedundantBalancer/balancerMSK/

Для Амстердама передите у відповідну папку:
cd DockerNginxGeoRedundantBalancer/balancerAMS/

Для Санкт-Петербурга:
cd DockerNginxGeoRedundantBalancer/balancerSPB/


На кожному із серверів запустіть команди
docker-compose build

і
docker-compose up-d


Тепер можна зайти на кожен з сайтів і перевірити їх доступність:





Тепер з панелі управління вимкніть сервер в будь-якому з регіонів. Сайти, як і раніше доступні.
Вимикати сервер у другому регіоні. Сайти, як і раніше доступні.

Поки доступний хоч один сервер — сайти будуть працювати. Якщо запит потрапив на вимкнений сервер, всі сучасні браузери роблять спробу послати запит на інший сервер DNS. У результаті через кілька секунд сайт відкриється.

Зробити процес розгортання серверів і сайтів в декількох регіонах повністю автоматичним можна з допомогою Ansible.
Частина 1.
Частина 2.
Частина 3.
Частина 4.
Частина 5.

Як отримати тестову версію InfoboxCloud безкоштовно?

Надішліть нам ваша адреса електронної пошти та ПІБ на trukhinyuri@infoboxcloud.comу відповідь ви отримаєте дані для доступу до панелі управління. Ви можете тестувати новий регіон хмари протягом 15 днів, далі можна перейти на повну версію хмари. Замовити безкоштовну пробну версію можна до 5 вересня 2015 року.

Якщо у вас є питання або зауваження, пишіть нам і ми з радістю відповімо.

Якщо ви не можете залишати коментарі на Хабре, напишіть нам Співтоваристві.

Успішного використання NGINX і Docker InfoboxCloud!

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.