将子域从 AWS ELB 传递到应用程序服务器

Pass subdomain to app servers from AWS ELB

我们有一个 Java 应用提供多种产品。它的行为会根据产品而变化。

产品由 url 的子域定义:

https://<product1>.example.com
https://<product2>.example.com
...

这些 url 中的每一个都通过 Route 53 映射到不同的 AWS Elastic Load Balancer,它将请求转发到我们的同质 EC2 应用程序服务器群。

所以https://<product1>.example.com有一个ELB,https://<product2>.example.com有一个不同的ELB。但是,这两个 ELBS 都将流量定向到具有相同 Java 应用程序的同一组服务器。

ELB根据是否是https转发9443和9001端口的请求,nginx对9001端口的所有流量进行重定向,否则通过8080端口转发给Java应用.

我需要能够在到达 Java 应用程序之前确定原始 url 是什么,因此它可用于确定响应的配置和行为。我想到的最好的是 $http_referer,但这只适用于初次访问后的任何请求,我们在第一次访问时也需要 url。

下面是我们部署的(非常)粗略的图表,希望对您有所帮助。

原来完整的主机名确实被推送到 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"';

注意 main 之后块最前面的 $host 变量。