Когда SSL/TLS прекращается до NGINX



 
Задача

Вам требуется выполнять перенаправление в HTTPS, однако у вас ис- тек срок SSL/TLS на уровне перед NGINX.

Решение

Чтобы выяснить, требуется ли вам выполнить перенаправление, вос- пользуйтесь стандартным заголовком X-Forwarded-Proto:

server {

listen 80 default_server;

listen [::]:80 default_server; server_name _;

 
if ($http_x_forwarded_proto = 'http') { return 301 https://$host$request_uri;

}

}

 

Данная конфигурация во многом схожа с перенаправлением HTTPS. Тем не менее в данной конфигурации мы выполняем перенаправле- ние, только когда значение заголовка X-Forwarded-Proto эквивалентно HTTP.

Обсуждение

Достаточно распространен случай, когда у вас может завершиться срок действия SSL/TLS на некоем уровне перед NGINX. Одной из при- чин может быть то, что вы делаете нечто подобное сбережению затрат на вычисления. Тем не менее вам требуется быть уверенным, что все запросы являются HTTPS, но при этом сам уровень с прекращенным SSL/TLS не имеет возможности перенаправления. Он способен, однако, устанавливать заголовки посредника. Эта конфигурация работает с та- кими уровнями, как Amazon Web Services Elastic Load Balancer, который выполняет разгрузку SSL/TLS без дополнительных затрат. Это удобный трюк для обеспечения защиты вашего HTTP-трафика.


 

7.11. Строгая безопасность доставки HTTP

Задача

 
Вам требуется проинформировать браузеры, что им никогда не сле- дует отправлять запросы поверх HTTP.

Решение

Воспользуйтесь расширением HSTS (HTTP Strict Transport Security),

устанавливая заголовок Strict-Transport-Security:

add_header Strict-Transport-Security max-age=31536000;

 

Данная конфигурация устанавливает значение заголовка Strict- Transport-Security на максимальный возраст в один год. Он будет инст- руктировать соответствующий браузер всегда осуществлять некое внут- реннее перенаправление при попытке выполнения к данному домену запросов HTTP, чтобы все запросы выполнялись поверх HTTPS.

Обсуждение

 
Для некоторых приложений один перехваченный атакой с челове- ком в середине запрос HTTP может стать концом всей компании. Если сообщение некой содержащей чувствительную информацию формы отправляется по HTTP, перенаправление HTTPS из NGINX не спасет вас; взлом уже произошел. Данный вариант улучшения безопасности информирует браузер запросов никогда не делать никаких запросов HTTP, а следовательно, они никогда не отправляются в незащищенном виде.

См. также:

https://tools . ietf . org/html/rfc6797https://www.owasp.org/index.php/HTTP_Strict_Transport_Security_Cheat_Sheet

 

7.12. Удовлетворение любого числа методов безопасности

Задача

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


 

Решение

 
Для указания того, что вы желаете удовлетворять неким или даже всем применяемым методам безопасности, для выдачи NGINX инст- рукции об этом примените директиву satisfy:

 

location / {

satisfy any;

 

allow 192.168.1.0/24; deny all;

 

 
auth_basic               "closed site"; auth_basic_user_file conf/htpasswd;

}

 

 

Данная конфигурация сообщает NGINX, что запрашивающий location/ пользователь должен удовлетворять одному из установленных мето- дов безопасности: либо эти запросы должны происходить с блока CIDR 192.168.1.0/24, либо быть способными поддерживать некие имя пользо- вателя и пароль, которые могут быть найдены в обозначенном файле conf/htpasswd. Данная директива satisfy имеет всего два варианта: any или all.

 

Обсуждение

Описанная директива satisfy является великолепным способом пред- ложения множества способов аутентификации для вашего веб-при- ложения. Определяя any для директивы satisfy, данный пользователь обязан соответствовать одной из предоставленных защит. Определяя в директиве satisfy значение all, запрашивающий пользователь дол- жен соответствовать всем выставленным требованиям безопасности. Данная директива может применяться совместно с http_access_module, описанном в рецепте 7.1, http_auth_basic_module, детализированном в рецепте 6.1, http_auth_request_module, описанном в рецепте 6.2 и пред- ставленном в рецепте 6.3 http_auth_jwt_module. Обсуждаемая директива satisfy поможет вам достичь этого для местоположений и серверов, ко- торые требуют глубоких правил защиты.


 

7.13. Динамичное ослабление DDoS

Задача

Вам необходимо динамичное ослабление DDoS (Distributed Denial of Service).

Решение

Для создания поддерживающего кластер ограничения скорости запросов и автоматического черного списка воспользуйтесь NGINX Plus:

limit_req_zone  $remote_addr zone=per_ip:1M rate=100r/s sync; # Cluster-aware rate limit

limit_req_status 429;

 

keyval_zone zone=sinbin:1M timeout=600 sync;

# Cluster-aware "sin bin" with # 10-minute TTL

 
keyval $remote_addr $in_sinbin zone=sinbin;

# Populate $in_sinbin with

# matched client IP addresses

 

server {

listen 80; location / {

if ($in_sinbin) {

set $limit_rate 50; # Restrict bandwidth of bad clients

}

 

limit_req zone=per_ip;

# Apply the rate limit here error_page 429 = @send_to_sinbin;

# Excessive clients are moved to # this location

proxy_pass http://my_backend;

}

 

location @send_to_sinbin {

rewrite ^ /api/3/http/keyvals/sinbin break;


 

                                                            7.13. Динамичное ослабление DDoS v 101

# Set the URI of the # "sin bin" key-val

proxy_method POST;

proxy_set_body '{"$remote_addr":"1"}'; proxy_pass http://127.0.0.1:80;

}

 

 
location /api/ { api write=on;

# directives to control access to the API

}

}

 

Обсуждение

 
Это решение использует некий синхронизируемый предел частот обращений и синхронизируемое хранилище ключ/значение для дина- мических откликов на DDoS атаки и смягчения их действия. Параметр sync, предоставленный директивам limit_req_zone и keyval_zone, синхро- низирует зону общей памяти с другими компьютерами в активном-ак- тивном кластере NGINX Plus. Данный пример выявляет клиентов, кото- рые отправляют более 100 запросов в секунду вне зависимости от того, какой из узлов NGINX Plus получает такой запрос. После того как некий клиент превышает установленный предел частот, его IP адрес добавля- ется в некое хранилище ключ/значение Sin Bin (Скамейка штрафников) через выполнение запроса API NGINX Plus. Эта Скамейка штрафников синхронизируется по всему кластеру. Последующие запросы от попада- ющих на Скамейку штрафников клиентов являются предметом очень низкого ограничения полосы пропускания, причем вне зависимости от того, какой из узлов NGINX Plus получает их. Ограничение полосы пропускания более предпочтительно, чем полное отклонение запро- сов, ибо оно не становится очевидным сигналом для такого клиента, что смягчение DDoS атаки вступило в действие. После 10 мин данный клиент автоматически удаляется со Скамейки штрафников.


 


 
Глава 8


 

HTTP/2


8.0. Введение

 
HTTP/2 является основной ревизией протокола HTTP. Большая часть выполненной в этой версии работы сосредоточена на его транспортном уровне, например разрешение мультиплексирования полного запроса и отклика поверх отдельного подключения TCP. За счет применения сжатия полей заголовка HTTP были достигнуты высокие показатели эффективности, к тому же была добавлена поддержка приоритетов для запросов. Другим крупным добавлением в этот протокол стала возмож- ность для конкретного сервера активно доставлять сообщения своему клиенту. В данной главе описываются подробности базовой конфигу- рации для включения в NGINX HTTP/2, а также настройки поддержки gRPC и активной доставки сервера HTTP/2.

8.1. Базовая настройка

Задача

Вы желаете воспользоваться преимуществами HTTP/2.

Решение

Включите HTTP/2 в своем сервере NGINX:

server {

listen 443 ssl http2 default_server;

 

ssl_certificate server.crt; ssl_certificate_key server.key;

...


 


 

Обсуждение


8.2. gRPC v 103


 
Для включения HTTP/2 вам просто требуется добавить соответствую- щий параметр http2 к своей директиве listen. Однако подвох в том, что, хотя сам протокол и не требует обертки своего подключения в SSL/TLS, некоторые реализации клиентов HTTP/2 поддерживают исключитель- но HTTP/2 поверх шифрованных подключений. Еще одно предосте- режение состоит в том, что в самой спецификации HTTP/2 несколько комплектов шифров TLS 1.2 занесено в черный список и, следователь- но, будут отказывать при квитировании (handshake). Применяемые в NGINX по умолчанию шифры не находятся в этом черном списке. Что- бы проверить, что ваша установка правильная, можно установить под- ключаемый модуль для браузеров Chrome и Firefox, который указывает, когда какой-либо сайт применяет HTTP/2 или из командной строки при помощи утилиты nghttp.

См. также:

 
https://tools.ietf.org/html/rfc7540#appendix-Ahttps://chrome.google.com/webstore/detail/http2-and-spdy-indicator/mpbpobff

lnpcgagjijhmgnchggcjblin

https://addons.mozilla.org/en-US/ fi refox/addon/http2-indicator/

 

8.2. gRPC

Задача

Вам требуется прекратить, проинспектировать, маршрутизировать или осуществить балансировку нагрузки вызовов метода gRPC.

Решение

Для посредничества (прокси) подключений gRPC воспользуйтесь

NGINX.

server {

listen 80 http2;

 

location / {

grpc_pass grpc://backend.local:50051;

}


 

104 v Глава 8. HTTP/2                                                                                            

 
В этой конфигурации NGINX слушает порт 80 для HTTP/2-трафика без шифрования, а также выступает посредником для машины с названием backend.local на порту 50051. Установленная директива grpc_pass указы- вает NGINX на необходимость рассматривать такое подключение как некий вызов gRPC. Указание grpc:// в самом начале местоположения нашего бэкенд-сервера не требуется; тем не менее это непосредствен- но указывает на то, что данное бэкенд-подключение не шифруется.

Чтобы воспользоваться шифрованием TLS между клиентом и NGINX

и прерывать такое шифрование перед передачей вызова серверу при- ложений, включите SSL и HTTP/2, как вы это делали в первом разделе:

server {

listen 443 ssl http2 default_server;

 

ssl_certificate server.crt; ssl_certificate_key server.key; location / {

grpc_pass grpc://backend.local:50051;

}

 
}

 

Данная конфигурация прекращает TLS в NGINX и передает соответ- ствующее взаимодействие gPRC в имеющееся приложение поверх не- зашифрованного HTTP/2.

Для настройки NGINX на шифрование всего взаимодействия gRPC со своим сервером приложения предоставьте повсеместное шифрование трафика, просто изменив имеющуюся директиву grpc_pass, определив grpcs:// перед уже имеющейся информацией о сервере (обратите вни- мание на добавление символа s, обозначающего безопасное взаимо- действие):

grpc_pass grpcs://backend.local:50051;

 

Вы также можете применять NGINX для маршрутизации вызовов к различным серверным службам на основе значения URI gRPC, которые включают пакеты, службы и методы. Для этого воспользуйтесь дирек- тивой location.

location /mypackage.service1 {

grpc_pass grpc://backend.local:50051;

}

location /mypackage.service2 {


 

8.2. gRPC v 105

grpc_pass grpc://backend.local:50052;

}

location / {

root /usr/share/nginx/html; index index.html index.htm;

 
}

 

 
Данный пример конфигурации применяет директиву location для направления входящего трафика HTTP/2 между двумя обособлен- ными службами gRPC, а также location для обслуживания статическо- го содержимого. Вызовы метода для установленной службы mypackage. service1 направляются в сервер backend.local по порту 50051, а вызовы для mypackage.service2  отправляются в порт 50052. location  /, перехватывают все прочие запросы HTTP и обслуживают статическое содержимое. Это демонстрирует, как NGINX способно обслуживать gRPC и не-gRPC под одной и той же конечной точкой HTTP/2 и выполнять маршрутизацию надлежащим образом.

Вызовы балансировки нагрузки также похожи на трафик HTTP без

gRPC:

upstream grpcservers {

server backend1.local:50051; server backend2.local:50051;

}

server {

listen 443 ssl http2 default_server;

 

ssl_certificate server.crt; ssl_certificate_key server.key; location / {

grpc_pass grpc://grpcservers;

}

}

 

Обсуждение

NGINX обладает возможностью получать, выступать посредником, выполнять балансировку нагрузки, осуществлять маршрутизацию и прекращать шифрование для вызовов gRPC. Имеющийся модуль gRPC позволяет NGINX устанавливать, изменять или сбрасывать заголов- ки вызова gRPC, выставлять тайм-ауты для запросов и устанавливать


 

106 v Глава 8. HTTP/2                                                                                            

 
спецификации восходящего SSL/TLS. Так как gRPC выполняет взаимо- действие поверх протокола HTTP/2, вы можете настроить NGINX на прием gRPC и не-gRPC веб-трафика в одной и той же конечной точке.

8.3. Сервер активной доставки HTTP/2

Задача

Вам требуется активно доставлять своему клиенту содержимое упреж- дающим образом.

Решение

Воспользуйтесь функциональностью NGINX активной доставки HTTP/2.

server {

listen 443 ssl http2 default_server;

 

 
ssl_certificate server.crt; ssl_certificate_key server.key; root /usr/share/nginx/html;

 

location = /demo.html { http2_push /style.css; http2_push /image1.jpg;

}

}

 

Обсуждение

Для применения активной доставки сервера HTTP/2 ваш сервер обя- зан быть настроенным для HTTP/2, как это было нами сделано в ре- цепте 7.1. Здесь вы можете указать NGINX на необходимость упреждаю- щей активной доставки определенных файлов при помощи директивы http2_push. Эта директива получает один параметр, значение полного пути URI того файла, который активно доставляется вашему клиенту.

NGINX также способно автоматически активно доставлять клиентам

ресурсы, если выступает посредником (прокси) в приложениях, содер- жащих некий заголовок отклика HTTP с названием Link. Такой заголо- вок имеет возможность указывать NGINX на упреждающую загрузку предписанных ресурсов. Чтобы включить данную функциональность, добавьте в настройки NGINX http2_push_preload on;.


 

Глава 9

Управление сложными потоками медиа

9.0. Введение

 
В этой главе рассматриваются медиапотоки через NGINX в форматах MPEG-4 или Flash Video. NGINX широко применяется для массивно- го распространения и потокового содержимого. NGINX поддерживает форматы стандартов отрасли и потоковые технологии, которые будут обсуждены в данной главе. NGINX Plus делает возможным фрагменти- рование содержимого на лету при помощи модуля HTTP Live Stream, а также возможность доставки HTTP Dynamic Streaming, который уже является фрагментированным типом медиа. NGINX естественным образом допускает пределы для полос пропускания, а расширенные свойства NGINX Plus предлагают пределы скорости передачи битов, что делает возможной доставку наиболее действенным способом при ре- зервировании имеющихся ресурсов сервера для охвата большего числа пользователей.

9.1. Обслуживание MP4 и FLV

Задача

Вам требуется отправлять поток цифровых данных, изначально пред- ставленных в формате MPEG-4 (MP4) или Flash Video (FLV).

Решение

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


 

 
108 v Глава 9. Управление сложными потоками медиа                                             

http {

server {

...

 

location /videos/ { mp4;

}

location ~ \.flv$ { flv;

}

}

}

 

Блок местоположения данного примера сообщает, что файлы в ката- логе videos представлены в формате с типом MP4 и могут направляться потоком с поддержкой прогрессивной выгрузки. Второй блок местопо- ложения указывает NGINX, что все файлы, завершающиеся на .flv, пред- ставлены в формате FLV и могут направляться потоком с поддержкой псевдопотоков HTTP.

 
Обсуждение

Потоковые видео- и аудиофайлы в NGINX являются неким образцом отдельной директивы. Прогрессивная выгрузка делает возможным для клиента инициировать воспроизведение таких медиа до того, как завершится выгрузка всего файла. NGINX поддерживает операции поиска по неким пока не выгруженным порциям этих медиа в обоих форматах.

9.2. Организация потоков с помощью HLS

Задача

Вам требуется поддержка HTTP Live Streaming (HLS) для кодирован- ного H.264/AAC содержимого, упакованного в файлы MP4.

Решение

Воспользуйтесь модулем HLS NGINX Plus с сегментацией в реальном масштабе времени, пакетизацией и мультиплексированием, а также с контролем буферизации фрагментов и др. в качестве аргументов пере- направления HLS:


 

                                                    9.2. Организация потоков с помощью HLS   v 109

location /hls/ {

hls; # Use the HLS handler to manage requests

 

 
# Serve content from the following location alias /var/www/video;

# HLS parameters hls_fragment 4s;

hls_buffers              10 10m; hls_mp4_buffer_size 1m; hls_mp4_max_buffer_size  5m;

}

 

 
Данный блок местоположения демонстрирует направления NGINX для потоков медиа HLS из каталога /var/www/video, причем с фрагмен- тированием медиа на сегменты по четыре секунды. Общее число буфе- ров HLS устанавливается в 10 с размером по 10 Мб. Начальный размер буфера MP4 устанавливается в 1 Мб с максимальным значением в 5 Мб.

Обсуждение

Доступный в NGINX Plus модуль HLS предоставляет свои возможно- сти для мультиплексирования транспортировки файлов с медиа MP4 на лету. Существует множество директив, которые предоставляют вам воз- можностьконтроля над тем, как фрагментируются и буферизуются ваши медиа. Определенный блок местоположения должен быть настроен для обслуживания медиа как некоего потока HLS с соответствующим об- работчиком HLS. Значение фрагментации HLS устанавливается в числе секунд, что указывает NGINX на необходимость фрагментирования по длине времени. Общее число буферируемых данных устанавливается с помощью директивы hls_buffers, определяющей количество буферов и их размер. Данному клиенту разрешается начинать воспроизведение его медиа после осуществления накопления буферизации определен- ного объема, определяемого hls_mp4_buffer_size. Однако может потребо- ваться больший размер буфера, если метаданные для этого видео могут превышать первоначальный размер буфера. Такой объем блокируется сверху значением hls_mp4_max_buffer_size. Эти переменные буферизации позволяют NGINX оптимизировать практику, получаемую конечным пользователем; выбор правильных значений для этих директив требует знания целевой аудитории и ваших медиа. Например, если имеющиеся пачки ваших медиа составляют видеофайлы, а ваша целевая аудитория имеет широкую полосу пропускания, можете выполнить оптимизацию


 

110  v Глава 9. Управление сложными потоками медиа                                                      

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

9.3. Организация потоков с помощью HDS

Задача

Вам требуется поддержка HDS (HTTP Dynamic Streaming) Adobe, кото-

рый уже был фрагментирован и обособлен от своих метаданных.

Решение

Для предложения своим пользователям Adobe Adaptive Streaming

 
воспользуйтесь модулем поддержки файлов FLV (F4F) из NGINX Plus:

location /video/ {

alias /var/www/transformed_video; f4f;

f4f_buffer_size 512k;

}

 

Данный пример указывает NGINX Plus на необходимость обслужи- вать изначально фрагментированное видео из некоего местоположе- ния на диске своему клиенту при помощи модуля F4F NGINX Plus. Зна- чение размера буфера для его индексного файла (.f4x) устанавливается в 512 Кб.

Обсуждение

Модуль F4F позволяет NGINX обслуживать для конечных пользова- телей изначально фрагментированные медиа. Сама настройка этого проста и состоит в применении обработчика F4F внутри некоего блока местоположения HTTP. Значение директивы f4f_buffer_size настраивает величину размера буфера для файла индексации данного типа медиа.

9.4. Пределы полосы пропускания

Задача

Вам требуется лимитировать полосу пропускания нисходящего ме- диапотока клиентов без воздействия на практику их просмотра.


 

                                                              9.4. Пределы полосы пропускания v 111

 
Решение

Примените поддержку побитовой скорости NGINX Plus для файлов медиа MP4:

location /video/ { mp4;

mp4_limit_rate_after 15s; mp4_limit_rate         1.2;

}

 

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

Обсуждение

 
Ограничение скорости обмена NGINX Plus позволяет вашему пото- ковому серверу динамично ограничивать полосу пропускания для все- го подлежащего обслуживанию медиафайла, позволяя клиентам вы- грузку даже быстрее, чем им это требуется, чтобы обеспечить некую бесшовную практику пользователям. Обсуждаемый обработчик MP4, описанный в рецепте 9.1, озаглавливает этот блок местоположения для форматов MP4 медиа. Ограничивающие скорость директивы, такие как mp4_limit_rate_after, задают NGINX ограничивать скорость трафика только через указанное время в секундах. Другой директивой, вовле- ченной в ограничение скорости MP4, является mp4_limit_rate, которая определяет значение скорости обмена данными для медиа. Значение 1, предоставляемое для директивы mp4_limit_rate, означает, что NGINX ограничивает полосу пропускания скоростью воспроизведения это- го типа медиа (1/1). Предоставление для данной директивы значения mp4_limit_rate, большего единицы, позволит пользователям выполнять выгрузку быстрее, чем они просматривают, с тем чтобы они были спо- собны осуществлять буферизацию медиа и незаметно просматривать его в процессе его выгрузки.


 


Глава 10


 

Развертывание


В облачных решениях

10.0.

 
Введение

Появление поставщиков облачных решений изменило ландшафт хо- стинга веб-приложений. Такой процесс, как подготовка новой маши- ны раньше занимал часы или месяцы; теперь ее можно создать мак- симально быстро, как щелчок мышью или API-вызов. Эти облачные провайдеры сдают в аренду свои виртуальные машины – эта модель носит название инфраструктура как услуга (IaaS) – или управляемые программные решения, такие как базы данных, по модели pay-per-use, что означает, что вы платите только за то, что используете. Это позво- ляет инженерам создавать целые среды для тестирования в любой мо- мент и отключать их, когда они больше не нужны. Облачные провайде- ры также позволяют приложениям масштабироваться по горизонтали в зависимости от потребности в производительности в любой момент. В этой главе рассматриваются базовые развертывания с использовани- ем NGINX и NGINX Plus на нескольких основных платформах облачных провайдеров.

 

10.1. Автоматическая настройка в AWS

Задача

Вам нужно автоматизировать настройку серверов NGINX в Amazon Web Services, чтобы машины могли автоматически настраивать сами себя.


 

                                                        10.1. Автоматическая настройка в AWS v 113

Решение

 
Используйте UserData, а также предварительно настроенный образ машины Amazon. Создайте образ машины Amazon (AMI) с NGINX и лю- быми установленными пакетами программного обеспечения. Исполь- зуйте UserData для настройки любых специфичных для среды конфигу- раций во время выполнения.

Обсуждение

Есть три модели мышления при выполнении настройки на AWS.

Настройка при загрузке

 
Начните с обычного образа Linux, затем запустите управление конфигурацией или сценарии оболочки во время загрузки для настройки сервера. Этот шаблон медленно запускается и может быть подвержен ошибкам.

Полностью настроенные образы машины Amazon

Полностью настройте сервер, затем запишите образ машины Amazon для использования. Этот шаблон запускается очень бы- стро и аккуратно. Тем не менее он менее гибок по отношению окружающей его среде, и поддержание множества образов может быть сложным.

Частично настроенные образы машины Amazon

Это смесь двух миров. Частично настроенный образ – когда требо- вания к программному обеспечению устанавливаются и записы- ваются в образ машины Amazon, а настройка среды выполняется во время загрузки. Этот шаблон является гибким по сравнению с предыдущим шаблоном и быстрым по сравнению с настройкой при загрузке.

Если вы решите частично или полностью настроить свои образы, этот процесс можно автоматизировать. Чтобы собрать конвейер сборки об- разов машины Amazon, предлагается использовать несколько инстру- ментов:

Управление конфигурациями

Инструменты управления конфигурацией определяют состояние сервера в коде, например какую версию NGINX следует запускать


 

 
114  v Глава 10. Развертывание в облачных решениях                                                        

и от какого пользователя он должен работать, какой DNS-реша- тель использовать и куда выполнять проксирование. Этот код управления конфигурациями может располагаться в системе управления версиями как программный проект. Популярные ин- струменты управления конфигурациями – Ansible, Chef, Puppet и SaltStack, которые были описаны в главе 5.

Packer от компании HashiCorp

Packer используется для автоматизации управления конфигура- циями практически на любой виртуальной или облачной плат- форме, а также для записи образа машины в случае успешного запуска. В основном Packer создает виртуальную машину на вы- бранной вами платформе, отправляет SSH-пакеты в виртуальную машину, запускает любую заданную вами настройку и записыва- ет образ. Можно использовать Packer для запуска инструмента управления конфигурациями и надежной записи образа машины в соответствии с вашими требованиями.

 

 
Для подготовки конфигураций среды во время загрузки можно ис- пользовать UserData для запуска команд в первый раз, когда экземпляр загружается. Если вы берете частично настроенный образ, можно вос- пользоваться этим для настройки элементов среды во время загрузки. Примерами конфигураций на основе среды могут быть имена серве- ров, которые нужно прослушивать, резолвер, который будет исполь- зоваться, доменное имя для проксирования или пул вышестоящих серверов.

UserData – это строка в кодировке base64, которая скачивается при

первой загрузке и запуске. UserData может быть такой же простой, как и файл окружения, доступ к которому осуществляется другими процес- сами начальной загрузки в вашем образе машины Amazon, или же это может быть скрипт, написанный на любом языке, который существует в образе.

Обычно UserData – это bash-скрипт, который определяет перемен- ные или скачивает переменные для передачи их в управление конфи- гурациями. Управление конфигурациями обеспечивает правильную настройку системы, вырабатывает шаблоны файлов конфигурации на базе переменных среды и выполняет перезагрузку служб. После запуска UserData ваша машина с NGINX должна быть полностью настроена очень надежным образом.


 

                                                  10.2. Маршрутизация в узлы NGINX без ELB v 115

10.2. Маршрутизация в узлы NGINX без ELB

Задача

Вам необходимо маршрутизировать трафик в несколько активных узлов NGINX или создать отработку отказа «активный-пассивный» для достижения высокой доступности без балансировщика нагрузки перед NGINX.

 
Решение

Используйте DNS-сервис Amazon Route53 для маршрутизации в не- сколько активных узлов NGINX или настройте проверку работоспособ- ности и отработку отказа между активно-пассивным набором узлов NGINX.

Обсуждение

 
DNS в течение долгого времени выполнял балансировку нагрузки между серверами; переход в облако не меняет этого. Сервис Route53 от Amazon предоставляет DNS-службу с большим количеством расширен- ных функций, доступных через API. Доступны все типичные приемы DNS, такие как несколько IP-адресов в одной записи A и взвешенные записи A.

При работе нескольких активных узлов NGINX вам понадобится ис-

пользовать одну из этих функций записи A, чтобы распределить на- грузку по всем узлам. Алгоритм циклического перебора используется, когда для одной записи А указаны несколько IP-адресов. Взвешенное распределение может использоваться для неравномерного распределе- ния нагрузки путем определения весов для каждого IP-адреса сервера в записи A.

Одной из наиболее интересных особенностей Route53 является воз-

можность проверки работоспособности. Вы можете настроить Route53 для мониторинга работоспособности конечной точки, установив TCP- соединение или отправив запрос через HTTP или HTTPS. Проверку работоспособности легко настроить с помощью параметров для IP-ад- реса, имени хоста, порта, пути URI, интервалов, мониторинга и гео- графии. С помощью этих проверок работоспособности Route53 может вывести IP из ротации, если он начинает отказывать. Вы также можете настроить Route53 на аварийное переключение на вторичную запись в случае сбоя, что приведет к настройке «активный–пассивный» с высо- кой доступностью.


 

 
116  v Глава 10. Развертывание в облачных решениях                                                        

Route53 имеет геологическую функцию маршрутизации, которая позволит вам направлять своих клиентов к ближайшему к ним узлу NGINX с наименьшей задержкой. При маршрутизации по географии ваш клиент направляется в ближайшее работоспособное физическое местоположение. При запуске нескольких наборов инфраструктуры в конфигурации «активный–активный» вы можете автоматически пере- ключаться на другое геологическое местоположение с помощью прове- рок работоспособности.

При использовании Route53 DNS для маршрутизации трафика в узлы

 
NGINX в группе автоматического масштабирования вам понадобится автоматизировать создание и удаление записей DNS. Чтобы автома- тизировать добавление и удаление машин NGINX в Route53 по мере масштабирования узлов NGINX, можно использовать стадии жизнен- ного цикла автоматического масштабирования от Amazon для запуска сценариев в самом NGINX или скрипты, работающие независимо на Amazon Lambda. Эти скрипты будут использовать интерфейс команд- ной строки или набор средств разработки Amazon для взаимодействия с API Amazon Route53, чтобы добавлять или удалять IP-адреса машины NGINX и настроенные проверки работоспособности при загрузке или до ее завершения.

См. также:

https://docs.nginx.com/nginx/deployment-guides/amazon-web-services/route-53-global-server-load-balancing/

10.3. NLB-сэндвич

Задача

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

Решение

Создайте балансировщик сетевой нагрузки (NLB). Во время создания NLB через консоль вам будет предложено организовать новую целевую группу. Если вы не сделаете это через консоль, вам нужно будет создать этот ресурс и подключить его к слушателю на NLB. Вы организовываете группу автоматического масштабирования с конфигурацией запуска, которая обеспечивает экземпляр EC2 с установленным NGINX с откры-


 

                                                      10.4. Развертывание из AWS Marketplace v 117

тым исходным кодом. Группа автоматического масштабирования име- ет конфигурацию для связи с целевой группой, которая автоматически регистрирует любой экземпляр в группе автоматического масштабиро- вания в целевой группе, настроенной при первой загрузке. На целевую группу ссылается слушатель в NLB. Поместите ваши вышестоящие при- ложения за другим балансировщиком сетевой нагрузки и целевой груп- пой, а затем настройте NGINX для проксирования в NLB приложения.

Обсуждение                              

 
Этотраспространенный шаблон называется NLB-сэндвичем (рис. 10.1). Он помещает NGINX с открытым исходным кодом в группу автомати- ческого масштабирования позади NLB, а группу автоматического мас- штабирования приложения – позади другого NLB. Причина наличия NLB между каждым уровнем заключается в том, что балансировщик сетевой нагрузки очень хорошо работает с группами автоматического масштабирования; они автоматически регистрируют новые узлы и уда- ляют те, которые были прерваны, а также выполняют проверки работо- способности и передают трафик только исправным узлам. Возможно, потребуется создать второй внутренний NLB для уровня NGINX с от- крытым исходным кодом, потому что это позволяет сервисам в вашем приложении вызывать другие сервисы через группу автоматического масштабирования NGINX, не выходя из сети и не возвращаясь через общедоступный NLB. Это ставит NGINX в центр всего сетевого трафика вашего приложения, что делает его основой маршрутизации трафика вашего приложения. Этот паттерн раньше называли сэндвичем с эла- стичным балансировщиком нагрузки (ELB); однако балансировщик се- тевой нагрузки предпочтительнее при работе с NGINX, потому что он является балансировщиком нагрузки уровня 4, тогда как ELB и баланси- ровщик нагрузки приложения находятся на уровне 7. Балансировщики нагрузки уровня 7 преобразуют запрос через прокси-протокол и резер- вируются с использованием NGINX. Этот шаблон необходим только для NGINX с открытым исходным кодом, поскольку набор функций, предо- ставляемый NLB, доступен в NGINX Plus.

10.4. Развертывание из AWS Marketplace

Задача

Вам нужно с легкостью запускать NGINX Plus в AWS по лицензии с оплатой по факту потребления.


 

118 v Глава 10. Развертывание в облачных решениях                                               

 

Рис. 10.1. Здесь изображен NGINX в виде шаблона NLB-сэндвич с внутренним балансировщиком сетевой нагрузки для использования внутренними приложениями. Пользователь отправляет запрос в приложение-1, которое отправ- ляет запрос в приложение-2 через NGINX, чтобы выполнить запрос пользователя

 

Решение

Выполните развертывание через AWS Marketplace. Посетите сайт AWS Marketplace (https://aws.amazon.com/marketplace) и введите в поисковую строку «NGINX Plus» (рис. 10.2). Выберите образ машины Amazon на базе выбранного вами дистрибутива Linux; ознакомьтесь с деталями, усло- виями и ценами; затем нажмите на кнопку Continue (Продолжить). На


 

                             10.5. Создание образа виртуальной машины NGINX в Azure v 119

следующей странице вы сможете принять условия и развернуть NGINX Plus одним щелчком мыши или принять условия и использовать образ машины Amazon.

 

Рис. 10.2. Поиск NGINX на сайте AWS Marketplace

Обсуждение

Решение AWS Marketplace для развертывания NGINX Plus обеспечи- вает простоту использования и лицензию с оплатой по факту потребле- ния. Вам не только не нужно ничего устанавливать, но у вас также есть лицензия без лишней нервотрепки, такой как получение заказа на по- купку для годичной лицензии. Это решение позволяет вам опробовать NGINX Plus без каких-либо обязательств. Вы также можете использовать образ машины NGINX Plus Marketplace в качестве емкости переполне- ния. Обычной практикой является приобретение лицензий на ожида- емую рабочую нагрузку и использование образа машины Marketplace в группе автоматического масштабирования в качестве емкости пере- полнения. Эта стратегия гарантирует, что вы платите только за то, что используете.

10.5. Создание образа виртуальной машины

NGINX в Azure

Задача

Вам нужно создать образ виртуальной машины (ВМ) собственного сервера NGINX, настроенного так, как вы считаете нужным, чтобы быст-


 

120 v Глава 10. Развертывание в облачных решениях                                               

ро создать больше серверов или использовать их в наборах масшта- бирования.

Решение

 
Создайте виртуальную машину из базовой операционной системы по вашему выбору. После того как она загрузится, войдите в систему и установите NGINX или NGINX Plus по вашему выбору либо из исходно- го кода, либо через инструмент управления пакетами для дистрибути- ва, который вы используете. Настройте NGINX по своему усмотрению и создайте новый образ виртуальной машины. Чтобы создать образ виртуальной машины, для начала нужно сделать ее универсальной. Для этого необходимо удалить пользователя, подготовленного Azure, подключиться к нему по протоколу SSH и выполнить приведенную ниже команду:

$ sudo waagent -deprovision + user -force

 

 
Эта команда удаляет пользователя, которого подготовил Azure при создании виртуальной машины. Опция -force просто пропускает шаг подтверждения. После того как вы установили NGINX или NGINX Plus и удалили подготовленного пользователя, вы можете выйти из сеанса. Подключите интерфейс командной строки Azure к своей учетной записи Azure с помощью команды входа в Azure, а затем убедитесь, что вы используете режим диспетчера ресурсов Azure. Теперь выключите

виртуальную машину и высвободите ресурсы:

$ azure vm deallocate -g <ResourceGroupName> \

-n <VirtualMachineName>

 

После этого вы сможете пометить ее как универсальную с помощью команды azure vm generalize:

$ azure vm generalize -g <ResourceGroupName> \

-n <VirtualMachineName>

 

После того как ваша виртуальная машина станет универсальной, вы можете создать образ. Приведенная ниже команда создаст образ, а так- же сгенерирует шаблон диспетчера ресурсов Azure (ARM), который вы будете использовать для загрузки этого образа:

$ azure vm capture <ResourceGroupName> <VirtualMachineName> \

<ImageNamePrefix> -t <TemplateName>.json


 

                             10.5. Создание образа виртуальной машины NGINX в Azure v 121

 
Командная строка выдаст сообщение о том, что ваш образ создан, что он сохраняет шаблон ARM в указанном вами месте и запрос завершен. Вы можете использовать этот шаблон для создания другой виртуальной машины из вновь созданного образа. Однако, чтобы использовать этот шаблон, созданный Azure, необходимо сначала создать новый сетевой интерфейс:

$ azure network nic create <ResourceGroupName> \

<NetworkInterfaceName> \

<Region> \

--subnet-name <SubnetName> \

--subnet-vnet-name <VirtualNetworkName>

 

Эта команда выводит подробную информацию о недавно созданном сетевом интерфейсе. Первая строка выходных данных будет идентифи- катором сетевого интерфейса, который вам понадобится для исполь- зования шаблона ARM, созданного Azure. Получив идентификатор, вы можете создать развертывание с помощью шаблона ARM:

$ azure group deployment create <ResourceGroupName> \

<DeploymentName> \

-f <TemplateName>.json

 

 
Вам будет предложено ввести несколько переменных ввода, таких как vmName, adminUserName, adminPassword и networkInterfaceId. Введите имя виртуальной машины, а также имя пользователя и пароль администра- тора. Используйте идентификатор сетевого интерфейса, полученный из последней команды, в качестве входных данных для приглашения networkInterfaceId. Эти переменные будут переданы в качестве парамет- ров в шаблон ARM и использованы для создания новой виртуальной ма- шины из созданного вами пользовательского образа NGINX или NGINX Plus.

После ввода необходимых параметров Azure приступит к созданию

новой виртуальной машины из вашего собственного образа.

Обсуждение

Создание пользовательского образа в Azure позволяет делать копии предварительно настроенного сервера NGINX или NGINX Plus по жела- нию. Шаблон ARM позволяет быстро и надежно развертывать этот же сервер снова и снова по мере необходимости. Используя путь к образу виртуальной машины, который можно найти в шаблоне, можно созда-


 

122  v Глава 10. Развертывание в облачных решениях                                                        

вать различные наборы инфраструктуры, такие как наборы масштаби- рования виртуальных машин или другие виртуальные машины с раз- личными конфигурациями.

См. также:

 
https://docs . microsoft . com/en-us/cli/azure/install-azure-cli ? view = azure-cli-latesthttps://docs . microsoft . com/en-us/cli/azure/authenticate-azure-cli ? view = azure-cli-latesthttps://docs . microsoft . com/en-us/azure/virtual-machines/linux/capture-im-

age ? toc =%2 Fazure %2 Fvirtual-machines %2 Flinux %2 Ftoc . json

10.6.

 
Балансировка нагрузки поверх наборов масштабирования NGINX в Azure

Задача

Вам необходимо масштабировать узлы NGINX за балансировщиком нагрузки Azure, чтобы добиться высокой доступности и динамического использования ресурсов.

Решение

Создайте балансировщик нагрузки Azure, который является обще- доступным или внутренним. Разверните образ виртуальной машины NGINX, созданный в предыдущем разделе, или образ NGINX Plus из Marketplace, описанный в рецепте 10.7, в набор для масштабирования виртуальных машин Azure (VMSS). После развертывания балансиров- щика нагрузки и VMSS настройте внутренний пул балансировщика на- грузки в VMSS. Установите правила балансировки нагрузки для портов и протоколов, на которые вы хотите принимать трафик, и направьте их во внутренний пул.

Обсуждение

Обычно NGINX масштабируется для достижения высокой доступно- сти или обработки пиковых нагрузок без чрезмерного выделения ре- сурсов. В Azure этого можно достичь с помощью VMSS. Использование балансировщика нагрузки Azure обеспечивает простоту управления для добавления и удаления узлов NGINX в пул ресурсов при масштаби- ровании. С помощью балансировщиков нагрузки Azure можно прове- рить работоспособность своих внутренних пулов и передавать трафик только на исправные узлы. Вы можете запустить внутренние баланси-


 

                                                10.7. Развертывание через Azure Marketplace v 123

 
ровщики нагрузки Azure перед NGINX, где вы хотите разрешить доступ только через внутреннюю сеть. Можно использовать NGINX, чтобы пе- редать запрос внутреннему балансировщику нагрузки, находящемуся в приложении VMSS, с помощью балансировщика нагрузки для простоты регистрации и ее отмены в пуле.

10.7. Развертывание через Azure Marketplace

Задача

Вам нужно с легкостью запустить NGINX Plus в Azure с лицензией с оплатой по факту использования.

Решение

Разверните образ виртуальной машины NGINX Plus через Azure Marketplace:

1.

 
На информационной панели Azure выберите значок New (Новый) и используйте строку поиска, чтобы ввести туда слово «NGINX». Появятся результаты поиска.

2. Из списка выберите образ виртуальной машины NGINX Plus, опу-

бликованный NGINX, Inc.

3. При появлении запроса на выбор модели развертывания выбери- те параметр Resource Manager (Диспетчер ресурсов) и нажмите кнопку Create (Создать).

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

5. Как только эта форма будет заполнена, можете нажать OK. Ваша форма будет подтверждена.

6. При появлении запроса выберите размер виртуальной машины и нажмите кнопку Select (Выбрать).

7. На следующей панели у вас есть возможность выбрать допол- нительные конфигурации, которые будут использоваться по умолчанию в зависимости от группы ресурсов, выбранной ра- нее. После изменения этих параметров и их принятия нажмите кнопку ОК.


 

124  v Глава 10. Развертывание в облачных решениях                                                        

8.

 
На следующем экране просмотрите сводку. У вас есть возмож- ность загрузить эту конфигурацию как шаблон ARM, чтобы иметь возможность быстрее создавать эти ресурсы с помощью шаблона JSON.

9. После того как вы проверите и загрузите свой шаблон, можно на- жать OK, чтобы перейти к приобретению. На экране вы увидите уведомление о расходах, которые вы понесете в связи с исполь- зованием этой виртуальной машины. Нажмите кнопку Purchase (Купить), и ваш NGINX Plus начнет загружаться.

Обсуждение

 
Azure и NGINX упростили создание виртуальной машины NGINX Plus в Azure с помощью всего лишь нескольких форм конфигурации. Azure Marketplace – отличный способ получить NGINX Plus по требованию с лицензией с оплатой по факту использования. С помощью этой модели можно опробовать функции NGINX Plus или использовать его для ем- кости переполнения по требованию ваших уже лицензированных сер- веров NGINX Plus.

 

10.8. Развертывание в Google Compute Engine

Задача

Вам необходимо создать сервер NGINX в Google Compute Engine, что- бы осуществлять балансировку нагрузки или выступать в качестве по- средника (proxy) для остальных своих ресурсов в Google Compute или App Engine.

Решение

Запустите новую виртуальную машину в Google Compute Engine. Вы- берите имя для своей виртуальной машины, зоны, тип машины и за- грузочного диска. Настройте управление идентификацией и доступом, брандмауэр и любые дополнительные конфигурации, которые вам нужны. Создайте виртуальную машину.

После ее создания войдите в систему через SSH или через Google Cloud Shell. Установите NGINX или NGINX Plus с помощью менеджера пакетов для данного типа ОС. Настройте NGINX, как считаете нужным, и перезагрузите.


 

                                                        10.9. Создание образа Google Compute v 125

Кроме того, вы можете установить и настроить NGINX с помощью сценария запуска Google Compute Engine, который является дополни- тельным параметром конфигурации при создании виртуальной маши- ны.

Обсуждение

 
Google Compute Engine предлагает настраиваемые виртуальные ма- шины в любой момент. Запуск виртуальной машины требует небольших усилий и открывает целый мир возможностей. Google Compute Engine предлагает организацию сетей и вычисления в виртуальной облачной среде. Имея экземпляр Google Compute, у вас есть все возможности сер- вера NGINX, где бы и когда бы он вам ни понадобился.

10.9. Создание образа Google Compute

Задача

Вам нужно создать образ Google Compute, чтобы быстро сделать экземпляр виртуальной машины или шаблон экземпляра для группы экземпляров.

Решение

Создайте виртуальную машину, как описано в рецепте 10.8. После установки и настройки NGINX на экземпляре виртуальной машины установите для состояния автоматического удаления загрузочного дис- ка значение false. Чтобы установить состояние автоматического уда- ления диска, отредактируйте виртуальную машину. На странице Edit (Правка) под конфигурацией диска установлен флажок Delete boot disk when instance is deleted (Удалить загрузочный диск при удалении экземпляра). Снимите этот флажок и сохраните конфигурацию вир- туальной машины. Как только состояние автоматического удаления эк- земпляра будет установлено в false, удалите экземпляр. При появлении запроса не устанавливайте флажок, предлагающий удалить загрузоч- ный диск. После выполнения этих задач у вас останется неприкреплен- ный загрузочный диск с установленным NGINX.

После того как ваш экземпляр удален и у вас есть неприкрепленный

загрузочный диск, вы можете создать образ Google Compute. В разделе Image (Образ) консоли Google Compute Engine выберите Create Image (Создать образ). Вам будет предложено указать имя образа, семейство,


 

 
126  v Глава 10. Развертывание в облачных решениях                                                        

описание, тип шифрования и источник. Тип источника, который вам нужно использовать, – это диск; и для исходного диска выберите не- прикрепленный загрузочный диск NGINX. Выберите Create (Создать), и Google Compute Cloud создаст образ из вашего диска.

Обсуждение

Можно использовать образы Google Cloud для создания виртуаль- ных машин с загрузочным диском, идентичным только что созданному серверу. Ценность создания образов заключается в том, чтобы гаранти- ровать, что каждый экземпляр этого образа идентичен. При установ- ке пакетов во время загрузки в динамической среде, если только вы не используете блокировку версий с закрытыми репозиториями, вы ри- скуете не проверить версию пакета и обновления до запуска в произ- водственной среде. Используя образы машины, вы можете проверить, что каждый пакет, работающий на этой машине, соответствует вашим требованиям, что повышает надежность предложения услуги.

См. также:                                                       

https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images

 

10.10. Создание прокси-сервера для Google App Engine

Задача

Вам нужно создать прокси-сервер для Google App Engine, чтобы пере- ключать контексты между приложениями или обслуживать HTTPS в настраиваемом домене.

Решение

Используйте NGINX в Google Compute Cloud. Создайте виртуальную машину в Google Compute Engine или образ виртуальной машины с установленным NGINX и сделайте шаблон экземпляра с этим образом в качестве загрузочного диска. Если вы создали шаблон экземпляра, то нужна и группа экземпляров, которая использует этот шаблон.

Выполните настройку NGINX. Убедитесь, что вы используете прото- кол HTTPS, потому что Google App Engine является общедоступным, и вы должны убедиться, что не отключаете HTTPS на вашем экземпля-


 

 
                                 10.10. Создание прокси - сервера для Google App Engine v 127

ре NGINX и не позволяете информации перемещаться между NGINX и Google App Engine без защиты. Поскольку App Engine предоставляет только одну конечную точку DNS, вы будете использовать директиву proxy_pass вместо блоков upstream в версии NGINX с открытым исходным кодом.

 
Убедитесь, что конечная точка задана в качестве переменной в NGINX, а затем используйте эту переменную в директиве proxy_pass, чтобы NGINX выполнял DNS-разрешение при каждом запросе. Чтобы NGINX мог выполнять любое разрешение помощью DNS, вам также необходимо использовать директиву resolver и указать свой любимый DNS-резолвер. Google делает IP-адрес 8.8.8.8 доступным для общего пользования. Если вы используете NGINX Plus, можно использовать флаг resolve в директиве server в блоке upstream, активные подключения и другие преимущества восходящего модуля при создании прокси-сер- вера для Google App Engine.

Вы можете сохранить файлы конфигурации NGINX в Google Storage,

а затем использовать сценарий запуска для своего экземпляра, чтобы извлечь конфигурацию во время загрузки. Это позволит вам изменить конфигурацию без необходимости записывать новый образ. Тем не ме- нее это увеличит время запуска вашего сервера NGINX.

Обсуждение

Вы хотите запустить NGINX перед Google App Engine, если использу- ете собственный домен, и сделать свое приложение доступным через HTTPS. В настоящее время Google App Engine не позволяет загружать собственные сертификаты SSL. Поэтому, если вы хотите обслуживать свое приложение в домене, отличном от appspot.com, с шифрованием, вам необходимо создать прокси-сервер с помощью NGINX для прослу- шивания в своем пользовательском домене. NGINX будет шифровать связь между собой и вашими клиентами, а также между собой и Google App Engine.

Еще одна причина, по которой вам может потребоваться запустить

NGINX перед Google App Engine, – это размещение большого количества приложений App Engine в одном домене и использование NGINX для переключения контекста на основе URI. Микросервисы – это популяр- ная архитектура, и прокси-сервер, такой как NGINX, обычно выполняет маршрутизацию трафика. Google App Engine упрощает развертывание приложений, и вместе с NGINX у вас есть полноценная платформа дос- тавки приложений.


 

Глава 11

 
Контейнеры/Микросервисы

11.0. Введение

 
Контейнеры предлагают уровень абстракции на уровне приложения, сдвигая необходимый процесс установки пакетов и зависимостей из процесса развертывания в процесс сборки. Это важно по той причине, что инженеры теперь снаряжают элементы кода, которые исполняются и снабжаются единообразным способом вне зависимости от имеющейся среды. Предложение контейнеров как исполняемых элементов снижа- ет значение риска путаницы зависимостей и настроек между средами. Принимая это во внимание, организации получают большой импульс для развертывания своих приложений в платформах контейнеров. При запуске приложения в платформе обычно размещают в контейнерах все, что позволяет имеющийся стек, включая вашего посредника и ба- лансировщик нагрузки. NGINX и NGINX Plus запросто помещаются в контейнер и доставляются ими. Они также содержат множество функ- ций, которые делают доставку приложений в контейнерах более под- вижной. Данная глава сосредоточена на сборке образов контейнеров NGINX и NGINX Plus, свойствах, которые делают более простой рабо- ту в средах с контейнерами, а также развертывании ваших образов в Kubernetes и OpenShift.

 

11.1. Записи DNS SRV

Задача

Вы бы хотели использовать свою имеющуюся реализацию записей DNS SRV в качестве источника для вышестоящих серверов с помощью NGINX Plus.


 


 

Решение


11.1. Записи DNS SRV v 129


Определите соответствующую директиву службы со значением http для вышестоящего сервера, чтобы указать NGINX на необходимость применения имеющихся записей SRV в качестве пула балансировки нагрузки:

http {

resolver 10.0.0.2;

upstream backend {                                                        zone backends 64k;

server api.example.internal service=http resolve;

}

}

 

 
Данная функциональность присутствует исключительно в NGINX Plus. Эта настройка инструктирует NGINX Plus выполнять разрешение DNS с сервера DNS 10.0.0.2 и настраивать пул вышестоящих серверов в отдельной директиве server. Эта директива определяется с параметром resolve и указывает на необходимость периодически повторно разрезо- лвить имя домена. Параметр service=http и значение сообщают NGINX, что это некая запись SRV, которая содержит список IP-адресов и портов, и обязуют выполнять балансировку нагрузки по ним, если они были на- строены с помощью директивы server.

Обсуждение

Динамичная инфраструктура становится все более популярной бла- годаря спросу и внедрению инфраструктур на облачной основе. Среды с автоматическим масштабированием масштабируются горизонталь- но, увеличивая или уменьшая общее число серверов в имеющемся пуле для соответствия текущей нагрузке. Горизонтальное масштабирование требует балансировщика нагрузки, который способен добавлять или удалять ресурсы из имеющегося пула. Обладая некоей записью SRV, вы снимаете с себя ответственность за отслеживание текущего списка сер- веров и передаете ее DNS. Такой тип настройки чрезвычайно заманчив для сред с контейнерами, так как у вас могут быть контейнеры с изме- няемыми номерами портов, причем, возможно, даже с одним и тем же IP-адресом. Важно также отметить, что полезная нагрузка записи UDP DNS ограничена примерно 512 байтами.


 

130 v Глава 11. Контейнеры / Микросервисы                                                           

11.2.

 
Использование официального образа NGINX

Задача

Вам требуется быстро подготовить к работе образ NGINX из Docker Hub.

Решение

 
Воспользуйтесь имеющимся в Docker Hub образом NGINX. Он со- держит установленные по умолчанию настройки. Вам необходимо либо смонтировать локальный каталог настроек, либо создать файл Dockerfile и встроить свою настройку в сборку образа, чтобы изменить конфигурацию. В нашем случае мы монтируем том, в котором настрой- ки по умолчанию NGINX обслуживают статическое содержимое, чтобы продемонстрировать его возможности при помощи отдельной коман- ды:

$ docker run --name my-nginx -p 80:80 \

-v /path/to/content:/usr/share/nginx/html:ro -d nginx

 

Команда docker извлекает образ nginx:latest из Docker Hub, если не обнаруживает его локально. Затем эта команда запускает данный об- раз NGINX в качестве контейнера Docker, отображая localhost:80 в порт 80 самого контейнера NGINX. Она также монтирует имеющийся локаль- ный каталог /path/to/content/ в качестве тома контейнера в /usr/share/ nginx/html/ с доступом только для чтения. Установленная по умолчанию конфигурация NGINX будет обслуживать этот каталог в качестве стати- ческого содержимого. При отображении из вашей локальной машины в контейнер первым идет значение порта или каталога локальной маши- ны, а порт или каталог самого контейнера идут вторыми.

Обсуждение

NGINX сделал официальный образ Docker, доступный через Docker Hub. Этот официальный образ Docker позволяет легко начать работу в Docker с вашей любимой платформой доставки приложений, NGINX. В данном разделе мы имели возможность запустить NGINX в контей- нере при помощи одной единственной команды! Основная ветвь офи- циального образа Docker NGINX, которой мы воспользовались в данном примере, собрана из образа Docker Debian Jessie. Однако вы также мо-


 

                                                                 11.3. Создание Docker fi le NGINX v 131

жете выбирать официальные образы, собранные из Alpine Linux. Файл Dockerfile и исходные коды для этих официальных образов доступны в GitHub. Вы можете расширить данный официальный образ, создав собственный файл Dockerfile и определив свой официальный образ в соответствующей команде FROM.

См. также:

 
https://hub.docker.com/_/nginx/https://github.com/nginxinc/docker-nginx/

 

11.3. Создание Dockerfile NGINX

Задача

Для сборки образа Docker вам требуется создать файл Dockerfile NGINX.

Решение

 
Начните с FROM для предпочитаемого вами дистрибутива образа Docker. Для установки NGINX воспользуйтесь командой RUN. Чтобы до- бавить свои файлы настроек, примените команду ADD. Чтобы указать Docker открыть заданные порты, прибегните к помощи команды EXPOSE или сделайте это вручную при запуске своего образа в качестве кон- тейнера. После того как ваш образ создаст экземпляр контейнера, для запуска NGINX воспользуйтесь CMD. Вам требуется запустить NGINX в приоритетном режиме. Для этого вам понадобится запустить NGINX при помощи -g "daemon off;" или добавить daemon off; в свои настройки. В данном примере мы будем использовать daemon off; в файле настроек внутри своего основного контекста. Вам также понадобится изменить свои настройки NGINX, чтобы выполнять регистрацию для журналов доступа в /dev/stdout и /dev/stderr для журналов ошибок; таким обра- зом, ваши журналы попадут в руки демона Docker, что сделает их более доступными для вас на основе драйвера журналов, который вы выбра- ли при помощи Docker:

Файл Dockerfile:

FROM centos:7

 

#  Устанавливае м репозитори й epel ,  чтоб ы получит ь ngin x  и установит ь ngin x.


 

132 v Глава 11. Контейнеры / Микросервисы                                                           

 

RUN yum -y install epel-release && \

yum -y install nginx

 

# Добавляем локальные файлы конфигурации в образ.

ADD /nginx-conf /etc/nginx

 

EXPOSE 80 443

 

 
CMD ["nginx"]

 

Получаемая структура каталогов выглядит так:

 
├── Dockerfile

└── nginx-conf

├── conf.d

│ └── default.conf

├── fastcgi.conf

├── fastcgi_params

├── koi-utf

├── koi-win

├── mime.types

├── nginx.conf

├── scgi_params

├── uwsgi_params

└── win-utf

Я решил разместить настройки NGINX целиком внутри данного ката- лога Docker для простоты доступа ко всем его настройкам при помощи всего одной строки в соответствующем файле Dockerfile, чтобы доба- вить все свои настройки NGINX.

 

Обсуждение

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


 

                                                                 11.4. Сборка образа NGINX Plus v 133

11.4. Сборка образа NGINX Plus

Задача

 
Вам требуется собрать образ Docker NGINX Plus для запуска NGINX Plus в среде с контейнерами.

Решение

Для создания образа Docker NGINX Plus воспользуйтесь этим файлом Dockerfile. Вам потребуется выгрузить свои сертификаты репозитория NGINX Plus и держать их в том же каталоге, что и данный Dockerfile с именами nginx-repo.crt и nginx-repo.key соответственно. С их помощью этот Dockerfile сделает всю остальную работу, установив NGINX Plus для вашего использования и связав журналы доступа и ошибок NGINX со сборщиком журналов Docker.

FROM debian:stretch-slim                                              

LABEL maintainer="NGINX <docker-maint@nginx.com>"

 

# Скачиваем сертификат и ключ с портала клиента

#  (https://c s.nginx.com )  и копируе м в контекс т сборк и.

COPY nginx-repo.crt /etc/ssl/nginx/ COPY nginx-repo.key /etc/ssl/nginx/ # Устанавливаем NGINX Plus.

RUN set -x \

&& APT_PKG="Acquire::https::plus-pkgs.nginx.com::" \ && REPO_URL="https://plus-pkgs.nginx.com/debian" \ && apt-get update && apt-get upgrade -y \

&& apt-get install \

--no-install-recommends --no-install-suggests\

-y apt-transport-https ca-certificates gnupg1 \

&& \

NGINX_GPGKEY=573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62;\

found=''; \

for server in \

ha.pool.sks-keyservers.net \ hkp://keyserver.ubuntu.com:80 \ hkp://p80.pool.sks-keyservers.net:80 \


134 v Глава 11. Контейнеры / Микросервисы                                                           

 

pgp.mit.edu \

 
; do \

echo "Fetching GPG key $NGINX_GPGKEY from $server"; \

apt-key adv --keyserver "$server" --keyserver-options \

timeout=10 --recv-keys "$NGINX_GPGKEY" \

&& found=yes \

&& break;\ done;\

test -z "$found" && echo >&2 \

"error: failed to fetch GPG key $NGINX_GPGKEY" && exit 1; \

echo "${APT_PKG}Verify-Peer "true";"\

>> /etc/apt/apt.conf.d/90nginx \

&& echo \

"${APT_PKG}Verify-Host "true";">>\

/etc/apt/apt.conf.d/90nginx \

&& echo "${APT_PKG}SslCert \ "/etc/ssl/nginx/nginx-repo.crt";" >> \

/etc/apt/apt.conf.d/90nginx \

&& echo "${APT_PKG}SslKey \ "/etc/ssl/nginx/nginx-repo.key";" >> \

/etc/apt/apt.conf.d/90nginx \

 
&& printf \

"deb ${REPO_URL} stretch nginx-plus" \

> /etc/apt/sources.list.d/nginx-plus.list \

&& apt-get update && apt-get install -y nginx-plus \ && apt-get remove --purge --auto-remove -y gnupg1 \ && rm -rf /var/lib/apt/lists/*

 

# Перенаправляем журналы запросов сборщику журналов Docker.

RUN ln -sf /dev/stdout /var/log/nginx/access.log \

&& ln -sf /dev/stderr /var/log/nginx/error.log

 

EXPOSE 80

STOPSIGNAL SIGTERM

CMD ["nginx", "-g", "daemon off;"]

 

Чтобы собрать этот файл Dockerfile в образ Docker, выполните приве- денную ниже команду в каталоге, который содержит данный Dockerfile, а также ваши сертификат и ключ репозитория NGINX Plus:

$ docker build --no-cache -t nginxplus .


 

                                          11.5. Использование переменных среды в NGINX   v 135

Данная команда docker build использует флаг --no-cache, чтобы гаран- тировать, что вне зависимости от того, когда вы это создадите, из репо- зитория NGINX Plus будут вытянуты для обновления свежие пакеты NGINX Plus. Если для вас будет допустимо применение той же самой версии NGINX Plus, которую мы собирали ранее, вы можете опустить флаг --no-cache. В этом примере наш новый образ Docker снабжается те- гом nginxplus.

 
Обсуждение

Создавая для NGINX Plus свой собственный образ Docker, вы получае- те возможность настраивать свой контейнер NGINX Plus так, как счита- ете нужным, и переносить его в любую среду Docker. Это открывает всю мощность и расширенную функциональность NGINX Plus для вашей среды контейнеров. Данный файл Dockerfile не использует свойство ADD для добавления настроек; вам придется добавлять свои настройки вручную.

См. также:

https://www.nginx.com/blog/deploying-nginx-nginx-plus-docker/

 

11.5.

 
Использование переменных среды в NGINX

Задача

Вам требуется воспользоваться переменными среды внутри своей конфигурации NGINX чтобы применять один и тот же образ контейне- ра для различных сред.

Решение

Для установки в NGINX переменных из своей среды воспользуйтесь модулем ngx_http_perl_module:

daemon off; env APP_DNS;

include /usr/share/nginx/modules/*.conf;

...

http {

perl_set $upstream_app 'sub { return $ENV{"APP_DNS"}; }'; server {


 

 
136 v Глава 11. Контейнеры / Микросервисы                                                           

 

...

location / {

proxy_pass https://$upstream_app;

}

}

}

 

Чтобы использовать perl_set, нужно, чтобы у вас был установлен ngx_http_perl_module; это можно сделать, загрузив данный модуль дина- мически или статически при сборке из исходного кода. По умолчанию NGINX стирает переменные среды из своего окружения: вам требуется объявлять все переменные, которые вы не желаете удалять, с помощью директивы env. Директива perl_set получает два параметра: имя пере- менной, которую вы бы хотели установить, и строку perl, которая вы- числяет необходимый результат.

Приведенный ниже файл Dockerfile, который динамически загружает

 
ngx_http_perl_module, устанавливает этот модуль из утилиты управления пакетами. При установке модулей из утилиты пакета для CentOS они помещаются в каталог /usr/lib64/nginx/modules/, а файлы настройки, ко- торые динамически загружают эти модули, помещаются в каталог /usr/ share/nginx/modules/. Именно по этой причине в предыдущем фрагмен- те кода мы поместили все файлы настройки в такой путь:

FROM centos:7

 

#  Устанавливае м репозитори й epel ,  чтоб ы получит ь ngin x  и установит ь ngin x.

RUN yum -y install epel-release && \

yum -y install nginx nginx-mod-http-perl

 

# Добавляем локальные файлы конфигурации в образ.

ADD /nginx-conf /etc/nginx

 

EXPOSE 80 443

 

CMD ["nginx"]

 

Обсуждение

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


 

                                                         11.6. Контроллер Ingress в Kubernetes v 137

конфигурации NGINX, чтобы ваш файл Dockerfile NGINX можно было использовать во многих разнообразных средах.

11.6.

 
Контроллер Ingress в Kubernetes

Задача

Вы развертываете свое приложение в Kubernetes, и вам требуется контроллер ingress.

Решение

Убедитесь, что у вас имеется доступ к необходимому образу контрол- лера ingress. В случае с NGINX можно использовать образ nginx/nginx- ingress из Docker Hub. В случае с NGINX Plus вам потребуется собрать собственный образ и разместить его в собственном закрытом реестре Docker. Вы можете найти инструкции по сборке и доставке собствен- ного контроллера ingress для NGINX Plus на странице https://github.com/nginxinc/kubernetes-ingress/blob/master/build/README.md.

Зайдите в папку Kubernetes Ingress Controller Deployments (https://

 
github.com/nginxinc/kubernetes-ingress/tree/master/deployments) в репозито- рии kubernetes-ingress на GitHub. Все нижеприведенные команды будут запускаться из данного каталога локальной копии этого репозитория.

Создайте пространство имен и учетную запись службы для своего контроллера ingress; они оба имеют название nginx-ingress.

$ kubectl apply -f common/ns-and-sa.yaml

 

Создайте ключ безопасности с помощью сертификата TLS и ключа для контроллера ingress:

$ kubectl apply -f common/default-server-secret.yaml

 

Эти сертификат и ключ самостоятельно подписываются и создаются NGINX Inc. для проверок и примеров. Рекомендуется применять свой собственный, поскольку данный ключ открыт для общего доступа.

В качестве варианта можно создать словарь CofigMap для индиви- дуальной конфигурации NGINX (в данном случае словарь пуст; но вы можете ознакомиться с подробностями пользовательских настроек и аннотацией здесь: https://github.com/nginxinc/kubernetes-ingress/tree/master/examples/customization):

$ kubectl apply -f common/nginx-config.yaml


 

 
138 v Глава 11. Контейнеры / Микросервисы                                                                   

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

$ kubectl apply -f rbac/rbac.yaml

 

Теперь разверните свой контроллер ingress. В данном репозитории доступны два примера развертывания: Deployment и DaemonSet. Если вы планируете динамически изменять общее число реплик контрол- лера ingress, используйте Deployment. Для развертывания контрол- лера ingress во всех узлах или в подмножестве узлов воспользуйтесь DaemonSet.

Если вы намерены использовать манифесты Deployment NGINX Plus,

вам следует исправить соответствующий файл YAML и определить собственный реестр и образ.

Для Deployment NGINX:

$ kubectl apply -f deployment/nginx-ingress.yaml

Для Deployment NGINX Plus:

$ kubectl apply -f deployment/nginx-plus-ingress.yaml                                        

Для DaemonSet NGINX:

$ kubectl apply -f daemon-set/nginx-ingress.yaml

Для DaemonSet NGINX Plus:

$ kubectl apply -f daemon-set/nginx-plus-ingress.yaml

Убедитесь, что ваш контроллер ingress запущен:

$ kubectl get pods --namespace=nginx-ingress

 

Если вы создали DaemonSet, порты контроллера ingress 80 и 443 отобра- жены в те же порты узла, в котором запущен этот контроллер. Для до- ступа к данному контроллеру ingress используйте эти порыт и IP-адрес любого из узлов, в которых работает контроллер. Если вы развернули Deployment, продолжите, используя приведенную ниже информацию.

Для методов Deployment имеются два варианта доступа к модулям контроллера ingress. Можно указать Kubernetes случайным образом вы- делять порт узла, который соответствует модулю контроллера ingress.


 

 
                                                         11.6. Контроллер Ingress в Kubernetes v 139

Такая служба имеет тип NodePort. Другой вариант – создание службы с типом LoadBalancer. При создании службы типа LoadBalancer Kubernetes создает балансировщик нагрузки для конкретной облачной платформы, такой как Amazon Web Services, Microsoft Azure и Google Cloud Compute.

Для создания службы типа NodePort используйте приведенную ниже команду:

$ kubectl create -f service/nodeport.yaml

 

Чтобы настроить открытый для данного модуля порт статически, из- мените соответствующий YAML и добавьте атрибу nodePort: {port} в на- стройки всех подлежащих открытию портов.

Для создания службы типа LoadBalancer для Google Cloud Compute

или Azure воспользуйтесь таким кодом:

$ kubectl create -f service/loadbalancer.yaml

Для создания службы типа LoadBalancer для Amazon Web Services:

$ kubectl create -f service/loadbalancer-aws-elb.yaml

 

 
Для AWS Kubernetes создает классический ELB в режиме TCP с вклю- ченным протоколом PROXY. Вам следует настроить NGINX, чтобы использовать этот протокол TCP. Для этого в словарь ConfigMap, упо- мянутый ранее как файл common/nginx-confg.yaml, можно добавить сле- дующее:

proxy-protocol: "True"

real-ip-header: "proxy_protocol" set-real-ip-from: "0.0.0.0/0"

Затем обновите словарь:

$ kubectl apply -f common/nginx-config.yaml

 

Теперь вы можете выполнять адресацию своего модуля по его Node- Port или делая запросы к балансировщику нагрузки, созданному от его имени.

 

Обсуждение

На момент написания данных строк Kubernetes является ведущей платформой для оркестрации и управления контейнерами, погранич-


 

140 v Глава 11. Контейнеры / Микросервисы                                                                   

 
ным модулем, который маршрутизирует трафик в остальную часть вашего приложения. NGINX идеально подходит для данной роли и упрощает настройку со своими аннотациями. Проект NGINX-Ingress предлагает контроллер ingress NGINX с открытым исходным кодом сразу после его установки из образа Dockerfile, а также NGINX Plus с несколькими шагами, чтобы добавить ваш ключ и сертификат репози- тория. Активация вашего кластера Kubernetes с помощью контроллера ingress NGINX предоставляет те же свойства, которые имеются у NGINX, но с дополнительными функциями организации сети в Kubernetes и DNS для маршрутизации трафика.

11.7. Маршрутизатор OpenShift

 
Задача

Вам нужно развернуть свое приложение в OpenShift, и вы бы хотели использовать в качестве маршрутизатора NGINX.

Решение

Соберите образ Маршрутизатора и выгрузите его в свой закрытый ре- естр. Вы можете найти необходимые исходные файлы для этого образа здесь: https://github.com/openshift/origin/tree/master/images/router/nginx. Важ- но поместить образ вашего Маршрутизатора в имеющийся закрытый реестр до того, как вы удалите установленный по умолчанию Маршру- тизатор, поскольку это сделает реестр недоступным.

Выполните вход в кластер OpenShift в качестве администратора:

$ oc login -u system:admin

Выберите проект default:

$ oc project default

Выполните резервное копирование настроек установленного по умолчанию Маршрутизатора, в случае если вам потребуется его восста- новить:

$ oc get -o yaml service/router dc/router \ clusterrolebinding/router-router-role \ serviceaccount/router > default-router-backup.yaml

Удалите Маршрутизатор:

$ oc delete -f default-router-backup.yaml


 

                                                                  11.7. Маршрутизатор OpenShift v 141

Разверните Маршрутизатор NGINX:

$ oc adm router router --images={image} --type='' \

--selector='node-role.kubernetes.io/infra=true'

 

В данном примере значение {image} должно указывать на образ Маршрутизатора NGINX в вашем реестре. Параметр selector определя- ет селектор метки для узлов, где будет развернут ваш Маршрутизатор: node-role.kubernetes.io/infra=true. Используйте селектор, который актуа- лен в вашей среде.

Проверьте, что ваши модули работают:

$ oc get pods

 
Вы должны увидеть модуль Маршрутизатора с именем router-1-

{string}. По умолчанию страница состояния заглушки NGINX доступна через порт 1936 того узла, где запущен ваш Маршрутизатор (вы можете изменить этот порт с помощью переменной среды STATS_PORT). Для дос- тупа к странице вне данного узла вам потребуется добавить запись в правила IPtables для такого узла:

$ sudo iptables -I OS_FIREWALL_ALLOW -p tcp -s {ip range} \

-m tcp --dport 1936 -j ACCEPT

Перейдите в своем браузере по адресу http://{node-ip}:1936/stub_status,

чтобы получить доступ к странице состояния заглушки.

Обсуждение

Маршрутизатор OpenShift является точкой входа для внешних за- просов, ограничивающей работающие в OpenShift приложения. Рабо- та этого Маршрутизатора состоит в получении входящих запросов и направлении их в соответствующий модуль приложения. Возможно- сти балансировки нагрузки и маршрутизации NGINX делают его вели- колепным выбором для использования в качестве Маршрутизатора OpenShift. Переключение с устанавливаемого по умолчанию Маршру- тизатора OpenShift на Маршрутизатор NGINX активирует все имею- щиеся функции и мощь NGINX в качестве ingress вашего приложения OpenStack.


 

 
Глава 12

Режимы развертывания высокой доступности

12.0. Введение

 
Отказоустойчивая архитектура разделяет системы на идентичные, не- зависимые стеки. Балансировщики нагрузки, подобные NGINX, приме- няются для распределения нагрузки, гарантируя использование того, что было подготовлено. Базовой концепцией понятия высокой доступ- ности является балансировка нагрузки по множеству активных узлов или отработка отказа «активный–пассивный». Приложения с высокой доступностью не имеют единых точек отказа; все компоненты обяза- ны применять одну из указанных концепций, включая и сами балан- сировщики нагрузки. Для нас это означает NGINX. NGINX разработан для работы в одной из конфигураций: множество активных узлов или отработка отказа «активный–пассивный». В данной главе подробно описывается технология запуска нескольких серверов NGINX для обе- спечения высокой доступности на уровне балансировки нагрузки.

12.1. Режим высокой доступности NGINX

Задача

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

Решение

Воспользуйтесь режимом высокой доступности (HA, highly available) NGINX Plus с поддержкойактивности, установивпакет nginx-ha-keepalived из репозитория NGINX Plus.


 

                     12.2. Балансировка нагрузки балансировщиками с помощью DNS    v 143

 
Обсуждение

Пакет nginx-ha-keepalived основан на поддержке активности и управ- ляет виртуальным IP-адресом, открытым клиенту. На самом сервере NGINX запущен еще один процесс, который предоставляет гарантию работы этого NGINX Plus и самого процесса поддержки активности. Процесс поддержки активности – это процесс, который использует про- токол VRRP (Virtual Router Redundancy Protocol), отправляя небольшие сообщения, часто именуемые сердцебиениями, в резервный сервер. Если этот сервер не получает такое сердцебиение на протяжении трех последовательных периодов, он инициирует отработку отказа, пере- мещая виртуальный IP-адрес к себе и превращаясь в хозяина (master). Имеющиеся возможности отработки отказа пакета nginx-ha-keepalived можно настраивать для указания индивидуальных ситуаций сбоя.

12.2. Балансировка нагрузки балансировщиками с помощью DNS

Задача                                                                      

Вам необходимо распределить нагрузку между двумя или более сер- верами NGINX.

Решение

Воспользуйтесь DNS, чтобы выполнить распределение нагрузки по круговому циклу (round robin) по серверам NGINX, добавляя несколько IP-адресов в запись A DNS.

Обсуждение

При запуске нескольких балансировщиков нагрузки можно распре- делять нагрузку через DNS. Запись A позволяет перечислять под одним полностью определенным именем домена (FQDN, fully qualified domain name) несколько IP-адресов. DNS будет автоматически прокручивать все IP- адреса каруселью. DNS также предлагает взвешенный цикличес- кий алгоритм со взвешенными записями, которые действуют так же, как и описанный в главе 1 циклический алгоритм в NGINX. Эти методы прекрасно работают. Тем не менее удаление конкретной записи в том случае, когда сервер NGINX испытал сбой, может оказаться ловушкой. Существуют поставщики DNS – Amazon Route53 для одних и Dyn DNS для других, – предлагающие проверку жизнеспособности и отработку


 

144 v Глава 12. Режимы развертывания высокой доступности                                         

 
отказов наряду с предложениями DNS, которые помогают решить дан- ные проблемы. Когда вы применяете DNS для балансировки нагрузки по NGINX, в том случае, когда сервер NGINX помечается как подлежа- щий удалению, лучше всего следовать тем же протоколам, что и NGINX при удалении вышестоящего сервера. Для начала прекратите отправку к нему новых подключений, удалив его IP-адрес из имеющейся записи DNS, затем включите осушение подключений перед остановкой или от- ключением службы.

12.3. Балансировка нагрузки в EC2

Задача

Вы используете NGINX в AWS, причем ваш режим высокой доступно- сти NGINX Plus не поддерживает IP-адреса Amazon.

Решение

 
Поместите NGINX позади балансировщика сетевой нагрузки AWS, настроив группу с автоматическим масштабированием из серверов NGINX и привязав ее к целевой группе, а затем подключите эту целе- вую группу к соответствующему балансировщику сетевой нагрузки. В качестве альтернативы можно поместить серверы NGINX в эту целе- вую группу вручную при помощи консоли AWS, интерфейса командной строки или API.

Обсуждение

Основанное на поддержке активности (keepaliving) решение с ре- жимом высокой доступности от NGINX Plus не будет работать в AWS, поскольку он не поддерживает плавающие виртуальные IP-адреса, так как IP-адреса EC2 работают совершенно иначе. Это вовсе не означает, что NGINX лишен возможностей режима высокой доступности в AWS; на самом деле совершенно наоборот. Amazon предлагает баланси- ровщик сетевой нагрузки AWS, который будет естественным образом выполнять балансировку нагрузки по множеству физически раздель- ных центров обработки данных, именуемых зонами доступности (AZ, availability zones), предоставит активные проверки жизнеспособности, а также конечную точку DNS CNAME. Распространенным решением для NGINX с режимом высокой доступности в AWS является размещение уровня NGINX позади имеющегося балансировщика сетевой нагрузки.


 

                                                            12.4. Синхронизация конфигурации v 145

 
 
Серверы NGINX могут по мере необходимости автоматически добав- ляться в целевую группу и удаляться из нее. Балансировщик сетевой нагрузки не выступает заменой NGINX; существует множество вещей, предлагаемых NGINX, которых нет в балансировщике сетевой нагруз- ки, например различные методы балансировки, ограничение по час- тоте, кеширование, а также маршрутизация 7 уровня. Балансировщик нагрузки приложений AWS производит балансировку нагрузки 7 уров- ня на основе пути URI и заголовка хоста, но сам по себе не предлагает выполнения функций, которые имеет NGINX, таких как кеширование WAF, ограничение полосы пропускания, сервер активной доставки HTTP/2 и многое другое. В случае, когда предоставляемый балансиров- щик сетевой нагрузки не удовлетворяет вашим потребностям, имеется множество иных вариантов. Одним из вариантов является DNS-сервис, Route53. Данный продукт от AWS предлагает проверки жизнеспособнос- ти и отработку отказов.

 

12.4. Синхронизация конфигурации

Задача

Вы запускаете уровень NGINX Plus с режимом высокой доступности, и вам необходима синхронизация конфигураций серверов.

Решение

Воспользуйтесь эксклюзивной функцией синхронизации конфигура- ций NGINX Plus. Для настройки этой функциональности следуйте этим этапам:

Из репозитория пакетов NGINX Plus установите пакет nginx-sync.

Для RHEL или CentOS:

$ sudo yum install nginx-sync

Для Ubuntu или Debian:

$ sudo apt-get install nginx-sync

 

Предоставьте главной машине SSH-доступ в качестве суперпользова- теля ко всем одноранговым машинам.

Сгенерируйте пару ключей для аутентификации по протоколу SSH

для суперпользователя и получите открытый ключ:


 

 
146 v Глава 12. Режимы развертывания высокой доступности                                    

 

$ sudo ssh-keygen -t rsa -b 2048

$ sudo cat /root/.ssh/id_rsa.pub

ssh-rsa AAAAB3Nz4rFgt...vgaD root@node1

Получите IP-адрес главного узла:

$ ip addr

1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen \ 1000

 
link/ether 52:54:00:34:6c:35 brd ff:ff:ff:ff:ff:ff

inet 192.168.1.2/24 brd 192.168.1.255 scope global eth0 valid_lft forever preferred_lft forever

inet6 fe80::5054:ff:fe34:6c35/64 scope link valid_lft forever preferred_lft forever

Команда ip addr выведет дамп информации относительно интерфей- сов машины. Игнорируйте интерфейс петли (loopback), который обыч- но идет первым. Найдите IP-адрес, который следует за inet для само- го первого интерфейса. В данном примере таким IP-адресом является

192.168.1.2.

Распространите открытый ключ для файла authorized_keys пользова- теля root во всех одноранговых узлах и задайте авторизацию только с IP-адреса главной машины:

$ sudo echo 'from="192.168.1.2" ssh-rsa AAAAB3Nz4rFgt...vgaD \ root@node1' >> /root/.ssh/authorized_keys

 

Добавьте в /etc/ssh/sshd_confg приведенную ниже строку и выполните перезагрузку sshd на всех узлах:

$ sudo echo 'PermitRootLogin without-password' >> \

/etc/ssh/sshd_config

$ sudo service sshd reload

 

Убедитесь, что пользователь root на главном узле способен подклю- чаться по протоколу SSH ко всем одноранговым узлам без пароля:


 

 
                                                            12.4. Синхронизация конфигурации v 147

$ sudo ssh root@node2.example.com

На главной машине создайте файл настроек /etc/nginx-sync.conf со сле-

дующей конфигурацией:

NODES="node2.example.com node3.example.com node4.example.com" CONFPATHS="/etc/nginx/nginx.conf /etc/nginx/conf.d" EXCLUDE="default.conf"

 
Данный пример конфигурации демонстрирует три распростра- ненных параметра для данной функциональности: NODES, CONFIGPATHS и EXCLUDE. Параметр NODES устанавливается как строка имен хостов или IP-адресов, разделяемых пробелами; это узлы одноранговой сети (peer), куда ваша главная машина будет помещать изменения в настройках. Параметр CONFIGPATHS определяет, какие файлы или каталоги следует синхронизировать. Наконец, вы можете использовать параметр EXCLUDE для исключения файлов конфигурации из синхронизации. В нашем примере главная машина выполняет активную доставку изменений настроек в основном файле настроек NGINX и также включает каталоги

/etc/nginx/nginx.conf и /etc/nginx/conf.d в одноранговые узлы с  именами

node2.example.com, node3.example.com и node4.example.com. Если процесс син- хронизации обнаруживает файл с именем default.conf, для него не будет выполняться активная доставка в этой одноранговой сети, так как он настроен в качестве EXCLUDE.

Для настройки местоположения бинарных файлов NGINX, RSYNC, SSH, diff, а также расположения lockfile и резервного каталога имеют- ся дополнительные параметры. Существует также параметр, который использует sed для выработки шаблона заданных файлов. Для полу- чения дополнительных сведений относительно расширенных пара- метров посетите https://docs.nginx.com/nginx/admin-guide/high-availability/con fi guration-sharing/.

Проверьте свою конфигурацию:

$ nginx-sync.sh -h # display usage info

$ nginx-sync.sh -c node2.example.com # compare config to node2

$ nginx-sync.sh -C # compare master config to all peers

$ nginx-sync.sh # sync the config & reload NGINX on peers

Обсуждение

Эта имеющаяся только в NGINX Plus функциональность позволяет управлять несколькими серверами NGINX Plus в конфигурации с вы-


 

148 v Глава 12. Режимы развертывания высокой доступности                                         

 
сокой доступностью через обновление только главного узла и выпол- нения синхронизации со всеми прочими одноранговыми узлами. Вы- полняя синхронизацию в автоматическом режиме, вы ограничиваете риск ошибок при передаче настроек. Приложение nginx-sync.sh предо- ставляет меры предосторожности для предотвращения отправки по од- норанговой сети плохих конфигураций. Они включают в себя проверку выполненных настроек в главной машине, создание резервных копий имеющейся для одноранговой сети конфигурации и удостоверение полученной в одноранговой сети конфигурации перед перезагрузкой. Хотя более предпочтительной является синхронизация вашей конфи- гурации при помощи инструментов управления конфигурацией или Docker, синхронизация конфигурации NGINX Plus имеет ценность, ког- да вам еще только предстоит выполнить большой скачок к управлению средами таким образом.

12.5. Совместное использование состояния с помощью Zone Sync

Задача

 
Вам необходимо, чтобы NGINX Plus выполнил синхронизацию своих зон общей памяти для парка серверов высокой доступности.

Решение

Воспользуйтесь параметром sync при настройке зоны общей памяти

NGINX Plus:

stream {

resolver 10.0.0.2 valid=20s;

 

server {

listen 9000; zone_sync;

zone_sync_server nginx-cluster.example.com:9000 resolve; # ... Security measures

}

}

http {

upstream my_backend { zone my_backend 64k;


 

                     12.5. Совместное использование состояния с помощью Zone Sync    v 149

server backends.example.com resolve; sticky learn zone=sessions:1m

 
create=$upstream_cookie_session lookup=$cookie_session

sync;

}

 

server {

listen 80; location / {

proxy_pass http://my_backend;

}

}

}

 

Обсуждение

 
Модуль zone sync является исключительным свойством NGINX Plus, которое в реальности превращает NGINX Plus в кластер. Как показа- но в приведенной конфигурации, нужно установить сервер stream, на- строенный в качестве zone_sync. В данном примере это сервер, слуша- ющий порт 9000. NGINX Plus взаимодействует со всеми оставшимися серверами, которые определены в директиве zone_sync_server. Для ди- намических кластеров можно настроить эту директиву на доменное имя, которое преобразуется в несколько IP-адресов, либо статически определить последовательность директив zone_sync_server. Вам следу- ет ограничить доступ к зоне синхронизации сервера; имеются особые SSL/TLS директивы для данного модуля в целях выполнения аутенти- фикации машин. Основным преимуществом настройки NGINX Plus в кластер состоит в том, что вы можете синхронизировать зоны общей памяти для ограничения частот, сеансов sticky learn, а также хранили- ща типа ключ/значение. Данный пример демонстрирует применение параметра sync, прикрепляемого в конце директивы sticky learn. В этом примере пользователь ограничен вышестоящим сервером на базе куки с именем session. При отсутствии модуля синхронизации зоны, когда пользователь выполняет запрос к другому серверу NGINX Plus, он мо- жет потерять свой сеанс. В случае наличия модуля синхронизации зоны все серверы NGINX Plus осведомлены о таком сеансе и том, с каким вы- шестоящим сервером он связан.


 

Глава 13

 
Расширенный мониторинг

Активности

13.0. Введение

 
Чтобы гарантировать оптимальную производительность и точность своего приложения, необходимо ознакомиться с показателями мони- торинга его активности. NGINX Plus предлагает расширенную панель мониторинга и формат JSON Feed, чтобы обеспечить всесторонний мо- ниторинг всех запросов, поступающих через сердце вашего приложе- ния. Мониторинг активности NGINX Plus предоставляет информацию о запросах, пулах вышестоящих серверов, кешировании, работоспо- собности и многое другое. В этой главе подробно описываются мощь и возможности инструментальной панели NGINX Plus, API NGINX Plus и модуль stub_status с открытым исходным кодом.

13.1. Активация модуля Stub Status

С открытым исходным кодом

Задача

Вам нужно активировать базовый мониторинг для NGINX.

Решение

В блоке location внутри HTTP-сервера NGINX активируйте модуль

stub_status:

location /stub_status { stub_status;


 

                  13.2. Активация инструментальной панели мониторинга NGINX Plus v 151

allow 127.0.0.1; deny all;

# Set IP restrictions as appropriate

}

 

Проверьте свои настройки, выполнив запрос состояния:

 
$ curl localhost/stub_status Active connections: 1

server accepts handled requests 1 1 1

Reading: 0 Writing: 1 Waiting: 0

 

Обсуждение

 
Модуль stub_status активирует базовые возможности мониторин- га сервера NGINX с открытым исходным кодом. Вся возвращаемая им информация предоставляет сведения относительно значения числа активных соединений, а также общее число принятых и обработан- ных подключений и обслуженных запросов. Также отображается теку- щее значение числа подлежащих чтению, записи или пребывающих в состоянии ожидания соединений. Предоставляемая информация явля- ется глобальной и неспецифичной для того родительского сервера, в котором определена директива stub_status. Это означает, что вы може- те размещать это состояние в защищенном сервере. Этот модуль пре- доставляет счетчики активных соединений в виде встроенных пере- менных, чтобы использовать их при регистрации и где-либо еще. Это переменные $connections_active, $connections_reading, $connections_writing и

$connections_waiting.

13.2. Активация инструментальной панели мониторинга NGINX Plus

Задача

Вам необходимы подробные метрики относительно протекающего через ваш сервер NGINX Plus трафика.

Решение

Воспользуйтесь инструментальной панелью мониторинга активнос- ти в реальном масштабе времени:


 

152 v Глава 13. Расширенный мониторинг активности                                              

 

server { # ...

location /api {

api [write=on];

 
#  Директивы,  ограничивающие доступ к API #  См.  главу 7

}

 

location = /dashboard.html { root /usr/share/nginx/html;

}

}

 

 
Данная конфигурация NGINX Plus обслуживает инструментальную панель мониторинга состояний NGINX Plus. Эта конфигурация настра- ивает сервер HTTP для обслуживания соответствующего API и инстру- ментальной панели состояния. Эта инструментальная панель обслу- живается в виде выводимого статического содержания каталога /usr/ share/nginx/html. Она выполняет запросы к API в /api/ чтобы выполнять выборку значения состояния и его отображения в реальном масштабе времени.

Обсуждение

NGINX Plus предоставляет продвинутую инструментальную панель мониторинга состояния. Она предоставляет подробное состояние си- стемы NGINX, например число активных подключений, время работы, информацию о пуле вышестоящих серверов и многое другое. Для бе- глого знакомства с ее консолью посмотрите на рис. 13.1.

Загрузочная страница инструментальной панели состояния дает об- зор всей имеющейся системы. Кликнув по вкладке Server Zones, вы увидите подробную информацию обо всех настроенных в конфигура- ции серверах HTTP с детализацией значений числа откликов от 1XX до 5XX и общее итоговое значение, а также число запросов в секунду и текущую пропускную способность трафика. Вкладка Upstream выводит подробности состояний вышестоящих серверов, а если какие-либо из них пребывают в состоянии отказа, показывает, сколько запросов было обслужено и общее число обслуженных запросов для состояния кода, а также иные статистические данные, например сколько проверок жиз- неспособности были пройдены успешно или завершились провалом. Вкладка TCP/UDP Zones отображает подробности объема трафика, про-


 

                                                13.3. Сбор метрик с помощью API NGINX Plus v 153

 
ходящего через потоки TCP или UDP, а также количество соединений. На вкладке TCP/UDP Upstream показана информация о том, сколько обслуживает каждый из вышестоящих серверов в восходящих пулах TCP/UDP, а также сведения об успешной и неудачной проверке рабо- тоспособности и времени отклика. Вкладка Caches отображает инфор- мацию относительно пространства, используемого для кеширования; объем обслуживаемого трафика, записей и обходов; а также соотноше- ние попаданий в кеш. Данная инструментальная панель NGINX являет- ся бесценной при мониторинге всей сердцевины ваших приложений и потока трафика.

См. также:

https://demo . nginx . com/dashboard . html

 

Рис. 13.1. Инструментальная панель состояния NGINX Plus

13.3. Сбор метрик с помощью API NGINX Plus

Задача

Вам необходим API-доступ для детализации измерений, производи- мых инструментальной панелью состояния NGINX Plus.

Решение

Для сбора метрик воспользуйтесь API RESTful. Вот примеры конвейе- ра, получаемого через json_pp, для более простого прочтения вывода:

$ curl "demo.nginx.com/api/3/" | json_pp [


 

154 v Глава 13. Расширенный мониторинг активности                                              

 

 
"nginx", "processes", "connections", "ssl",

"slabs",

"http", "stream"

]

 

Вызов с curl запрашивает самый верхний уровень API, который ото- бражает другие фрагменты API.

Для получения информации о сервере NGINX Plus воспользуйтесь

URI /api/{version}/nginx:

$ curl "demo.nginx.com/api/3/nginx" | json_pp

{

"version" : "1.15.2",

 
"ppid" : 79909,

"build" : "nginx-plus-r16", "pid" : 77242,

"address" : "206.251.255.64",

"timestamp" : "2018-09-29T23:12:20.525Z",

"load_timestamp" : "2018-09-29T10:00:00.404Z", "generation" : 2

}

 

Для ограничения информации, возвращаемой API, используйте ар- гументы:

$ curl "demo.nginx.com/api/3/nginx?fields=version,build" \

| json_pp

{

"build" : "nginx-plus-r16",

"version" : "1.15.2"

}

 

Вы можете запросить статистические данные по соединениям из URI

/api/{version}/connections:

$ curl "demo.nginx.com/api/3/connections" | json_pp

{


 

                                                13.3. Сбор метрик с помощью API NGINX Plus    v 155

 
"active" : 3,

"idle" : 34,

"dropped" : 0,

"accepted" : 33614951

}

 

У вас имеется возможность собирать статистику запросов из URI за- просов /api/{version}/http/:

$ curl "demo.nginx.com/api/3/http/requests" | json_pp

{

"total" : 52107833,

"current" : 2

}

 

 
Для получения выборки статистических данных относительно опре- деленной зоны серверов воспользуйтесь URI /api/{version}/http/server_

zones/{httpServerZoneName}:

 

$ curl "demo.nginx.com/api/3/http/server_zones/hg.nginx.org" \

| json_pp

{

"responses" : {

"1xx" : 0,

"5xx" : 0,

"3xx" : 938,

"4xx" : 341,

"total" : 25245,

"2xx" : 23966

},

"requests" : 25252,

"discarded" : 7,

"received" : 5758103,

"processing" : 0,

"sent" : 359428196

}

 

Данный API способен предоставлять абсолютно все данные, которые вы видите на инструментальной панели. У него есть глубина, и он сле- дует некому логическому шаблону. Ссылки на ресурсы можно найти в конце данного рецепта.


 

156 v Глава 13. Расширенный мониторинг активности                                              

Обсуждение

 
API NGINX Plus способен возвращать статистические данные о мно- жестве частей вашего сервера NGINX Plus. Вы можете собирать инфор- мацию относительно самого сервера NGINX Plus, его процессов, сое- динений и слоев. Вы также может найти информацию относительно запускаемых внутри NGINX серверов http и stream, включая серверы, восходящие потоки, вышестоящие серверы и хранилища типа ключ/ значение, а также информацию и статистические данные относительно зон кеширования HTTP. Это предоставляет вам или сторонним агрега- торам метрик детальное представление о том, как работает ваш сервер NGINX Plus.

См . также : https://nginx.org/en/docs/http/ngx_http_api_module.htmlhttps://demo.nginx.com/swagger-ui/

 

 

 


 

Глава 14

 
Отладка и устранение неполадок с помощью журналов доступа, журналов ошибок

И отслеживания запросов

 

14.0. Введение

Ведение журналов является основой понимания вашего приложения. Благодаря NGINX вы получаете прекрасный контроль над регистрацией информации, значимой для вас и вашего приложения. NGINX позво- ляет разделять журналы доступа на разные файлы и форматы для раз- ных контекстов и изменять уровень регистрации ошибок, чтобы глубже понять происходящее. Возможность потоковой передачи журналов на централизованный сервер присуща NGINX благодаря возможностям ведения журналов Syslog. В этой главе мы обсудим журналы доступа и ошибок, потоковую передачу по протоколу Syslog и отслеживание запросов от начала до конца с помощью идентификаторов запросов, сгенерированных NGINX.

 

14.1. Настройка журналов доступа

Задача

Вам необходимо настроить форматы журналов доступа, чтобы доба- вить встроенные переменные в журналы запросов.


 

158 v Глава 14. Отладка и устранение неполадок с помощью журналов доступа ...           

Решение

Настройте формат журнала доступа:                                        

http {

log_format geoproxy

'[$time_local] $remote_addr ' '$realip_remote_addr $remote_user ' '$request_method $server_protocol ' '$scheme $server_name $uri $status ' '$request_time $body_bytes_sent ' '$geoip_city_country_code3 $geoip_region ' '"$geoip_city" $http_x_forwarded_for ' '$upstream_status $upstream_response_time ' '"$http_referer" "$http_user_agent"';

...

}

 

 
Данная конфигурация формата журнала носит название geoproxy и ис- пользует ряд встроенных переменных для демонстрации возможнос- тей ведения журналов с NGINX. Эта конфигурация показывает местное время на сервере, когда был сделан запрос, IP-адрес, который открыл соединение, и IP-адрес клиента, как его NGINX понимает согласно инструкциям geoip_proxy или realip_header. $remote_user показывает имя пользователя, прошедшего проверку с помощью базовой аутентифика- ции, за которым следуют метод запроса и протокол, а также схема, такая как HTTP или HTTPS. Регистрируется совпадение server name, а также URI запроса и код возвращаемого состояния. Регистрируемая статисти- ка включает в себя время обработки в миллисекундах и размер тела, от- правляемого клиенту. Регистрируется информация о стране, регионе и городе. Заголовок HTTP X-Forwarded-For включен, чтобы показать, пере- сылается ли запрос другим прокси. Модуль upstream активирует исполь- зуемые нами встроенные переменные, которые показывают состояние, возвращаемое с вышестоящего сервера, и время, необходимое для воз- врата запроса. Наконец, мы зарегистрировали информацию о том, от- куда клиент обратился и какой браузер использует. Директива log_format действительна только в контексте HTTP.

Эта конфигурация журнала отображает запись, которая выглядит

следующим образом:

[25/Nov/2016:16:20:42 +0000] 10.0.1.16 192.168.0.122 Derek

GET HTTP/1.1 http www.example.com / 200 0.001 370 USA MI


 

 
                                                               14.3. Отправка журналов в Syslog   v 159

"Ann Arbor" - 200 0.001 "-" "curl/7.47.0"

 

Чтобы взять этот формат журнала, используйте директиву access_log, указав в качестве параметров путь к файлу журнала и имя формата geo- proxy:

server {

access_log /var/log/nginx/access.log geoproxy;

...

}

 

Директива access_log принимает в качестве параметров путь к файлу журнала и имя формата. Эта директива действительна во многих кон- текстах и в каждом контексте может иметь свой путь к журналу и (или) формату журнала.

 
Обсуждение

Модуль журнала в NGINX позволяет настраивать форматы журналов для множества различных сценариев, чтобы выполнять записи в раз- ные файлы журналов по своему усмотрению.

Может оказаться полезным настроить отдельный формат журнала для каждого контекста, где вы используете разные модули и применя- ете встроенные переменные этих модулей, или единый общий формат, предоставляющий всю информацию, которая вам может понадобиться. Также возможно отформатировать журнал в формате JSON или XML. Эти журналы помогут вам понять ваши схемы трафика, использование клиентами, а также кто ваши клиенты и откуда они приходят. Журна- лы доступа также могут помочь вам обнаружить задержки в ответах и проблемы с вышестоящими серверами или определенными URI. Жур- налы доступа могут использоваться для парсинга и воспроизведения шаблонов трафика в тестовых средах для имитации реального взаимо- действия с пользователем. При поиске и устранении неисправностей, отладке или анализе вашего приложения или рынка возможности не- ограничены.

14.3. Отправка журналов в Syslog

Задача

Вам необходимо пересылать свои журналы слушателю Syslog, чтобы объединить их в централизованную службу.


 

160  v  Глава 14. Отладка и устранение неполадок с помощью журналов доступа ...                  

 
Решение

Используйте директивы access_log и error_log для отправки своих жур-

налов слушателю Syslog:

error_log syslog:server=10.0.1.42 debug;

 

access_log syslog:server=10.0.1.42,tag=nginx,severity=info geoproxy;

 

 

 
За параметром syslog для директив error_log и access_log следует двое- точие и ряд параметров. Эти параметры включают в себя обязательный флаг server, который обозначает IP-адрес, DNS-имя или сокет Unix для подключения, а также необязательные флаги, такие как facility, sever- ity, tag и nohostname. Опция server принимает номер порта, а также IP- адреса или DNS-имена. Однако по умолчанию используется UDP 514. Опция facility относится к средству сообщения журнала, определенно- му как одно из 23, определенных в стандарте RFC для Syslog; значение по умолчанию – local7. Опция tag помечает сообщение значением. Это значение по умолчанию равно nginx.

severity по умолчанию имеет значение info и обозначает серьез-

ность отправляемого сообщения. Флаг nohostname  отключает добавле- ние поля имени хоста в заголовок сообщения Syslog и не принимает значения.

 

Обсуждение

Syslog – это стандартный протокол для отправки сообщений журна- ла и сбора этих журналов на одном сервере или коллекции серверов. Отправка журналов в централизованное расположение помогает при отладке, когда на нескольких хостах запущено несколько экземпляров одной и той же службы. Это называется агрегированием журналов. Агре- гирование журналов позволяет просматривать журналы разом в одном месте без необходимости переходить с сервера на сервер и мысленно объединять файлы журналов по отметке времени. Среди распростра- ненных средств агрегации журналов можно упомянуть ElasticSearch, Logstash и Kibana, также известный как ELK Stack. NGINX упрощает по- токовую передачу этих журналов слушателю Syslog с помощью дирек- тив access_log и error_log.


 

                                                                       14.4. Трассировка запросов v 161

14.4. Трассировка запросов

 
Задача

Вам необходимо соотнести журналы NGINX с журналами приложе- ний, чтобы иметь полное представление о запросе.

Решение

Используйте идентифицирующую переменную request и передайте ее в свое приложение для регистрации:

 
log_format trace '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$http_x_forwarded_for" $request_id';

upstream backend { server 10.0.0.42;

}

server {

listen 80;

add_header X-Request-ID $request_id; # Return to client location / {

proxy_pass http://backend;

proxy_set_header X-Request-ID $request_id; #Pass to app access_log /var/log/nginx/access_trace.log trace;

}

}

 

В этом примере конфигурации мы установили log_format с именем trace, а в журнале используется переменная $request_id, которая также передается в вышестоящее приложение с помощью директивы proxy_ set_header для добавления идентификатора запроса в заголовок при вы- полнении запроса в восходящем направлении. Идентификатор запроса также передается обратно клиенту с помощью директивы add_header, устанавливающей идентификатор запроса в заголовке ответа.

Обсуждение

Ставшая доступной в NGINX Plus R10 и NGINX версии 1.11.0, пере- менная $request_id предоставляет случайно сгенерированную строку из 32 шестнадцатеричных символов, которые можно использовать для уникальной идентификации запросов. Передав этот идентификатор


 

162  v  Глава 14. Отладка и устранение неполадок с помощью журналов доступа ...                  

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

 

 

 


 


Глава 15


     

Настройка


Производительности

15.0. Введение

 
Настройка NGINX сделает из вас художника. Настройка производи- тельности любого типа сервера или приложения всегда зависит от ряда переменных элементов, таких как среда, сценарий использования, требования и задействованные физические компоненты, и это не все. Обычно выполняется настройка, ориентируясь на проблемные места, т. е. выполняется тестирование до тех пор, пока вы не достигнете проб- лемного места. Вы определяете это место, настраиваете ограничения и повторяете тестирование, до тех пор пока не достигнете желаемых требований к производительности. В этой главе мы предлагаем прово- дить измерения, когда настройка производительности осуществляется путем тестирования с помощью автоматизированных инструментов и измерения результатов. Здесь также рассказывается о настройке под- ключений, чтобы они оставались открытыми как для клиентов, так и для вышестоящих серверов, а также для обслуживания большего коли- чества подключений с помощью настройки операционной системы.

15.1. Автоматизация тестов с помощью драйверов нагрузки

Задача

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


 

 
164 v Глава 15. Настройка производительности                                                       

Решение

Используйте инструмент нагрузочного тестирования HTTP, такой как Apache JMeter, Locust, Gatling, или любой другой инструмент, на котором стандартизировалась ваша команда. Создайте конфигурацию для своего инструмента нагрузочного тестирования, который запу- скает комплексное тестирование в вашем веб-приложении. Запустите тест для своей службы. Просмотрите показатели, собранные во время прогона, чтобы установить базовый уровень. Медленно увеличивайте эмулированный пользовательский параллелизм, чтобы имитировать типичную реальную эксплуатацию, и определите точки улучшения. На- стройте NGINX и повторяйте этот процесс, пока не добьетесь желаемых результатов.

 
Обсуждение

Использование инструмента автоматического тестирования для определения теста дает вам непротиворечивый тест для построения метрик при настройке NGINX. Вы должны быть в состоянии повторить свой тест и измерить прирост производительности или потери для проведения экспериментов. Выполнение теста до внесения каких-либо изменений в конфигурацию NGINX для установления базовой линии дает вам основу для работы, чтобы вы могли оценить, повысило ли из- менение в конфигурации производительность или нет. Измерения всех внесенных изменений помогут вам определить, что улучшает произво- дительность.

15.2. Сохраняем подключения открытыми для клиентов

Задача

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

Решение

Используйте директивы keepalive_requests и keepalive_timeout, чтобы изменить количество запросов, которые можно сделать через одно под- ключение и время, в течение которого незанятые подключения могут оставаться открытыми:


 

 
              15.3. Сохраняем подключения открытыми для вышестоящих серверов   v 165

http {

keepalive_requests 320; keepalive_timeout 300s;

...

}

 

По умолчанию директива keepalive_requests имеет значение 100, а ди- ректива keepalive_timeout – 75 секунд.

Обсуждение

 
Как правило, количество запросов по умолчанию для одного подклю- чения будет соответствовать потребностям клиента, поскольку в наши дни браузерам разрешено открывать несколько подключений к одному серверу на одно полностью определенное доменное имя. Количество параллельных открытых подключений к домену обычно ограничено числом менее 10, поэтому в этом случае будет происходить много за- просов по одному подключению. Уловка, обычно используемая сетями доставки содержимого, заключается в создании нескольких доменных имен, указывающих на сервер контента, и чередовании того, какое до- менное имя используется в коде, чтобы позволить браузеру открывать больше подключений. Эти оптимизации подключений могут оказать- ся полезными, если ваше внешнее приложение постоянно опрашива- ет ваше внутреннее приложение на предмет наличия обновлений, по- скольку открытое соединение, которое допускает большее количество запросов и дольше остается открытым, ограничит число подключений, которые необходимо установить.

15.3. Сохраняем подключения открытыми для вышестоящих серверов

Задача

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

Решение

Используйте директиву keepalive в контексте upstream, чтобы подклю- чения были открыты для вышестоящих серверов для повторного ис- пользования:


 

166 v Глава 15. Настройка производительности                                                       

 

proxy_http_version 1.1; proxy_set_header Connection "";

 

 
upstream backend { server  10.0.0.42;

server  10.0.2.56;

 

keepalive 32;

}

 
Директива keepalive в контексте upstream активирует кеш подключе- ний, которые остаются открытыми для всех работников NGINX. Она обозначает максимальное количество незанятых подключений, кото- рые должны оставаться открытыми на одного работника. Директивы прокси-модулей, используемые над блоком upstream, необходимы для правильной работы директивы keepalive для подключений с вышесто- ящими серверами. Директива proxy_http_version указывает прокси-мо- дулю использовать HTTP версии 1.1, что позволяет делать несколько запросов по одному подключению, пока оно открыто. Директива proxy_ set_header указывает прокси-модулю удалить заголовок по умолчанию close, позволяя подключению оставаться открытым.

Обсуждение

Вы хотите, чтобы соединения оставались открытыми для вышестоя- щих серверов и сэкономили время, необходимое для инициирования подключения, что позволяет рабочему процессу вместо этого перейти непосредственно к выполнению запроса через незанятое подключе- ние. Важно отметить, что количество открытых подключений может превышать количество подключений, указанное в директиве keepalive, поскольку открытые подключения и незанятые подключения – это не одно и то же. Количество подключений keepalive должно быть достаточ- но маленьким, чтобы разрешить другие входящие подключения с вы- шестоящим сервером. Этот маленький трюк с настройкой NGINX может сэкономить циклы и повысить вашу производительность.

15.4. Буферизация ответов

Задача

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


 

 
                                                          15.5. Буферизация журналов доступа v 167

Решение

Настройте параметры прокси-буфера, чтобы позволить NGINX памя- ти буферизовать тела ответов:

server {

proxy_buffering on; proxy_buffer_size 8k; proxy_buffers 8 32k; proxy_busy_buffer_size 64k;

...

}

 
Директива proxy_buffering включена (on) либо выключена (off); по умолчанию она включена. Директива proxy_buffer_size обозначает раз- мер буфера, используемого для чтения первой части ответа от прокси- руемого сервера, и по умолчанию он равен 4 или 8 k в зависимости от платформы. Директива proxy_buffers принимает два параметра: коли- чество буферов и их размер. По умолчанию в директиве proxy_buffers указано 8 буферов размером 4 или 8 k в зависимости от платформы. Директива proxy_busy_buffer_size ограничивает размер буферов, которые могут быть заняты, отправляя ответ клиенту, пока ответ не полностью прочитан. Размер занятого буфера по умолчанию удваивает размер прокси-буфера или размер буфера.

Обсуждение

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

Чрезвычайно большие буферы, установленные, когда они не нужны, мо- гутпоглотитьпамятьвашего NGINX-устройства. Вы можете установитьэти параметры для определенных местоположений, которые, как известно, возвращают большие тела ответа для оптимальной производительности.

15.5. Буферизация журналов доступа

Задача

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


 

168 v Глава 15. Настройка производительности                                                       

Решение

Установите размер буфера и время сброса ваших журналов доступа:

http {

access_log /var/log/nginx/access.log main buffer=32k flush=1m;

 
}

 

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

Обсуждение

 
Буферизация данных журнала в память может быть небольшим ша- гом к оптимизации. Однако для сайтов и приложений с большим ко- личеством запросов это может внести существенную корректировку в использование диска и центрального процессора. При использовании параметра buffer в директиве access_log журналы будут записываться на диск, если следующая запись журнала не помещается в буфер. Если использовать параметр flush  в сочетании с параметром buffer, журналы будут записываться на диск, когда данные в буфере старше указанного времени. При буферизации журналов таким способом, при настройке журнала вы можете увидеть задержки вплоть до количества времени, указанного параметром flush.

15.6. Настройка ОС

Задача

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

Решение

Проверьте настройки ядра для net.core.somaxconn, что является мак- симальным числом подключений, которые ядро может поставить в очередь для обработки NGINX. Если это число выше 512, вам нужно будет задать параметр backlog директивы listen в вашей конфигурации


 

15.6. Настройка ОС v 169

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

 
Увеличение количества дескрипторов открытых файлов является бо- лее распространенной необходимостью. В Linux дескриптор файла от- крывается для каждого подключения; поэтому NGINX может открыть два, если вы используете его в качестве прокси или балансировщика нагрузки из-за открытого соединения в восходящем направлении. Что- бы обслуживать большое количество подключений, вам может потре- боваться увеличить ограничение дескриптора файла для всей системы с помощью параметра ядра sys.fs.file_max, или для системного пользо- вателя NGINX работает так же, как в файле /etc/security/limits.conf. При этом вам также понадобится увеличить количество worker_connections и worker_rlimit_nofile. Обе эти конфигурации являются директивами в кон- фигурации NGINX.

Активируйте больше эфемерных портов. Когда NGINX действует как

обратный прокси-сервер или балансировщик нагрузки, каждое восходя- щее соединение открывает временный портдля обратного трафика. В за- висимости от конфигурации вашей системы на сервере может не быть открыто максимальное количество временных портов. Чтобы проверить это,  посмотрите  настройку  ядра  net.ipv4.ip_local_port_range.  Настрой- ка представляет собой нижнюю и верхнюю границу диапазона портов. Обычно для этого параметра ядра можно установить значение от 1024 до 65535. 1024 – это то место, где останавливаются зарегистрированные TCP-порты, а 65535 – место, где останавливаются динамические или эфе- мерные порты. Имейте в виду, что ваша нижняя граница должна быть выше, чем самый высокий открытый сервисный порт прослушивания.

 

Обсуждение

Настройка операционной системы – одно из первых мест, куда вы смотрите, когда начинаете настраивать большое количество подключе- ний. Есть много оптимизаций, которые вы можете внести в свое ядро для вашего конкретного случая использования. Однако настройку ядра не следует выполнять по прихоти, и нужно измерять изменения их производительности, чтобы убедиться, что эти изменения помогают. Как указывалось ранее, вы будете знать, когда пора начинать настрой- ку ядра из сообщений, зарегистрированных в журнале ядра, или когда NGINX явно регистрирует сообщение в своем журнале ошибок.


 

 
Глава 16

Советы по практической эксплуатации и заключение

16.0. Введение

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

16.1. Использование директивы include

Для чистых настроек

Задача

Вам необходимо очистить громоздкие файлы конфигурации, чтобы ваши конфигурации логически группировались в модульные наборы конфигурации.

Решение

Используйте директиву include для ссылки на файлы конфигурации, каталоги или маски:

http {

include config.d/compression.conf; include sites-enabled/*.conf

}


 

 
                                                                      16.2. Отладка конфигураций v 171

Директива include принимает один параметр: либо путь к файлу, либо маску, которая соответствует множеству файлов. Эта директива дейст- вует в любом контексте.

Обсуждение

 
Используя операторы include, вы можете сохранить свою конфигура- цию NGINX чистой и лаконичной. Вы сможете логически сгруппиро- вать свои конфигурации, чтобы избежать файлов конфигурации на сот- ни строк. Можно создавать модульные файлы конфигурации, которые могут быть включены в нескольких местах по всей вашей конфигура- ции, чтобы избежать дублирования. Возьмем в качестве примера файла конфигурации fastcgi_param, представленный в большинстве установок NGINX для управления пакетами. Если вы управляете несколькими вир- туальными серверами FastCGI в одном блоке NGINX, то можете вклю- чить этот файл конфигурации для любого местоположения или кон- текста, где вам требуются эти параметры FastCGI без необходимости дублировать эту конфигурацию. Еще один пример – конфигурации SSL. Если вы используете несколько серверов, которые требуют одинаковых конфигураций SSL, можете просто написать эту конфигурацию один раз и включать ее там, где это необходимо. Логически группируя свои конфигурации, вы можете быть уверены, что они аккуратны и органи- зованы. Изменение набора файлов конфигурации можно выполнить путем редактирования одного файла, а не путем изменения нескольких наборов блоков конфигурации в нескольких местах в массивном файле конфигурации. Группировка конфигураций в файлы и использование операторов include – хорошая практика для вашего душевного равнове- сия и душевного равновесия ваших коллег.

16.2. Отладка конфигураций

Задача

Вы получаете неожиданные результаты от вашего сервера NGINX.

Решение

Выполните отладку конфигурации и запомните эти советы:

• NGINX обрабатывает запросы в поисках наиболее конкретно- го сопоставленного правила. Это делает пошаговое выполнение конфигураций вручную немного сложнее, но это самый эффек- тивный способ для работы NGINX. Подробнее о том, как NGINX


 

172 v Глава 16. Советы по практической эксплуатации и заключение                                

обрабатывает запросы, смотрите ссылку на документацию в раз- деле «См. также» на стр. 173;

• можно включить ведение журнала отладки. Для этого вам необхо- димо убедиться, что ваш пакет NGINX настроен с флагом --with- debug. В большинстве распространенных пакетов он есть; но, если вы создали свой собственный или используете минимальный па-

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


журнала директивы error_log на

error.log debug;


error_log /var/log/nginx/


• вы можете активировать отладку для определенных подключе- ний. Директива debug_connection действительна в контексте events и принимает в качестве параметра IP-адрес или диапазон CIDR. Эту директиву можно объявлять более одного раза для добавле- ния нескольких IP-адресов или диапазонов CIDR для отладки. Это может быть полезно для устранения проблемы в реальной эксплуатации без снижения производительности путем отладки всех подключений;

 
можно выполнять отладку только для определенных виртуаль- ных серверов. Поскольку директива error_log действительна в контексте main, HTTP, mail, stream, server и location, вы можете установить уровень журнала debug только в тех контекстах, кото- рые вам нужны;

• можно активировать дампы ядра и получить от них обратную трассировку. Дампы ядра можно привести в действие через опе- рационную систему или файл конфигурации NGINX. Подробнее об этом можно прочитать в руководстве администратора в разде- ле «См. также» на стр. 173;

• Вы можете записывать, что происходит в операторах перезаписи, с помощью включенной директивы rewrite_log: rewrite_log on.

Обсуждение

Платформа NGINX обширна, а ее настройка позволяет вам делать множество удивительных вещей. Тем не менее благодаря способности делать удивительные вещи, также существует возможность навредить самому себе. Выполняя отладку, убедитесь, что вы знаете, как отследить ваш запрос через вашу конфигурацию; и, если у вас есть проблемы, до- бавьте уровень журнала debug, чтобы справиться с ситуацией. Журнал


 

отладки довольно многословен, но очень полезен, чтобы определить, что NGINX делает с вашим запросом и где в конфигурации вы ошиблись.

См . также : http://nginx.org/en/docs/http/request_processing.html https://docs.nginx.com/nginx/admin-guide/monitoring/debugging/

https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite_log

 

16.3. Заключение

В этой книге мы рассказали о высокопроизводительной балансировке нагрузки, безопасности, а также развертывании и обслуживании сер- веров NGINX и NGINX Plus. Мы продемонстрировали некоторые самые мощные функции платформы доставки приложений NGINX. Компания NGINX Inc. продолжает разрабатывать удивительные функции и оста- ется на шаг впереди.

Эта книга продемонстрировала множество коротких рецептов, ко-

 
торые позволят вам лучше понять некоторые директивы и модули, делающие NGINX сердцем современной сети. Сервер NGINX – это не просто веб-сервер или обратный прокси-сервер, а целая платформа для доставки приложений, полностью способная к аутентификации и позволяющая использовать все среды, в которых она работает. Возмож- но, теперь вы это знаете.


 

Сведения об авторе

 
 
У Дерека де Йонге была страсть к технологиям на протяжении всей жиз- ни. Его опыт и знания в области веб-разработки, системного админист- рирования и организации сетей дают ему всестороннее понимание современной веб-архитектуры. Дерек возглавляет команду специали- стов по SRE (Site Reliability Engineering) и занимается производством самовосстанавливающейся инфраструктуры с автоматическим масш- табированием для многочисленных приложений. Он специализируется на облачных средах Linux. Разрабатывая, создавая и поддерживая при- ложения с высокой доступностью для клиентов, он консультирует круп- ные организации, когда они отправляются в облако. Дерек и его коман- да находятся на передовой линии технологической волны, ежедневно разрабатывая передовые облачные технологии. Обладая проверенной репутацией в области отказоустойчивой облачной архитектуры, Дерек помогает компании RightBrain Networks стать одним из самых сильных облачных консалтинговых агентств и поставщиков управляемых услуг в партнерстве с AWS на сегодняшний день.


 

 

Предметный указатель


A

Amazon Web Services 97, 112, 139

Ansible 69, 70, 114

Azure 45, 120, 121, 122, 123, 124, 139

C

Chef 67, 68, 114

D

Docker Hub. 130, 137

G

Google App Engine 126, 127

gRPC 102, 103, 104, 105

H

health_check 34, 35, 37

http_auth_request_module 77, 78, 99

J

JWT 75, 78, 79, 81, 82

K

Kubernetes 128, 137, 138, 139

N

ngx_http_ssl_module 87

ngx_stream_ssl_module 87

P

Packer 114

proxy_cache_bypass 53


proxy_cache_key 52, 53, 56

proxy_cache_path 51, 56

proxy_cache_purge  55

proxy_ssl_certificate 90

proxy_ssl_certificate_key 90

Puppet 65, 66, 114

S

SaltStack 70, 71, 114

secure_link_secret 90, 91, 93

split_clients 39, 40

sticky cookie 28

 

Б

Балансировка нагрузки 23, 25

Балансировщик сетевой нагрузки 145

Г

Горизонтальное масштабирование  129

М

Медленный запуск 37

Х

Хеширование IP-адреса  28

Ц

Циклический алгоритм 27


 

Книги издательства «ДМК Пресс» можно заказать в торгово-издательском холдинге

«Планета Альянс» наложенным платежом, выслав открытку или письмо по почтовому адресу: 115487, г . Москва , 2- й Нагатинский пр - д , д . 6 А.

При оформлении заказа следует указать адрес (полностью), по которому должны быть высланы книги; фамилию, имя и отчество получателя. Желательно также указать свой телефон и электронный адрес.

Эти книги вы можете заказать и в интернет-магазине: www.a-planeta.ru.

Оптовые закупки: тел. +7(499) 782-38-89.

Электронный адрес: books@alians-kniga.ru.                             

 

 

Дерек де Йонге

 

 

NGINX. Книга рецептов

 

Продвинутые рецепты высокопроизводительной балансировки нагрузки

Главный редактор Мовчан Д. А.

dmkpress@gmail.com

Перевод с английского Беликов Д. А.

Корректор Чистякова Л. А.

Верстка Паранская Н. В.

Дизайн обложки Мовчан А. Г.

Формат 70×901/16. Печать цифровая.

Усл. печ. л. 12,87. Тираж 200 экз.

 

Веб-сайт издательства: www.dmkpress.com


Дата добавления: 2021-01-21; просмотров: 131; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!