将子域从 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
变量。
我们有一个 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
变量。