Передача поддомена серверам приложений из AWS ELB


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

Продукт определяется поддоменом url:

https://<product1>.example.com
https://<product2>.example.com
...
Каждый из этих URL-адресов сопоставляется с отдельным AWS Elastic Load Balancer через Route 53,который пересылает запросы на наш парк однородных серверов приложений EC2.

Таким образом, https://<product1>.example.com имеет ЭЛБ, https://<product2>.example.com имеет другой ЭЛБ. Однако оба этих ELB направляют трафик на один и тот же набор серверов с одним и тем же приложением Java.

Прямые запросы ELB через порты 9443 и 9001 основаны на том, являются ли они https или нет, и nginx делает перенаправление для всего трафика на порту 9001, в противном случае он перенаправляется через порт 8080 в приложение Java.

Я должен быть в состоянии определить, каким был исходный url-адрес, прежде чем он достигнет приложения Java, чтобы его можно было использовать для определения конфигурации и поведения ответа. Лучшее, что я придумал, - это $http_referer, но это работает только для любых запросов после первого визита, мы нужен url-адрес и при первом посещении.

Ниже приведена (очень) грубая схема нашего развертывания, я надеюсь, что это поможет. Введите описание изображения здесь

1 3

1 ответ:

Оказывается, полное имя хоста действительно перемещается на уровень nginx. Изменив логирование nginx, я добавил $host, и появилось полное имя хоста. Проблема, с которой я сталкиваюсь, заключается в том, что tomcat теряет данные хоста, но это должно быть легко исправлено.

Вот что я обновил в nginx.conf:

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

Обратите внимание на переменную $host в самом начале блока после main.