云计算的兴起,尤其是平台即服务(PaaS)和容器即服务(CaaS)产品,正在改变企业部署和运行业务应用的方式。设计云应用时,一项重要挑战是选择全托管云服务,在不影响安全性的前提下降低成本,并减少耗时的运维工作。
本博文将介绍如何在Microsoft Azure App Service上托管应用,并使用NGINX Plus保护这些应用,防范来自互联网的攻击。
Microsoft Azure App Service 简介
Microsoft Azure App Service是一个企业级全托管平台,组织无需管理底层基础设施,即可在Microsoft Azure中部署Web、API和移动应用,如图1所示。Azure App Service提供以下主要功能:
- Web Apps支持使用多种语言和框架(ASP.NET、Node.js、Java、PHP和Python)部署和运行Web应用。它还使用Internet Information Services(IIS)管理可扩展且可靠的Web应用,并提供全面的应用管理功能(监控、从暂存环境切换到生产环境、删除已部署的应用等)。此外,它还提供Docker运行时,用于在Linux上通过容器运行Web应用。
- API Apps提供用于部署支持CORS(跨域资源共享)的REST API的工具。无需更改代码,即可轻松使用Azure Active Directory、社交网络单点登录(SSO)或OAuth来保护Azure API Apps。
- Mobile Apps可快速部署移动后端服务,支持身份验证、推送通知、用户管理和云存储等基本功能。

借助Azure App Service,Microsoft提供了一种功能丰富且快捷的云端Web应用运行方式。开发人员可以使用ASP.NET、Java、Node.js、PHP和Python在本地开发应用,并通过Microsoft Visual Studio或Azure CLI轻松将其部署到Azure App Service。DevOps团队还可以利用Azure App Service的持续部署功能,在多个环境中快速、可靠地部署应用版本。
Azure App Service上的应用程序可以访问部署在Azure上的其他资源,也可以通过VPN连接到本地企业资源。
了解Azure App Service环境
通常,使用Azure App Service创建的应用会直接暴露在互联网上,并分配到azurewebsites.net的一个子域。为提高安全性,可以使用SSL终止,或OAuth2、OpenID Connect(OIDC)等身份验证和授权协议来保护应用。但是,无法通过精细的出站和入站安全规则来自定义网络,也无法应用Web应用防火墙(WAF)等中间件来防范来自互联网的恶意攻击或漏洞利用。
如果在Azure App Service中运行敏感应用并希望加以保护,可以使用Azure App Service Environment(ASE)。ASE是部署在虚拟网络中的隔离环境,专用于单个客户的应用。因此,您可以更有效地控制应用的入站和出站网络流量。
借助ASE,您可以在更安全的环境中大规模部署Web、API、移动或函数应用,如图2所示。

创建新的ASE v2
ASE有两个版本:ASE v1和ASE v2。本文将介绍ASE v2。
可以使用Azure Portal手动创建新的ASE v2,也可以使用Azure Resource Manager自动创建。
创建新的ASE时,必须在两种部署类型中选择一种:
- An 外部ASE通过公共IP地址公开访问托管在ASE上的应用程序。
- An ILB ASE通过一个仅可从Azure虚拟网络内部访问的专用IP地址公开ASE托管的应用程序。Azure将该内部终结点称为内部负载均衡器(ILB)。
在以下示例中,我们选择ILB ASE来阻止来自互联网的访问。因此,部署在ASE中的应用程序只能由同一网络中运行的虚拟机(VM)访问。以下两条命令使用Azure Resource Manager和Azure CLI预配新的ILB ASE v2:
$ azure config mode arm$ azure group deployment create my-resource-group my-deployment-name --template-uri https://raw.githubusercontent.com/azure/azure-quickstart-templates/master/201-web-app-asev2-ilb-create/azuredeploy.json保护对可公开访问的ASE中应用的访问
另一方面,如果希望应用可通过互联网访问,则必须保护应用,防范恶意攻击者企图窃取其中存储的敏感信息。
要在ASE中保护第7层应用,主要有两种选择:
- Azure Application Gateway
- 配备NGINX ModSecurity WAF模块的NGINX Plus
(可以改用具备WAF功能的自定义应用交付控制器[ADC],但本文不涵盖该用例。)
解决方案的选择取决于您的安全约束。一方面,Azure Application Gateway 提供开箱即用的安全策略实施方案,无需维护底层基础设施。另一方面,在虚拟机上部署 NGINX Plus 可提供功能强大的技术栈,让您能够更灵活地控制和精细调整安全规则。
要在Azure Application Gateway和NGINX Plus之间进行选择,以便为ASE中创建的应用提供负载均衡和安全保护,需要充分了解每种解决方案提供的功能。Azure Application Gateway适用于简单用例,但在复杂用例中,它并不具备NGINX Plus标配的许多功能。
下表比较了Azure Application Gateway和NGINX Plus对负载均衡和安全功能的支持情况。表格下方提供了有关NGINX Plus功能的更多详细信息。
功能 Azure Application Gateway NGINX Plus缓解能力 应用层(第7层) 应用层(第7层)支持HTTP感知 ✅ ✅支持HTTP/2感知 ❌ ✅支持WebSocket感知 ❌ ✅SSL卸载 ✅ ✅路由功能 根据请求URL或基于Cookie的会话亲和性进行简单决策 高级路由功能基于IP地址的访问控制列表 ❌(必须在Azure中的Web应用级别定义) ✅端点 任意Azure内部IP地址、公共互联网IP地址、Azure VM或Azure Cloud Service 任意Azure内部IP地址、公共互联网IP地址、Azure VM或Azure Cloud ServiceAzure Vnet支持 面向互联网和内部(Vnet)应用 面向互联网和内部(Vnet)应用WAF ✅ ✅大流量攻击 部分支持 部分支持协议攻击 部分支持 部分支持应用层攻击 ✅ ✅HTTP基本身份验证 ❌ ✅JWT身份验证 ❌ ✅OpenID Connect SSO ❌ ✅
可以看出,NGINX Plus和Azure Application Gateway均可充当应用交付控制器(ADC),提供第7层负载均衡功能和Web应用防火墙(WAF),为常见Web漏洞和利用攻击提供有力防护。
NGINX Plus还提供了Azure Application Gateway不具备的多项功能:
- URL重写和重定向:使用NGINX Plus,可以在将请求传递到后端服务器之前重写请求的URL。这意味着,无需修改向客户端公布的URL,即可更改文件位置或请求路径。还可以重定向请求。例如,可以将所有HTTP请求重定向到HTTPS服务器。
- 连接和速率限制:您可以配置多项限制来控制流量进出NGINX Plus实例。这些限制包括入站连接数、入站请求速率、与后端节点的连接数,以及从NGINX Plus到客户端的数据传输速率。
- HTTP/2和WebSocket支持:NGINX Plus支持在HTTP/2和WebSocket应用层(第7层)运行。Azure Application Gateway不支持;Azure Load Balancer则在TCP和UDP运行的网络层(第4层)支持这两种协议。
为进一步增强安全性,可以部署Azure DDoS Protection,以缓解第3层和第4层的威胁,并与Azure Application Gateway或NGINX Plus提供的第7层威胁缓解功能形成互补。
结合使用 NGINX Plus 与 Azure App Service 保护应用程序
图3展示了如何结合使用NGINX Plus和Azure App Service,为业务应用在生产环境中运行提供安全的环境。此部署策略使用NGINX Plus的负载均衡和WAF功能。

该部署包含以下组件:
- Azure虚拟网络(VNet),表示Azure云中专供贵组织使用的虚拟网络。它提供逻辑隔离,使Azure资源能够在虚拟网络中相互安全通信。此处定义了两个子网:Internal用于未直接暴露于互联网的Web应用,Waf用于NGINX Plus及其底层基础设施。
- Azure App Service Environment:此示例部署使用两个示例Web应用,即Web App 1和Web App 2,演示如何使用NGINX Plus保护不同的Web应用并对其进行负载均衡。在NGINX Plus中,可以通过配置不同的
upstream块,将请求分发到不同的Web应用,并使用location块根据URI进行内容路由。以下是实现此目标所需的最简NGINX Plus配置(此处所有请求均发送到同一个上游组):
upstream backend { server IP-address-of-your-ASE-ILB;
}
server {
location / {
proxy_set_header Host $host;
proxy_pass http://backend;
}
}- NGINX Plus:在多个Web应用之间对HTTP(S)连接进行负载均衡。与其他Azure服务相比,在VM中部署NGINX Plus可以更灵活地控制基础设施。例如,使用VM时,可以选择在隔离虚拟网络中运行的操作系统(Linux或Windows)。事实上,Azure VM支持部署NGINX Plus支持的所有Linux发行版(Amazon Linux除外,原因显而易见)。
- Azure VM规模集:VM规模集是一种Azure计算资源,可用于部署和管理一组相同的VM。您可以配置VM的大小,并将VM分配到适当的VNet。规模集中运行的所有VM均由Azure Load Balancer进行负载均衡,该负载均衡器在VM实例之间提供TCP连接。在此,规模集中的每个VM均基于Azure Marketplace中提供的NGINX Plus映像。规模集旨在实现真正的自动扩缩。
Azure还支持使用资源组,以便按逻辑轻松归组应用程序的Azure资源。使用资源组不会影响基础设施设计和拓扑,因此此处未予显示。
使用Azure虚拟机规模集实现NGINX Plus高可用性和自动扩缩容
Azure VM规模集不仅提供虚拟化能力,还可随时扩展,无需购买和维护支持扩展所需的物理硬件。不过,您仍需负责维护VM,包括配置、修补、安装安全更新,以及安装在VM上运行的软件。
在图 4 所示的架构中,NGINX Plus实例部署在Azure VM规模集中,以实现双活高可用性。双活配置的优势在于,所有NGINX Plus VM都可以处理由Azure Load Balancer路由的传入请求,从而以较低成本提供所需容量。

借助Azure VM规模集,还可以根据平均CPU使用率轻松设置NGINX Plus实例的自动扩缩容。在这种情况下,需要注意同步NGINX Plus配置文件。为此,可以使用NGINX Plus配置共享功能,具体说明请参阅《NGINX Plus管理指南》。
总结
将Azure App Service用于云应用,并在Web应用、API和移动后端前端部署NGINX Plus,可以在全球范围内对这些应用进行负载均衡和安全防护。结合使用NGINX Plus与Azure App Service,可构建全面实现负载均衡的基础设施,并提供较高水平的防护,抵御来自Web的漏洞利用和攻击。这种稳健的设计可支持关键应用在生产环境中安全运行。
资源
Web Apps概述(Microsoft)
App Service Environment简介(Microsoft)
使用Azure门户创建带Web应用防火墙的应用程序网关(Microsoft)
比较NGINX Open Source与NGINX Plus的功能(NGINX)
HTTP负载均衡(NGINX)
特邀联合作者Cedric Derue是Altran的解决方案架构师兼Microsoft MVP。特邀联合作者Vincent Thavonekham是VISEO的Microsoft区域总监兼Azure MVP。
相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。
