你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
应用程序网关的工作原理
本文介绍应用程序网关如何接受传入请求并将其路由到后端。
应用程序网关如何接受请求
客户端将请求发送到应用程序网关之前,会使用域名系统 (DNS) 服务器解析应用程序网关的域名。 由于所有应用程序网关都位于 azure.com 域中,因此 DNS 条目受 Azure 的控制。
Azure DNS 将 IP 地址返回到客户端,即应用程序网关的前端 IP 地址。
应用程序网关接受一个或多个侦听器上的传入流量。 侦听器是检查连接请求的逻辑实体。 侦听器上为客户端到应用程序网关的连接配置了前端 IP 地址、协议和端口号。
如果正在使用 Web 应用程序防火墙 (WAF),则应用程序网关会根据 WAF 规则检查请求标头和正文(如果有)。 此操作确定请求是有效的请求还是安全威胁。 如果请求有效,则将请求路由到后端。 如果请求无效,并且 WAF 处于预防模式,则会将其作为安全威胁予以阻止。 如果 WAF 处于检测模式,则将评估并记录请求,但仍将其转发到后端服务器。
可以使用 Azure 应用程序网关作为内部应用程序负载均衡器或面向 Internet 的应用程序负载均衡器。 面向 Internet 的应用程序网关使用公共 IP 地址。 面向 Internet 的应用程序网关的 DNS 名称可公开解析为其公共 IP 地址。 因此,面向 Internet 的应用程序网关可以路由来自 Internet 的客户端请求。
内部应用程序网关仅使用专用 IP 地址。 如果使用的是自定义或专用 DNS 区域,则域名应在内部可解析为应用程序网关的专用 IP 地址。 因此,内部负载均衡器只能路由有权访问应用程序网关虚拟网络的客户端发出的请求。
应用程序网关如何路由请求
如果请求有效且未被 WAF 阻止,则应用程序网关将评估与侦听器关联的请求路由规则。 此操作确定要将请求路由到哪个后端池。
根据请求路由规则,应用程序网关确定是要将侦听器上的所有请求路由到特定的后端池、根据 URL 路径将请求路由到不同的后端池,还是将请求重定向到另一个端口或外部站点。
注意
v1 SKU 规则按照在门户中列出的顺序进行处理。
当应用程序网关选择后端池时,会将请求发送到该池中的正常后端服务器之一 (y.y.y.y)。 服务器的运行状况由运行状况探测决定。 如果后端池包含多个服务器,应用程序网关将使用轮循机制算法在正常运行的服务器之间路由请求。 这会对服务器上的请求进行负载均衡。
应用程序网关确定后端服务器之后,会根据 HTTP 设置来与后端服务器建立新的 TCP 会话。 HTTP 设置组件指定与后端服务器建立新会话所需的协议、端口和其他路由相关设置。
HTTP 设置中使用的端口和协议确定应用程序网关与后端服务器之间的流量是已加密(从而实现端到端 TLS)还是未加密。
将原始请求发送到后端服务器时,应用程序网关遵循 HTTP 设置中指定的任何自定义配置,这些配置与替代主机名、路径和协议相关。 此操作将保持基于 Cookie 的会话相关性、连接清空、从后端选择主机名的设置,等等。
注意
如果后端池:
- 是公共终结点,则应用程序网关会使用其前端公共 IP 来访问服务器。 如果没有前端公共 IP 地址,系统会分配一个公共 IP 地址来建立出站外部连接。
- 包含可以在内部解析的 FQDN 或专用 IP 地址,则应用程序网关会使用其实例的专用 IP 地址将请求路由到后端服务器。
- 包含外部终结点或者可以在外部解析的 FQDN,则应用程序网关会使用其前端的公共 IP 地址将请求路由到后端服务器。 如果子网包含服务终结点,则应用程序网关将通过其专用 IP 地址将请求路由到服务。 DNS 解析基于专用 DNS 区域或自定义 DNS 服务器(如果已配置),或者会使用 Azure 提供的默认 DNS。 如果没有前端公共 IP 地址,系统会分配一个公共 IP 地址来建立出站外部连接。
后端服务器 DNS 解析
当后端池的服务器配置了完全限定的域名 (FQDN) 时,应用程序网关会执行 DNS 查找以获取域名的 IP 地址。 IP 值存储在应用程序网关的缓存中,使其在处理传入请求时能够更快地到达目标。
应用程序网关会将此缓存信息保留相当于该 DNS 记录的 TTL(生存时间)的时间,并会在 TTL 过期后执行新的 DNS 查找。 如果网关检测到后续 DNS 查询的 IP 地址发生更改,它会开始将流量路由到此更新的目标。 如果出现 DNS 查找无法收到响应或记录不再存在等问题,网关会继续使用上一个已知良好的 IP 地址。 这可确保对数据路径的影响最小。
重要
- 将自定义 DNS 服务器与应用程序网关的虚拟网络结合使用时,所有服务器使用相同的 DNS 值做出一致的响应,这一点很重要。 当应用程序网关的实例发出 DNS 查询时,它将使用服务器中最先响应的值。
- 使用专用终结点的专用 DNS 区域时,本地自定义 DNS 服务器的用户必须确保通过 Azure DNS 专用解析程序(推荐)或 DNS 转发器 VM 连接到 Azure DNS。
对请求的修改
应用程序网关先在所有请求中插入六个附加的标头,然后再将请求转发到后端。 这些标头是 x-forwarded-for、x-forwarded-port、x-forwarded-proto、x-original-host、x-original-url 和 x-appgw-trace-id。x-forwarded-for 标头的格式是逗号分隔的“IP:端口”列表。
x-forwarded-proto 的有效值为 HTTP 或 HTTPS。 x-forwarded-port 指定请求抵达应用程序网关时所在的端口。 x-original-host 标头包含随请求一起抵达的原始主机标头。 此标头在 Azure 网站集成中非常有用,其中,传入的主机标头在流量路由到后端之前会修改。 如果已启用会话相关性作为一个选项,则会添加网关管理的相关性 Cookie。
x-appgw-trace-id 是应用程序网关针对每个客户端请求生成的唯一 guid,在转发给后端池成员的请求中提供。 GUID 包含 32 个字母数字字符,其中不含短划线(例如:ac882cd65a2712a0fe1289ec2bb6aee7)。 此 GUID 可用于关联应用程序网关接收的请求,并通过诊断日志中的 transactionId 属性启动到后端池成员。
可配置应用程序网关,让它使用重写 HTTP 标头和 URL 修改标头,或使用路径替代设置修改 URI 路径。 但是,除非配置为这样做,否则所有传入的请求都会代理到后端。