С помощью существующего протокола единого входа OpenID Connect 5 страница
Решение
Для протокола HTTP используйте директиву health_check в блоке loca- tion:
http {
server {
...
location / {
proxy_pass http://backend; health_check interval=2s
|
match=welcome;
}
}
# status is 200, content type is "text/html", # and body contains "Welcome to nginx!"
match welcome { status 200;
header Content-Type = text/html; body ~ "Welcome to nginx!";
}
}
В этой конфигурации проверки работоспособности для HTTP-серве-
ров мы проверяем работоспособность вышестоящих серверов, отправ-
2.10. Активные проверки работоспособности v 35
|
Проверка работоспособности для служб TCP/UDP очень похожа:
stream {
...
server {
|
proxy_pass stream_backend; health_check interval=10s
passes=2 fails=3;
health_check_timeout 5s;
}
...
}
В данном примере сервер TCP настроен на прослушивание порта 1234 и выполнение посредничества к некоему набору серверов восходяще- го потока, для которого он и выполняет активные проверки жизнеспо- собности. Соответствующая директива health_check получает все те же параметры, что и HTTP, за исключением uri, а значение версии потока имеет параметр для переключения протокола проверки на udp. В дан- ном примере значение интервала установлено на 10 с, требуются два прохода, для того чтобы он рассматривался как работоспособный, и три отказа, чтобы принимать его неработоспособным. Такая активная проверка потока также способна удостоверять получаемый отклик от своего сервера верхнего уровня. Тем не менее соответствующий блок match для серверов потока имеет только два параметра: send и expect. Значением директивы send являются подлежащие отправке сырые дан- ные, в то время как expect представляет собой точный отклик или некое регулярное выражение для проверки соответствия.
|
|
36 v Глава 2. Высокопроизводительная балансировка нагрузки
Обсуждение
|
|
|
2.11.
|
Задача
Ваше приложение нуждается в прогреве перед полной эксплуатаци- онной нагрузкой.
Решение
Используйте параметр slow_start в директиве server, чтобы посте- пенно увеличивать количество подключений за указанное время, когда сервер повторно вводится в восходящий пул балансировки на- грузки:
upstream {
zone backend 64k;
server server1.example.com slow_start=20s; server server2.example.com slow_start=15s;
}
Данная настройка директивы server будет медленно прогревать тра- фик к вышестоящим серверам после их представления в пуле. server1 будет плавно наращивать количество подключений в течение 20 с, а server2 – в течение 15 с.
|
|
2.12. Проверки работоспособности TCP v 37
|
Медленный запуск – это концепция постепенного увеличения количе- ства запросов, передаваемых на сервер в течение определенного пери- ода времени. Медленный запуск позволяет прогревать приложение, за- полняя кеши, инициируя соединения с базами данных без перегрузки соединениями, как только он запускается. Это свойство вступает в силу, когда сервер, который не прошел проверку работоспособности, снова начинает проходить ее и возвращается в пул балансировки нагрузки.
2.12. Проверки работоспособности TCP
Задача
Вам необходимо проверить работоспособность вышестоящего TCP-
сервера и удалить неисправные серверы из пула.
Решение
Используйте директиву health_check в блоке server для активной про- верки работоспособности:
stream {
|
listen 3306; proxy_pass read_backend;
health_check interval=10 passes=2 fails=3;
}
}
В этом примере активно отслеживаются вышестоящие серверы. Вышестоящий сервер будет считаться неисправным, если не сможет ответить на три или более TCP-соединения, инициированных NGINX. NGINX выполняет проверку каждые 10 с. Сервер будет считаться ис- правным только после двух проверок работоспособности.
|
|
Обсуждение
Работоспособность TCP можно проверить с помощью NGINX Plus как пассивно, так и активно. Пассивный мониторинг работоспособности осуществляется путем регистрации обмена данными между клиен- том и вышестоящим сервером. Если вышестоящий сервер приводит к тайм-ауту или отклоняет подключения, пассивная проверка работоспо-
38 v Глава 2. Высокопроизводительная балансировка нагрузки
|
Глава 3
Управление трафиком
3.0. Введение
|
3.1. A/B-тестирование
Задача
Вам нужно разделить клиентов между двумя или более версиями файла или приложения для проверки приемлемости.
Решение
Используйте модуль split_clients, чтобы направить процент своих клиентов в другой восходящий пул:
split_clients "${remote_addr}AAA" $variant { 20.0% "backendv2";
* "backendv1";
}
Директива split_clients хеширует строку, которую вы предоставили в качестве первого параметра, и делит этот хеш на предоставленные про- центы, чтобы отобразить значение переменной, которая приводится в
40 v Глава 3. Управление трафиком
|
В этом примере backendv1 и backendv2 обозначают пулы вышестоящих
серверов и могут использоваться с директивой proxy_pass:
location / {
proxy_pass http://$variant
}
При использовании переменной $variant наш трафик будет раcще- плен между двумя различными пулами серверов.
|
Данный тип A/B-тестирования полезен при тестировании различных типов функций маркетинга и внешнего интерфейса для показателей конверсии на сайтах электронной коммерции. Обычно приложения ис- пользуют тип развертывания под названием canary release. В этом типе развертывания трафик медленно переключается на новую версию. Раз- деление клиентов между различными версиями своего приложения мо- жет быть полезно при развертывании новых версий кода, чтобы ограни- чить радиус взрыва в случае ошибки. Независимо отпричины разделения клиентов между двумя различными наборами приложений NGINX упро- щает этот процесс благодаря использованию модуля split_clients.
См. также:
Документация по split_clients (http://nginx.org/en/docs/http/ngx_http_split_ clients_module . html)
3.2. Использование модуля GeoIP
И базы данных
Задача
Вам необходимо установить базу данных GeoIP и активировать ее встраиваемые переменные в NGINX для регистрации и указания ваше- му приложению местоположения ваших клиентов.
3.2. Использование модуля GeoIP и базы данных v 41
Решение
|
RHEL/CentOS NGINX с открытым исходным кодом:
# yum install nginx-module-geoip
Debian/Ubuntu NGINX с открытым исходным кодом:
# apt-get install nginx-module-geoip
RHEL/CentOS NGINX Plus:
# yum install nginx-plus-module-geoip
Debian/Ubuntu NGINX Plus:
# apt-get install nginx-plus-module-geoip
Скачайте базы данных GeoIP стран и городов и распакуйте их:
|
# wget "http://geolite.maxmind.com/\ download/geoip/database/GeoLiteCountry/GeoIP.dat.gz" # gunzip GeoIP.dat.gz
# wget "http://geolite.maxmind.com/\ download/geoip/database/GeoLiteCity.dat.gz" # gunzip GeoLiteCity.dat.gz
С помощью этого набора команд мы создаем каталог geoip в каталоге
/etc/nginx, перемещаемся туда, скачиваем и распаковываем пакеты.
Теперь, когда база данных GeoIP стран и городов находится на ло- кальном диске, вы можете дать указание модулю GeoIP использовать ее для предоставления встраиваемых переменных на основе IP-адреса клиента:
load_module "/usr/lib64/nginx/modules/ngx_http_geoip_module.so"; http {
42 v Глава 3. Управление трафиком
|
...
}
Директива load_module динамически загружает модуль из его пути в файловой системе. Она действительна только в основном контексте. Директива geoip_country берет путь к файлу GeoIP.dat, содержащему базу данных, отображая IP-адреса в коды стран, и действительна только в контексте протокола HTTP.
Обсуждение
Директивы geoip_country и geoip_city предоставляют ряд встраиваемых переменных, доступных в этом модуле. Директива geoip_country активи- рует переменные, которые позволяют различать страну происхождения вашего клиента. Эти переменные включают в себя $geoip_country_code,
$geoip_country_code3 и $geoip_country_name. Переменная кода страны воз- вращает код страны из двух букв, а переменная с цифрой 3 на конце возвращает код страны, состоящий из трех букв.
Переменная имени страны возвращает полное название страны.
|
Используя эти переменные, вы можете регистрировать информацию
o вашем клиенте.
При желании можно передать эту информацию своему приложению в качестве заголовка или переменной или использовать NGINX для маршрутизации своего трафика особым образом.
См. также:
Обновления для GeoIP (https://github.com/maxmind/geoipupdate).
3.3. Ограничение доступа в зависимости от страны v 43
3.3.
|
Задача
Вам необходимо ограничить доступ из определенных стран согласно требованиям договора или приложения.
Решение
Отобразите коды стран, которые вы хотите заблокировать или разре- шить в переменную:
load_module "/usr/lib64/nginx/modules/ngx_http_geoip_module.so";
http {
map $geoip_country_code $country_access { "US" 0;
|
default 1;
}
...
}
В результате этого значение новой переменной $country_access будет равно 1 или 0. Если клиентский IP-адрес происходит из США или Рос- сии, значение переменной будет установлено на 0. Для любой другой страны значение переменной будет установлено на 1. Теперь в нашем блоке server мы будем использовать оператор if, чтобы запретить дос- туп любому, кто не из США или России:
server {
if ($country_access = '1') { return 403;
}
...
}
Если значение переменной $country_access установлено на 1, оператор if будет оценивать это как True. В этом случае сервер вернет ошибку 403 unauthorized. В противном случае сервер будет работать как обычно. Та-
|
Дата добавления: 2021-01-21; просмотров: 134; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!