您正在查看 Apigee Edge 文档。
前往
Apigee X 文档。 info
问题
客户端应用收到 HTTP 状态代码 503 Service Unavailable,错误代码为 protocol.http.ProxyTunnelCreationFailed,以此响应 API 调用。
出错提示
客户端应用获取以下响应代码:
HTTP/1.1 503 Service Unavailable
此外,您可能会看到以下错误消息:
{
"fault":{
"faultstring":"Proxy refused to create tunnel with response status 403",
"detail":{
"errorcode":"protocol.http.ProxyTunnelCreationFailed"
}
}
}转发代理和隧道
Apigee Edge 允许您的 API 代理通过代理
服务器与后端服务器通信,如
配置转发代理中所述。代理服务器会根据所使用的代理类型(由属性 HTTPClient.proxy.type指示)打开与后端服务器的安全 (HTTPS) 或不安全
(HTTP) 连接,并双向传输数据。这称为隧道。
默认情况下,Apigee Edge 会对所有流量使用隧道。如需停用隧道,需要将属性
HTTPClient.use.tunneling 设置为 false.
错误代码:protocol.http.ProxyTunnelCreationFailed
如果代理服务器由于任何问题(例如防火墙、ACL(访问控制列表)限制、DNS 问题、后端服务器不可用、超时等)而无法在 Apigee Edge 和后端服务器之间创建隧道,Apigee Edge 会返回错误代码 protocol.http.ProxyTunnelCreationFailed。
Apigee Edge 响应的 faultstring 中的状态代码通常
表示导致此错误的可能的高级别原因。
Faultstring 模板:
Proxy refused to create tunnel with response status STATUS_CODE
faultstring 中观察到的一些状态代码的可能原因:
下表介绍了可能的原因,具体取决于
faultstring中指示的状态代码:
| Faultstring | 说明 |
|---|---|
代理拒绝创建隧道,响应状态为 403 |
这可能是由于后端服务器上配置的防火墙或 ACL 限制阻止了隧道的创建。 |
代理拒绝创建隧道,响应状态为 503 |
这可能是由于 DNS 问题、防火墙限制、后端服务器的 不可用阻止了隧道的创建 |
| 代理拒绝创建隧道,响应状态为 504 |
如果在创建隧道期间发生超时,可能会出现这种情况 |
您需要根据 faultstring 中观察到的状态代码,使用
适当的技术来排查问题。如果观察到错误代码 protocol.http.ProxyTunnelCreationFailed 的 faultstring 中的 状态代码 403 ,此剧本将说明如何排查问题。
可能的原因
如果在后端服务器上配置了任何防火墙或 ACL(访问
控制列表)限制,阻止代理服务器在 Apigee Edge 和后端服务器之间创建隧道,则会发生此错误(状态代码 403)。
| 原因 | 说明 | 适用的问题排查说明 |
|---|---|---|
| 代理拒绝创建隧道,响应状态为 403 | 代理服务器拒绝创建隧道,因为它在 Host 标头中收到的是代理服务器主机名
而不是后端服务器主机名。 |
仅限 Edge Private Cloud 用户 |
常见诊断步骤
使用以下工具/技术之一来诊断此错误:
跟踪工具
如需使用跟踪工具诊断错误,请执行以下操作:
- 启用 跟踪会话,然后执行以下任一操作:
- 等待错误发生,或
- 如果您可以重现问题,请进行 API 调用以重现问题
503 Service Unavailable并显示Proxy refused to create tunnel with response status 403.
确保已启用显示所有 FlowInfo :
- 选择其中一个失败的请求,然后检查跟踪记录。
- 浏览跟踪记录的不同阶段,找到发生失败的位置 。
您通常会在目标请求流已启动 阶段之后看到错误,如下所示:
请注意以下信息:
错误:
Proxy refused to create tunnel with response status 403- 在跟踪记录中前往 AX (已记录分析数据)阶段,然后点击该阶段。
向下滚动到阶段详细信息 响应标头 部分,然后 确定 X-Apigee-fault-code 和 X-Apigee-fault-source 的值,如下所示:
( 查看大图)
( 查看大图)
您将看到 X-Apigee-fault-code 和 X-Apigee-fault-source 的值分别为
protocol.http.ProxyTunnelCreationFailed和target,这表示此错误是由于代理隧道 创建失败(因为未收到预期主机标头)而导致的。响应标头 值 X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailedX-Apigee-fault-source target
NGINX
如需使用 NGINX 访问日志诊断错误,请执行以下操作:
- 如果您是 Private Cloud 用户,则可以使用 NGINX 访问日志来
确定有关 HTTP
503 Service Unavailable错误的关键信息。 检查 NGINX 访问日志:
/opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log其中: ORG、ORG 和 PORT# 将替换为实际值。
- 搜索以查看在特定时间段内(如果问题过去发生过)是否存在任何错误代码为
protocol.http.ProxyTunnelCreationFailed的503错误,或者是否存在任何请求仍然失败并显示503。 如果您确实发现任何
503错误,并且 X-Apigee-fault-code 与protocol.http.ProxyTunnelCreationFailed的值匹配,请确定 X-Apigee-fault-source 的值。NGINX 访问日志中的 503 错误示例:
在上面的 NGINX 访问日志示例条目中,X- Apigee-fault-code 和 X-Apigee-fault-source: 的值如下:
响应标头 值 X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailedX-Apigee-fault-source target
原因:代理拒绝创建隧道,响应状态为 403
诊断
- 使用跟踪工具或 NGINX 访问日志确定
503 Service Unavailable故障代码 和 故障来源,如 常见诊断步骤中所述。 - 查看 错误消息,确定 状态代码
在
faultstring中指示的,以了解隧道创建失败的原因。 - 在这种情况下,状态代码为
403,表示禁止 。 - 这意味着创建隧道的权限或特权不足。如果存在任何阻止创建隧道的防火墙或 ACL(访问控制列表)限制,通常会出现这种情况。
- 查看后端服务器上配置的任何防火墙和/或 ACL 限制,这些限制 可能会阻止创建隧道。
- 您需要根据防火墙和/或 ACL 限制的类型,相应地解决问题 。
我们以防火墙限制为例,说明如何排查和解决此 问题:
场景:后端服务器上的防火墙限制要求 Host 标头应始终 包含后端服务器主机名
您可以使用以下方法之一来确定 Apigee Edge 传递的 Host 标头:
跟踪记录
如需使用跟踪记录确定 Host 标头,请执行以下操作:
- 确定
faultstring包含Proxy refused to create tunnel with response status 403,如 常见诊断步骤中所述。 - 前往目标请求流已启动 阶段,然后查看 请求标头
- 验证 请求标头 部分的 Host 标头 中指定的主机名的值。
- 如果 Host 标头包含 代理主机名,则会导致此错误。
- 这是因为防火墙在后端服务器上配置为仅在 请求仅在 Host 标头 包含 后端服务器的 名称时才接受请求。
- 因此,当代理服务器尝试使用后端服务器创建隧道时,会
失败并显示错误
Proxy refused to create tunnel with response status 403。显示 Host 标头具有代理主机名的跟踪记录示例
( 查看大图)
在上面显示的跟踪记录示例中,它显示 Host 标头 包含代理主机名
www.proxyserver.com.由于后端服务器上配置了防火墙限制,该限制要求 Host 标头 只能包含后端服务器主机名,因此您会收到错误Proxy refused to create tunnel with response status 403.
tcpdump
如需使用 tcpdump 确定 Host 标头,请执行以下操作
使用以下命令在代理服务器上捕获来自 Apigee Edge 消息处理器组件的请求的
tcpdump:tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
如需详细了解如何使用
tcpdump命令,请参阅 tcpdump。- 使用
Wireshark 工具或类似
工具分析
tcpdump数据。 下面是使用 Wireshark 对 tcpdump 进行的分析示例:
( 查看大图)
- 数据包编号 13、14 和 15 显示消息 处理器正在通过三向 TCP 握手过程与代理服务器建立连接。
- 在数据包 16 中,消息处理器已连接到代理主机
httpbin.org(如上例所示)。 选择数据包 16,详细检查数据包的内容,特别是消息处理器传递给代理服务器的 Host 标头。
- 上面的示例显示 Host 标头
httpin.org,这是代理服务器的主机名。因此,当代理服务器尝试 与后端服务器创建隧道时,通过传递上述 Host 标头httpin.org,会失败并显示错误Proxy refused to create tunnel with response status 403。
- 确定
分辨率
场景:代理服务器上的防火墙限制要求 Host 标头应 始终包含后端服务器主机名
如果您已确定此错误是由于后端服务器上的防火墙配置为要求 Host 标头 应始终包含后端服务器主机名,而消息处理器发送的是代理服务器主机名,请执行以下步骤来解决此问题:
在 TargetEndpoint 中将属性
use.proxy.host.header.with.target.uri设置为 true,如以下示例所示:TargetEndpoint 配置示例:
<TargetEndpoint name="default"> <HTTPTargetConnection> <URL>https://mocktarget.apigee.net/json</URL> <Properties> <Property name="use.proxy.host.header.with.target.uri">true</Property> </Properties> </HTTPTargetConnection> </TargetEndpoint>确保在消息处理器上配置了与 转发代理相关的其他属性,如下所示:
- 查看每个消息处理器上的文件
/opt/apigee/customer/application/message-processor.properties。 确保根据您的使用场景或要求设置以下属性:
属性的示例值:
conf_http_HTTPClient.use.proxy=true conf/http.properties+HTTPClient.proxy.type=HTTP conf/http.properties+HTTPClient.proxy.host=PROXY_SERVER_HOST_NAME conf/http.properties+HTTPClient.proxy.port=PORT_# conf/http.properties+HTTPClient.proxy.user=USERNAME conf/http.properties+HTTPClient.proxy.password=PASSWORD
- 查看每个消息处理器上的文件
必须收集的诊断信息
如果按照上述说明操作后问题仍然存在,请收集以下 诊断信息,然后联系 Apigee Edge 支持团队:
如果您是 Private Cloud 用户,请提供以下信息:
- 针对失败的请求观察到的完整错误消息
- 环境名称
- API 代理软件包
- API 请求的跟踪文件
NGINX 访问日志
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log其中: ORG、ENV 和 PORT# 将替换为实际值。
消息处理器系统日志
/opt/apigee/var/log/edge-message-processor/logs/system.log