1. Введение
Добро пожаловать на практическую работу по внешнему HTTPs LB с расширенным управлением трафиком (Envoy)!
Последняя версия внешнего балансировщика нагрузки HTTP(S) с расширенным управлением трафиком содержит все функции нашего существующего классического глобального внешнего балансировщика нагрузки HTTP(S), а также постоянно расширяет список возможностей расширенного управления трафиком. Некоторые из этих возможностей являются новыми для наших балансировщиков нагрузки, а некоторые расширяют существующие. Вот лишь частичный список этих возможностей:
- Взвешенное разделение трафика
- Запросить зеркалирование
- Обнаружение выбросов
- Запрос повторных попыток
- Впрыскивание неисправностей
- Дополнительные параметры привязки сеанса к бэкэнду
- Дополнительные параметры преобразования заголовков
- Совместное использование ресурсов между источниками (CORS)
- Новые алгоритмы балансировки нагрузки
Чему вы научитесь
- Как настроить группу управляемых экземпляров и связанные с ней правила VPC и брандмауэра
- Как использовать расширенные функции управления трафиком нового балансировщика нагрузки
- Как проверить, что расширенные функции управления трафиком работают так, как задумано.
Что вам понадобится
- Базовые сетевые технологии и знание HTTP
- Базовые знания командной строки Unix/Linux
Топология и вариант использования Codelab
Рисунок 1 — Топология маршрутизации балансировщика нагрузки HTTP
В ходе этой лабораторной работы по кодированию вы настроите три управляемые группы экземпляров: по одной в восточной, западной и центральной частях. Вы создадите глобальный внешний балансировщик нагрузки HTTPS. Этот балансировщик будет использовать несколько расширенных функций, поддерживаемых балансировщиком нагрузки на основе Envoy. После развертывания вы смоделируете нагрузку и убедитесь, что заданные вами конфигурации работают корректно.
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в Google Cloud Console и создайте новый проект или используйте существующий. Если у вас ещё нет учётной записи Gmail или Google Workspace, вам необходимо её создать .
- Название проекта — отображаемое имя участников проекта. Это строка символов, не используемая API Google. Вы можете изменить её в любой момент.
- Идентификатор проекта уникален для всех проектов Google Cloud и неизменяем (нельзя изменить после установки). Cloud Console автоматически генерирует уникальную строку; обычно вам не важно, какой именно. В большинстве практических работ вам потребуется указать идентификатор проекта (обычно обозначаемый как
PROJECT_ID
). Если вам не нравится сгенерированный идентификатор, вы можете сгенерировать другой случайный идентификатор. Вы также можете попробовать использовать свой собственный идентификатор и посмотреть, доступен ли он. После этого шага его нельзя будет изменить, и он останется на протяжении всего проекта. - К вашему сведению, существует третье значение — номер проекта , который используется некоторыми API. Подробнее обо всех трёх значениях можно узнать в документации .
- Далее вам нужно включить биллинг в Cloud Console для использования облачных ресурсов/API. Выполнение этой лабораторной работы не потребует больших затрат, если вообще потребует. Чтобы отключить ресурсы и избежать списания средств за пределами этого руководства, вы можете удалить созданные вами ресурсы или проект. Новые пользователи Google Cloud могут воспользоваться бесплатной пробной версией стоимостью 300 долларов США .
Запустить Cloud Shell
Хотя Google Cloud можно управлять удаленно с вашего ноутбука, в этой лабораторной работе вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.
В консоли Google Cloud Console нажмите значок Cloud Shell на верхней правой панели инструментов:
Подготовка и подключение к среде займёт всего несколько минут. После завершения вы увидите примерно следующее:
Эта виртуальная машина содержит все необходимые инструменты разработки. Она предоставляет постоянный домашний каталог объёмом 5 ГБ и работает в облаке Google Cloud, что значительно повышает производительность сети и аутентификацию. Всю работу в этой лабораторной работе можно выполнять в браузере. Вам не нужно ничего устанавливать.
Прежде чем начать
Внутри Cloud Shell убедитесь, что ваш идентификатор проекта настроен.
проект списка конфигураций gcloud
gcloud config set project [ИМЯ-ВАШЕГО-ПРОЕКТА]
PROJECT_ID=[ИМЯ-ВАШЕГО-ПРОЕКТА]
эхо $PROJECT_ID
Включить API
Включить все необходимые службы
gcloud services enable compute.googleapis.com gcloud services enable logging.googleapis.com gcloud services enable monitoring.googleapis.com
3. Создайте сеть VPC
Создать сеть VPC
Из Cloud Shell
gcloud compute networks create httplbs --subnet-mode=auto
Выход
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/httplbs]. NAME: httplbs SUBNET_MODE: AUTO BGP_ROUTING_MODE: REGIONAL IPV4_RANGE: GATEWAY_IPV4:
Создать правила брандмауэра VPC
После создания VPC необходимо создать правила брандмауэра. Они будут использоваться для разрешения всем IP-адресам доступа к внешнему IP-адресу веб-сайта тестового приложения через порт 80 для HTTP-трафика.
Из Cloud Shell
gcloud compute firewall-rules create httplb-allow-http-rule \ --allow tcp:80 \ --network httplbs \ --source-ranges 0.0.0.0/0 \ --priority 700
Выход
Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/httplb-allow-http-rule]. Creating firewall...done. NAME: httplb-allow-http-rule NETWORK: httplbs DIRECTION: INGRESS PRIORITY: 700 ALLOW: tcp:80 DENY: DISABLED: False
4. Настройте группы управляемых экземпляров.
Вам необходимо настроить группы управляемых экземпляров, включающие шаблоны для ресурсов бэкенда, используемых HTTP-балансировщиком нагрузки. Сначала мы создадим шаблоны экземпляров, определяющие конфигурацию виртуальных машин, создаваемых для каждого региона. Затем для бэкенда в каждом регионе мы создадим группу управляемых экземпляров, ссылающуюся на шаблон экземпляра.
Группы управляемых экземпляров могут быть зональными или региональными. В этой лабораторной работе мы создадим три региональные группы управляемых экземпляров: одну в зоне us-east1, одну в зоне us-west1 и одну в зоне us-central1.
В этом разделе вы видите готовый скрипт запуска, который будет использоваться при создании экземпляра. Этот скрипт запуска устанавливает и активирует функции веб-сервера, которые мы будем использовать для моделирования веб-приложения. Ознакомьтесь с этим скриптом.
Создайте шаблоны экземпляров «Восток», «Запад» и «Централ»
Первый шаг — создание шаблона экземпляра us-east-1.
Из Cloud Shell
gcloud compute instance-templates create us-east1-template \ --region=us-east1 \ --network=httplbs \ --tags=http-server, \ --image-family=debian-12 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'
Выход
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates/us-east1-template]. NAME: us-east1-template MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: CREATION_TIMESTAMP: 2021-11-11T11:02:37.511-08:00
Следующий шаг — создание шаблона экземпляра us-west-1.
Из Cloud Shell
gcloud compute instance-templates create us-west1-template \ --region=us-west1 \ --network=httplbs \ --tags=http-server, \ --image-family=debian-12 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'
Выход
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates/us-west1-template]. NAME: us-west1-template MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: CREATION_TIMESTAMP: 2021-11-11T11:03:08.577-08:00
Следующим шагом будет создание шаблона экземпляра us-central-1.
Из Cloud Shell
gcloud compute instance-templates create us-central1-template \ --region=us-central1 \ --network=httplbs \ --tags=http-server, \ --image-family=debian-12 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'
Выход
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates/us-central1-template]. NAME: us-central1-template MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: CREATION_TIMESTAMP: 2021-11-11T11:03:44.179-08:00
Теперь вы можете убедиться, что наши шаблоны экземпляров были успешно созданы, с помощью следующей команды gcloud:
Из Cloud Shell
gcloud compute instance-templates list
Выход
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP us-central1-template n1-standard-1 2021-11-09T09:25:37.263-08:00 us-east1-template n1-standard-1 2021-11-09T09:24:35.275-08:00 us-west1-template n1-standard-1 2021-11-09T09:25:08.016-08:00
Создайте группы управляемых экземпляров «Восток», «Запад» и «Централ»
Теперь нам необходимо создать управляемую группу экземпляров из шаблонов экземпляров, которые мы создали ранее.
Из Cloud Shell
gcloud compute instance-groups managed create us-east1-mig \ --base-instance-name=us-east1-mig \ --size=1 \ --template=us-east1-template \ --zone=us-east1-b
Выход
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-b/instanceGroupManagers/us-east1-mig]. NAME: us-east1-mig LOCATION: us-east1-b SCOPE: zone BASE_INSTANCE_NAME: us-east1-mig SIZE: 0 TARGET_SIZE: 1 INSTANCE_TEMPLATE: us-east1-template AUTOSCALED: no
Из Cloud Shell
gcloud compute instance-groups managed create us-west1-mig \ --base-instance-name=us-west1-mig \ --size=1 \ --template=us-west1-template \ --zone=us-west1-a
Выход
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroupManagers/us-west1-mig]. NAME: us-west1-mig LOCATION: us-west1-a SCOPE: zone BASE_INSTANCE_NAME: us-west1-mig SIZE: 0 TARGET_SIZE: 1 INSTANCE_TEMPLATE: us-west1-template AUTOSCALED: no
Из Cloud Shell
gcloud compute instance-groups managed create us-central1-mig \ --base-instance-name=us-central1-mig \ --size=1 \ --template=us-central1-template \ --zone=us-central1-a
Выход
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-central1-a/instanceGroupManagers/us-central1-mig]. NAME: us-central1-mig LOCATION: us-central1-a SCOPE: zone BASE_INSTANCE_NAME: us-central1-mig SIZE: 0 TARGET_SIZE: 1 INSTANCE_TEMPLATE: us-central1-template AUTOSCALED: no
Мы можем убедиться, что наши группы экземпляров были успешно созданы, с помощью следующей команды gcloud:
Из Cloud Shell
gcloud compute instance-groups list
Выход
NAME LOCATION SCOPE NETWORK MANAGED INSTANCES us-central1-mig us-central1 zone httplbs Yes 1 us-west1-mig us-west1 zone httplbs Yes 1 us-east1-mig us-east1 zone httplbs Yes 1
Проверка работоспособности веб-сервера
Каждый экземпляр настроен на запуск веб-сервера Apache с простым PHP-скриптом, который отображает:
Чтобы убедиться в корректной работе веб-серверов, перейдите в раздел Compute Engine -> Экземпляры виртуальных машин. Убедитесь, что новые экземпляры (например, us-east1-mig-xxx) созданы в соответствии с определениями их групп экземпляров.
Теперь выполните веб-запрос в браузере, чтобы убедиться, что веб-сервер запущен (запуск может занять около минуты). На странице экземпляров виртуальных машин в разделе Compute Engine выберите экземпляр, созданный вашей группой экземпляров, и нажмите на его внешний (публичный) IP-адрес.
Или в браузере перейдите по адресу http://<IP_Address>
5. Настройте балансировщик нагрузки
Создать проверку здоровья
Сначала нам нужно создать базовую проверку работоспособности, чтобы убедиться в успешной работе наших сервисов. Мы создадим базовую проверку работоспособности, но доступно множество дополнительных настроек.
Из Cloud Shell
gcloud compute health-checks create http http-basic-check \ --port 80
Резервный внешний IP-адрес
На этом этапе вам необходимо зарезервировать глобально доступный статический IP-адрес, который позже будет подключен к балансировщику нагрузки.
Из Cloud Shell
gcloud compute addresses create lb-ipv4-2 \ --ip-version=IPV4 \ --global
Обязательно запишите зарезервированный IP-адрес.
gcloud compute addresses describe lb-ipv4-2 \ --format="get(address)" \ --global
Создать внутренние службы
Теперь нам нужно создать внутреннюю службу для каждой из групп управляемых экземпляров, созданных ранее: по одной для «Востока», «Запада» и «Центра».
Создание внутренней службы для группы экземпляров под управлением East.
Из Cloud Shell
gcloud compute backend-services create east-backend-service \ --load-balancing-scheme=EXTERNAL_MANAGED \ --protocol=HTTP \ --port-name=http \ --health-checks=http-basic-check \ --global
Создание внутренней службы для группы экземпляров под управлением West.
Из Cloud Shell
gcloud compute backend-services create west-backend-service \ --load-balancing-scheme=EXTERNAL_MANAGED \ --protocol=HTTP \ --port-name=http \ --health-checks=http-basic-check \ --global
Создание внутренней службы для группы экземпляров с центральным управлением.
Из Cloud Shell
gcloud compute backend-services create central-backend-service \ --load-balancing-scheme=EXTERNAL_MANAGED \ --protocol=HTTP \ --port-name=http \ --health-checks=http-basic-check \ --global
Добавить MIG к внутренним службам
Теперь, когда мы создали соответствующие внутренние службы для каждого кластера приложений, нам нужно добавить созданные ранее группы управляемых экземпляров к каждой внутренней службе.
Добавить East MIG к серверной службе.
Из Cloud Shell
gcloud compute backend-services add-backend east-backend-service \ --balancing-mode='UTILIZATION' \ --instance-group=us-east1-mig \ --instance-group-zone=us-east1-b \ --global
Добавить West MIG в бэкэнд-сервис.
Из Cloud Shell
gcloud compute backend-services add-backend west-backend-service \ --balancing-mode='UTILIZATION' \ --instance-group=us-west1-mig \ --instance-group-zone=us-west1-a \ --global
Добавьте Central MIG к серверной службе.
Из Cloud Shell
gcloud compute backend-services add-backend central-backend-service \ --balancing-mode='UTILIZATION' \ --instance-group=us-central1-mig \ --instance-group-zone=us-central1-a \ --global
Создать карту URL
Карта URL — это место, где будут располагаться расширенные функции управления трафиком для этой лабораторной работы. Нам необходимо создать файл .yaml с конфигурацией. В файле .yaml мы создали соответствие префиксу /roundrobbin, поэтому эти конфигурации будут влиять только на трафик, соответствующий /roundrobbin. Мы указали, что 50% трафика должно идти на east-backend-service, а 50% — на west-backend-service. Мы также добавили заголовок ответа value:{test}, который будет присутствовать во всех ответах. Наконец, мы добавили, что весь трафик должен зеркалироваться на central-backend-service. Трафик дублируется и отправляется сюда только в целях тестирования.
Сохраните пример как файл .yaml на своем компьютере.
defaultService: https://www.googleapis.com/compute/v1/projects/[project_id]/global/backendServices/east-backend-service kind: compute #urlMap name: web-map-http hostRules: - hosts: - '*' pathMatcher: matcher1 pathMatchers: - defaultService: https://www.googleapis.com/compute/v1/projects/[project_id]/global/backendServices/east-backend-service name: matcher1 routeRules: - matchRules: - prefixMatch: /roundrobbin priority: 2 headerAction: responseHeadersToAdd: - headerName: test headerValue: value replace: True routeAction: weightedBackendServices: - backendService: https://www.googleapis.com/compute/v1/projects/[project_id]/global/backendServices/east-backend-service weight: 50 - backendService: https://www.googleapis.com/compute/v1/projects/[project_id]/global/backendServices/west-backend-service weight: 50 retryPolicy: retryConditions: ['502', '504'] numRetries: 3 perTryTimeout: seconds: 1 nanos: 50 requestMirrorPolicy: backendService: https://www.googleapis.com/compute/v1/projects/[project_id]/global/backendServices/central-backend-service
Создайте URL-карту, импортировав документ с вашего компьютера. Обратите внимание, что исходный путь будет отличаться в зависимости от того, где вы сохранили файл .yaml.
Из Cloud Shell
gcloud compute url-maps import web-map-http \ --source /Users/[USERNAME]/Documents/Codelab/lbconfig.yaml \ --global
Создать HTTP-фронтенд
Заключительный шаг в создании балансировщика нагрузки — создание интерфейса. Он сопоставит зарезервированный ранее IP-адрес с созданной вами картой URL-адресов балансировщика нагрузки.
Из Cloud Shell
gcloud compute target-http-proxies create http-lb-proxy-adv \ --url-map=web-map-http
Далее вам необходимо создать глобальное правило переадресации, которое сопоставит зарезервированный ранее IP-адрес с HTTP-прокси.
Из Cloud Shell
gcloud compute forwarding-rules create http-content-rule \ --load-balancing-scheme EXTERNAL_MANAGED \ --address=lb-ipv4-2 \ --global \ --target-http-proxy=http-lb-proxy-adv \ --ports=80
6. Убедитесь, что расширенные функции управления дорожным движением работают.
Чтобы проверить работоспособность реализованной функции разделения трафика, необходимо сгенерировать нагрузку. Для этого мы создадим новую виртуальную машину для имитации нагрузки.
Создать правило разрешения брандмауэра SSH
Чтобы подключиться по SSH к виртуальной машине, с которой мы будем генерировать трафик, сначала необходимо создать правило брандмауэра, которое разрешит трафик SSH к виртуальной машине.
Из Cloud Shell
gcloud compute firewall-rules create fw-allow-ssh \ --network=httplbs \ --action=allow \ --direction=ingress \ --target-tags=allow-ssh \ --rules=tcp:22
Выход
NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED fw-allow-ssh httplbs INGRESS 1000 tcp:22 False
Создать Siege-vm
Теперь вам нужно создать siege-vm, которую вы будете использовать для генерации нагрузки.
Из Cloud Shell
gcloud compute instances create siege-vm \ --network=httplbs \ --zone=us-east4-c \ --machine-type=e2-medium \ --tags=allow-ssh,http-server \ --metadata=startup-script='sudo apt-get -y install siege'
Выход
NAME ZONE MACHINE_TYPE INTERNAL_IP EXTERNAL_IP STATUS siege-vm us-east4-c e2-medium 10.150.0.3 34.85.218.119 RUNNING
Теперь вы можете подключиться к созданной вами виртуальной машине по SSH. После её создания нажмите SSH , чтобы запустить терминал и подключиться.
После подключения выполните следующую команду для генерации нагрузки. Используйте IP-адрес, зарезервированный ранее для внешнего балансировщика нагрузки HTTP.
Из Cloud Shell
siege -c 250 http://[$lb-ipv4-2]/roundrobbin
Выход
New configuration template added to /home/cloudcurriculumdeveloper/.siege Run siege -C to view the current settings in that file [alert] Zip encoding disabled; siege requires zlib support to enable it: No such file or directory ** SIEGE 4.0.2 ** Preparing 250 concurrent users for battle. The server is now under siege...
Проверьте распределение нагрузки
Теперь, когда Siege запущено, пора проверить, равномерно ли распределяется трафик между восточной и западной управляемыми группами экземпляров. Кроме того, вы можете проверить, работает ли зеркалирование трафика и отправляется ли трафик в центральную управляемую группу экземпляров.
В консоли Cloud Console в меню навигации выберите «Сетевые службы» > «Балансировка нагрузки». Выберите балансировщик нагрузки web-map-http. Перейдите на вкладку «Мониторинг», чтобы увидеть представленную ниже диаграмму.
Вы сможете в режиме реального времени наблюдать распределение трафика по этому MIG. Трафик распределяется равномерно, так как вы настроили распределение 50/50 по принципу раундового роббинга.
Чтобы убедиться в работоспособности созданной вами политики зеркалирования трафика, необходимо проверить использование управляемой группы экземпляров central-backend-service. Для этого перейдите в раздел «Вычисления», «Вычислительный модуль», «Группы экземпляров» и выберите us-central1-mig. Затем перейдите на вкладку «Мониторинг».
Вы увидите заполненные диаграммы, демонстрирующие, что трафик был зеркально отражен в этой управляемой группе экземпляров.
Остановить осаду
Теперь, когда вы убедились, что расширенное разделение трафика работает, пора остановить осаду. Для этого вернитесь в SSH-терминал siege-vm и нажмите CTRL+C , чтобы остановить осаду.
Проверить отправляемый заголовок ответа
Прежде чем приступать к очистке, вы можете быстро убедиться, что балансировщик нагрузки HTTP отправляет правильный заголовок ответа. Вы настроили его на отправку тестового заголовка со значением содержимого. Выполнение команды curl из Cloud Shell даст ожидаемый ответ.
Из Cloud Shell
curl -svo /dev/null http://lb-ipv4-2/roundrobbin
Выход
* Trying lb-ipv4-2.. * TCP_NODELAY set * Connected to lb-ipv4-2 ( lb-ipv4-2) port 80 (#0) > GET /roundrobbin HTTP/1.1 > Host: lb-ipv4-2 > User-Agent: curl/7.64.1 > Accept: */* > < HTTP/1.1 404 Not Found < date: Wed, 10 Nov 2021 17:05:27 GMT < server: envoy < Content-Length: 273 < content-type: text/html; charset=iso-8859-1 < via: 1.1 google < test: value < { [273 bytes data] * Connection #0 to host 34.149.2.26 left intact * Closing connection 0
7. Уборка лаборатории
Теперь, когда мы закончили с лабораторной средой, пора её удалить. Выполните следующие команды, чтобы удалить тестовую среду.
Из Cloud Shell
gcloud compute instances delete siege-vm --zone=us-east4-c gcloud compute forwarding-rules delete http-content-rule --global gcloud compute target-http-proxies delete http-lb-proxy-adv gcloud compute url-maps delete web-map-http gcloud compute backend-services delete east-backend-service --global gcloud compute backend-services delete west-backend-service --global gcloud compute backend-services delete central-backend-service --global gcloud compute addresses delete lb-ipv4-2 --global gcloud compute health-checks delete http-basic-check gcloud compute instance-groups managed delete us-east1-mig --zone us-east1-b gcloud compute instance-groups managed delete us-west1-mig --zone us-west1-a gcloud compute instance-groups managed delete us-central1-mig --zone us-central1-a gcloud compute instance-templates delete "us-east1-template" gcloud compute instance-templates delete "us-west1-template" gcloud compute instance-templates delete "us-central1-template" gcloud compute firewall-rules delete httplb-allow-http-rule gcloud compute firewall-rules delete fw-allow-ssh gcloud compute networks delete httplbs
8. Поздравляем!
Вы завершили практическую работу по теме «Внешний HTTPs LB с расширенным управлением трафиком (Envoy)»!
Что мы рассмотрели
- Как настроить группу управляемых экземпляров и связанные с ней правила VPC и брандмауэра
- Как использовать расширенные функции управления трафиком нового балансировщика нагрузки
- Как проверить, что расширенные функции управления трафиком работают так, как задумано.
Следующие шаги
- Попробуйте другие расширенные функции маршрутизации, такие как перезапись URL-адресов, добавление заголовков CORS и многое другое ( ссылка )