Передача поддомена серверам приложений из 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 ответ:
Оказывается, полное имя хоста действительно перемещается на уровень 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
.