应用程序网关的后端运行状况和诊断日志
可以通过以下方式监视 Azure 应用程序网关资源:
后端运行状况:借助应用程序网关,可通过 Azure 门户和 PowerShell 监视后端池中服务器的运行状况。 还可通过性能诊断日志查找后端池的运行状况。
日志:通过日志记录,可出于监视目的从资源保存或使用性能、访问及其他数据。
指标:应用程序网关有几个指标可以帮助你验证系统是否按预期运行。
注意
若要与 Azure 交互,建议使用 Azure Az PowerShell 模块。 请参阅安装 Azure PowerShell 以开始使用。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az。
后端运行状况
借助应用程序网关,可通过门户、PowerShell 和命令行接口 (CLI) 监视后端池各个成员的运行状况。 还可通过性能诊断日志查找后端池的聚合运行状况摘要。
后端运行状况报告反映对后端实例的应用程序网关运行状况探测的输出。 如果探测成功且后端能够接收流量,则可认为后端运行状况正常, 否则不正常。
重要
如果应用程序网关子网上存在网络安全组 (NSG),请在应用程序网关子网上打开端口范围 65503-65534(适用于 v1 SKU)和 65200-65535(适用于 v2 SKU),以便接收入站流量。 此端口范围是进行 Azure 基础结构通信所必需的。 它们受 Azure 证书的保护(处于锁定状态)。 如果没有适当的证书,外部实体(包括这些网关的客户)将无法对这些终结点做出任何更改。
通过门户查看后端运行状况
门户中会自动提供后端运行状况。 在现有的应用程序网关中,选择“监视”>“后端运行状况”。
此页面将列出后端池中的每个成员(无论它是 NIC、IP 还是 FQDN)。 将显示后端池名称、端口、后端 HTTP 设置名称和运行状况状态。 运行状况的有效值为“正常”、“不正常”、“未知”。
注意
如果后端运行状况的状态是“未知”,请确保 NSG 规则、用户定义的路由 (UDR) 或虚拟网络中的自定义 DNS 没有阻止对后端的访问。
通过 PowerShell 查看后端运行状况
下面的 PowerShell 代码演示如何使用 Get-AzApplicationGatewayBackendHealth
cmdlet 查看后端运行状况:
Get-AzApplicationGatewayBackendHealth -Name ApplicationGateway1 -ResourceGroupName Contoso
通过 Azure CLI 查看后端运行状况
az network application-gateway show-backend-health --resource-group AdatumAppGatewayRG --name AdatumAppGateway
结果
以下代码片段演示了一个响应示例:
{
"BackendAddressPool": {
"Id": "/subscriptions/00000000-0000-0000-000000000000/resourceGroups/ContosoRG/providers/Microsoft.Network/applicationGateways/applicationGateway1/backendAddressPools/appGatewayBackendPool"
},
"BackendHttpSettingsCollection": [
{
"BackendHttpSettings": {
"Id": "/00000000-0000-0000-000000000000/resourceGroups/ContosoRG/providers/Microsoft.Network/applicationGateways/applicationGateway1/backendHttpSettingsCollection/appGatewayBackendHttpSettings"
},
"Servers": [
{
"Address": "hostname.chinanorth2.chinacloudapp.cn",
"Health": "Healthy"
},
{
"Address": "hostname.chinanorth2.chinacloudapp.cn",
"Health": "Healthy"
}
]
}
]
}
诊断日志
可在 Azure 中使用不同类型的日志来对应用程序网关进行管理和故障排除。 可通过门户访问其中部分日志。 可从 Azure Blob 存储提取所有日志并在 Azure Monitor 日志、Excel 和 Power BI 等各种工具中查看。 可从以下列表了解有关不同类型日志的详细信息:
- 活动日志:可使用 Azure 活动日志(以前称为操作日志和审核日志)查看提交到 Azure 订阅的所有操作及其状态。 默认情况下会收集活动日志条目,可在 Azure 门户中查看这些条目。
- 访问日志:可以使用此日志查看应用程序网关访问模式并分析重要信息。 此日志包括调用方的 IP、请求的 URL、响应延迟、返回代码,以及传入和传出的字节数。访问日志每 60 秒收集一次。 此日志包含每个应用程序网关实例的一条记录。 应用程序网关实例由 instanceId 属性标识。
- 性能日志:可使用此日志查看应用程序网关实例的执行情况。 此日志会捕获每个实例的性能信息,包括服务的总请求数、吞吐量(以字节为单位)、失败请求计数、运行正常和运行不正常的后端实例计数。 每隔 60 秒会收集一次性能日志。 性能日志仅适用于 v1 SKU。 对于 v2 SKU,请对性能数据使用指标。
- 防火墙日志:可使用此日志查看通过应用程序网关(配置有 Web 应用程序防火墙)的检测模式或阻止模式记录的请求。 防火墙日志每 60 秒收集一次。
注意
日志仅适用于在 Azure 资源管理器部署模型中部署的 Azure 资源。 不能将日志用于经典部署模型中的资源。 若要更好地了解两种模型,请参阅了解 Resource Manager 部署和经典部署一文。
可通过三种方式存储日志:
- 存储帐户:如果日志存储时间较长并且希望能根据需要随时查看,则最好使用存储帐户。
- 事件中心:若要集成其他安全信息和事件管理 (SIEM) 工具以获取资源警报,事件中心是很好的选择。
- Azure Monitor 日志:Azure Monitor 日志最适合用于应用程序常规实时监视或查看趋势。
通过 PowerShell 启用日志记录
每个 Resource Manager 资源都会自动启用活动日志记录。 必须启用访问和性能日志记录才能开始收集通过这些日志提供的数据。 若要启用日志记录,请执行以下步骤:
记下存储帐户的资源 ID,其中存储日志数据。 此值的形式为:/subscriptions/<subscriptionId>/resourceGroups/<资源组名称>/providers/Microsoft.Storage/storageAccounts/<存储帐户名称>。 可以使用订阅中的任何存储帐户。 可使用 Azure 门户查找此信息。
记下为其启用日志记录的应用程序网关的资源 ID。 此值的形式为:/subscriptions/<subscriptionId>/resourceGroups/<资源组名称>/providers/Microsoft.Network/applicationGateways/<应用程序网关名称>。 可以使用门户查找以下信息。
使用以下 PowerShell cmdlet 启用诊断日志记录:
Set-AzDiagnosticSetting -ResourceId /subscriptions/<subscriptionId>/resourceGroups/<resource group name>/providers/Microsoft.Network/applicationGateways/<application gateway name> -StorageAccountId /subscriptions/<subscriptionId>/resourceGroups/<resource group name>/providers/Microsoft.Storage/storageAccounts/<storage account name> -Enabled $true
提示
活动日志不需要单独的存储帐户。 使用存储来记录访问和性能需支付服务费用。
通过 Azure 门户启用日志记录
在 Azure 门户中找到资源,然后选择“诊断设置”。
对于应用程序网关,提供 3 种日志:
- 访问日志
- 性能日志
- 防火墙日志
若要开始收集数据,请选择“启用诊断”。
“诊断设置” 页提供用于诊断日志的设置。 本示例使用 Log Analytics 存储日志。 也可使用事件中心和存储帐户保存诊断日志。
键入设置的名称,确认设置,然后选择“保存”。
活动日志
默认情况下,Azure 生成活动日志。 日志可在 Azure 事件日志存储中保留 90 天。 了解有关这些日志的详细信息,请参阅查看事件和活动日志一文。
访问日志
只有按照上述步骤在每个应用程序网关实例上启用了访问日志,才会生成该日志。 数据存储在启用日志记录时指定的存储帐户中。 应用程序网关的每次访问均以 JSON 格式记录下来,如下所示。
对于应用程序网关和 WAF v2 SKU
值 | 说明 |
---|---|
instanceId | 处理请求的应用程序网关实例。 |
clientIP | 应用程序网关的直接客户端的 IP。 如果另一个代理在应用程序网关前面,则将显示该前端代理的 IP。 |
httpMethod | 请求所用的 HTTP 方法。 |
requestUri | 所收到请求的 URI。 |
UserAgent | HTTP 请求标头中的用户代理。 |
httpStatus | 从应用程序网关返回到客户端的 HTTP 状态代码。 |
httpVersion | 请求的 HTTP 版本。 |
receivedBytes | 接收的数据包的大小(以字节为单位)。 |
sentBytes | 发送的数据包的大小(以字节为单位)。 |
clientResponseTime | 处理客户端请求的第一个字节以及将响应中的第一个字节发送到客户端所需的时长(以秒为单位)。 |
timeTaken | 处理客户端请求的第一个字节以及将响应中的最后一个字节发送到客户端所需的时长(以秒为单位)。 必须注意,“所用时间”字段通常包括请求和响应数据包在网络上传输的时间。 |
WAFEvaluationTime | WAF 处理请求所需的时长(以秒为单位)。 |
WAFMode | 值可以是“检测”或“预防” |
transactionId | 唯一标识符,用于关联从客户端收到的请求 |
sslEnabled | 与后端池的通信是否使用了 TLS。 有效值为 on 和 off。 |
sslCipher | 用于 TLS 通信的密码套件(如果已启用 TLS)。 |
sslProtocol | 使用的 SSL/TLS 协议(如果已启用 TLS)。 |
serverRouted | 应用程序网关将请求路由到的后端服务器。 |
serverStatus | 后端服务器的 HTTP 状态代码。 |
serverResponseLatency | 后端服务器的响应延迟(以秒为单位)。 |
host | 请求的主机标头中列出的地址。 如果使用标头重写进行重写,此字段将包含更新的主机名 |
originalRequestUriWithArgs | 此字段包含原始请求 URL |
requestUri | 在应用程序网关上执行重写操作后,此字段将包含 URL |
originalHost | 此字段包含原始请求主机名 |
{
"timeStamp": "2021-10-14T22:17:11+00:00",
"resourceId": "/SUBSCRIPTIONS/{subscriptionId}/RESOURCEGROUPS/{resourceGroupName}/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/{applicationGatewayName}",
"listenerName": "HTTP-Listener",
"ruleName": "Storage-Static-Rule",
"backendPoolName": "StaticStorageAccount",
"backendSettingName": "StorageStatic-HTTPS-Setting",
"operationName": "ApplicationGatewayAccess",
"category": "ApplicationGatewayAccessLog",
"properties": {
"instanceId": "appgw_2",
"clientIP": "185.42.129.24",
"clientPort": 45057,
"httpMethod": "GET",
"originalRequestUriWithArgs": "\/",
"requestUri": "\/",
"requestQuery": "",
"userAgent": "Mozilla\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/52.0.2743.116 Safari\/537.36",
"httpStatus": 200,
"httpVersion": "HTTP\/1.1",
"receivedBytes": 184,
"sentBytes": 466,
"clientResponseTime": 0,
"timeTaken": 0.034,
"WAFEvaluationTime": "0.000",
"WAFMode": "Detection",
"transactionId": "592d1649f75a8d480a3c4dc6a975309d",
"sslEnabled": "on",
"sslCipher": "ECDHE-RSA-AES256-GCM-SHA384",
"sslProtocol": "TLSv1.2",
"sslClientVerify": "NONE",
"sslClientCertificateFingerprint": "",
"sslClientCertificateIssuerName": "",
"serverRouted": "52.239.221.65:443",
"serverStatus": "200",
"serverResponseLatency": "0.028",
"originalHost": "20.110.30.194",
"host": "20.110.30.194"
}
}
注意
clientIP 值为 127.0.0.1 的访问日志源自在应用程序网关实例上运行的内部安全进程。 可以放心地忽略这些日志条目。
对于应用程序网关 Standard 和 WAF SKU (v1)
值 | 说明 |
---|---|
instanceId | 处理请求的应用程序网关实例。 |
clientIP | 请求的起始 IP。 |
clientPort | 请求的起始端口。 |
httpMethod | 请求所用的 HTTP 方法。 |
requestUri | 所收到请求的 URI。 |
RequestQuery | 服务器路由:将请求发送到的后端池实例。X-AzureApplicationGateway-LOG-ID:用于请求的相关 ID。 它可用于排查后端服务器上的流量问题。 SERVER-STATUS:应用程序网关从后端接收的 HTTP 响应代码。 |
UserAgent | HTTP 请求标头中的用户代理。 |
httpStatus | 从应用程序网关返回到客户端的 HTTP 状态代码。 |
httpVersion | 请求的 HTTP 版本。 |
receivedBytes | 接收的数据包的大小(以字节为单位)。 |
sentBytes | 发送的数据包的大小(以字节为单位)。 |
timeTaken | 处理请求并发送响应所需的时长(以毫秒为单位)。 此时长按特定的时间间隔(从应用程序网关接收第一个 HTTP 请求字节到完成响应发送操作所需的时间)来计算。 必须注意,“所用时间”字段通常包括请求和响应数据包在网络上传输的时间。 |
sslEnabled | 与后端池的通信是否使用了 TLS/SSL。 有效值为 on 和 off。 |
host | 向后端服务器发送请求时所用的主机名。 如果正在重写后端主机名,则此名称将反映该主机名。 |
originalHost | 应用程序网关从客户端接收请求时所用的主机名。 |
{
"resourceId": "/SUBSCRIPTIONS/{subscriptionId}/RESOURCEGROUPS/PEERINGTEST/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/{applicationGatewayName}",
"operationName": "ApplicationGatewayAccess",
"time": "2017-04-26T19:27:38Z",
"category": "ApplicationGatewayAccessLog",
"properties": {
"instanceId": "ApplicationGatewayRole_IN_0",
"clientIP": "191.96.249.97",
"clientPort": 46886,
"httpMethod": "GET",
"requestUri": "/phpmyadmin/scripts/setup.php",
"requestQuery": "X-AzureApplicationGateway-CACHE-HIT=0&SERVER-ROUTED=10.4.0.4&X-AzureApplicationGateway-LOG-ID=874f1f0f-6807-41c9-b7bc-f3cfa74aa0b1&SERVER-STATUS=404",
"userAgent": "-",
"httpStatus": 404,
"httpVersion": "HTTP/1.0",
"receivedBytes": 65,
"sentBytes": 553,
"timeTaken": 205,
"sslEnabled": "off",
"host": "www.contoso.com",
"originalHost": "www.contoso.com"
}
}
性能日志
只有在每个应用程序网关实例上启用了性能日志,才会生成此日志,如上述步骤所示。 数据存储在启用日志记录时指定的存储帐户中。 每隔 1 分钟生成性能日志数据。 性能日志数据仅适用于 v1 SKU。 对于 v2 SKU,请对性能数据使用指标。 将记录以下数据:
Value | 说明 |
---|---|
instanceId | 正在为其生成性能数据的应用程序网关实例。 对于多实例应用程序网关,一个实例对应于一行。 |
healthyHostCount | 后端池中运行正常的主机数。 |
unHealthyHostCount | 后端池中运行不正常的主机数。 |
requestCount | 服务的请求数。 |
latency | 从实例到请求服务后端的请求的平均延迟(以毫秒为单位)。 |
failedRequestCount | 失败的请求数。 |
throughput | 自最后一个日志后的平均吞吐量,以每秒字节数为单位。 |
{
"resourceId": "/SUBSCRIPTIONS/{subscriptionId}/RESOURCEGROUPS/{resourceGroupName}/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/{applicationGatewayName}",
"operationName": "ApplicationGatewayPerformance",
"time": "2016-04-09T00:00:00Z",
"category": "ApplicationGatewayPerformanceLog",
"properties":
{
"instanceId":"ApplicationGatewayRole_IN_1",
"healthyHostCount":"4",
"unHealthyHostCount":"0",
"requestCount":"185",
"latency":"0",
"failedRequestCount":"0",
"throughput":"119427"
}
}
注意
延迟时间的计算是从接收到 HTTP 请求的第一个字节开始,到发出 HTTP 响应的最后一个字节为止。 它是应用程序网关处理时间加上后端的网络耗时,再加上后端处理请求所花费的时间之和。
防火墙日志
只有按照上述步骤为每个应用程序网关启用了防火墙日志,才会生成该日志。 此日志还需要在应用程序网关上配置 Web 应用程序防火墙。 数据存储在启用日志记录时指定的存储帐户中。 将记录以下数据:
Value | 说明 |
---|---|
instanceId | 为其生成了防火墙数据的应用程序网关实例。 对于多实例应用程序网关,一个实例对应于一行。 |
clientIp | 请求的起始 IP。 |
clientPort | 请求的起始端口。 |
requestUri | 所收到请求的 URI。 |
ruleSetType | 规则集类型。 可用值为 OWASP。 |
ruleSetVersion | 所使用的规则集版本。 可用值为 2.2.9 和 3.0。 |
ruleId | 触发事件的规则 ID。 |
message | 触发事件的用户友好消息。 详细信息部分提供了更多详细信息。 |
action | 针对请求执行的操作。 可用值为“已阻止”或“已允许”(对于自定义规则),“匹配”(当规则匹配请求的一部分时)和“已检测”和“已阻止”(两者均用于强制规则,具体取决于 WAF 是处于检测模式还是防护模式)。 |
site | 为其生成日志的站点。 目前仅列出 Global,因为规则是全局性的。 |
详细信息 | 触发事件的详细信息。 |
details.message | 规则的说明。 |
details.data | 在请求中找到的与规则匹配的特定数据。 |
details.file | 包含规则的配置文件。 |
details.line | 配置文件中触发了事件的行号。 |
hostname | 应用程序网关的主机名或 IP 地址。 |
transactionId | 给定事务的唯一 ID,它有助于对同一请求中发生的多个违反规则的情况进行分组。 |
{
"timeStamp": "2021-10-14T22:17:11+00:00",
"resourceId": "/SUBSCRIPTIONS/{subscriptionId}/RESOURCEGROUPS/{resourceGroupName}/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/{applicationGatewayName}",
"operationName": "ApplicationGatewayFirewall",
"category": "ApplicationGatewayFirewallLog",
"properties": {
"instanceId": "appgw_2",
"clientIp": "185.42.129.24",
"clientPort": "",
"requestUri": "\/",
"ruleSetType": "OWASP_CRS",
"ruleSetVersion": "3.0.0",
"ruleId": "920350",
"message": "Host header is a numeric IP address",
"action": "Matched",
"site": "Global",
"details": {
"message": "Warning. Pattern match \\\"^[\\\\d.:]+$\\\" at REQUEST_HEADERS:Host .... ",
"data": "20.110.30.194:80",
"file": "rules\/REQUEST-920-PROTOCOL-ENFORCEMENT.conf",
"line": "791"
},
"hostname": "20.110.30.194:80",
"transactionId": "592d1649f75a8d480a3c4dc6a975309d",
"policyId": "default",
"policyScope": "Global",
"policyScopeName": "Global"
}
}
查看和分析活动日志
可使用以下任意方法查看和分析活动日志数据:
- Azure 工具:通过 Azure PowerShell、Azure CLI、Azure REST API 或 Azure 门户检索活动日志中的信息。 使用 Resource Manager 的活动操作一文中详细介绍了每种方法的分步说明。
- Power BI:如果还没有 Power BI 帐户,可以免费试用。 使用 Power BI 模板应用,可以分析数据。
查看并分析访问、性能和防火墙日志
Azure Monitor 日志可从 Blob 存储帐户收集计数器和事件日志文件。 它含有可视化和强大的搜索功能,可用于分析日志。
还可以连接到存储帐户并检索访问和性能日志的 JSON 日志条目。 下载 JSON 文件后,可以将其转换为 CSV 并在 Excel、Power BI 或任何其他数据可视化工具中查看。
提示
如果你熟悉 Visual Studio 和更改 C# 中的常量和变量值的基本概念,则可以使用 GitHub 提供的日志转换器工具。
通过 GoAccess 分析访问日志
我们发布了一个资源管理器模板,用于安装和运行应用程序网关访问日志的常用 GoAccess 日志分析器。 GoAccess 提供了宝贵的 HTTP 流量统计信息,例如唯一访问者、请求的文件、主机、操作系统、浏览器和 HTTP 状态代码等。 有关更多详细信息,请参阅 GitHub 的资源管理器模板文件夹中的自述文件。
后续步骤
- Visualize your Azure Activity Log with Power BI(使用 Power BI 直观显示 Azure 活动日志)博客文章。
- View and analyze Azure activity logs in Power BI and more(在 Power BI 和其他组件中查看和分析 Azure 活动日志)博客文章。