502 Bad Gateway - 响应 405(不允许标头)

您正在查看 Apigee Edge 文档。
前往 Apigee X 文档
info

问题

客户端应用收到 HTTP 状态代码 502 Bad Gateway,并收到错误 代码 protocol.http.Response405WithoutAllowHeader,以此响应 API 调用。

出错提示

客户端应用会收到以下响应代码:

HTTP/1.1 502 Bad Gateway

此外,您可能会看到以下错误消息:

{
   "fault":{
      "faultstring":"Received 405 Response without Allow Header",
      "detail":{
         "errorcode":"protocol.http.Response405WithoutAllowHeader"
      }
   }
}

可能的原因

如果后端服务器返回 405 Method Not Allowed 状态 代码,而不使用 Allow 标头,则会出现此错误。

根据规范 RFC 7231 第 6.5.5 节:405 不允许的方法,源服务器 必须在 405 响应中生成并发送 Allow 标头字段,其中包含目标资源当前支持的方法 列表。否则,Apigee 会返回 502 Bad Gateway 和错误代码 protocol.http.Response405WithoutAllowHeader.

原因 说明 适用的问题排查说明
后端服务器返回 405 响应,但不使用 Allow 标头 处理 API 请求的后端服务器返回 405 状态代码,但不使用 Allow 标头。 Edge Public 和 Private Cloud 用户

常见诊断步骤

请使用以下工具/方法之一来诊断此错误:

API 监控

如需使用 API 监控诊断错误,请执行以下操作:

  1. 以具有 适当角色的用户身份登录 Edge 界面
  2. 切换到您要调查问题的组织。

    组织下拉列表
  3. 依次前往分析 > API 监控 > 调查 页面。
  4. 选择您观察到错误的具体时间范围。
  5. 绘制故障代码时间 的关系图。

  6. 选择包含故障代码 protocol.http.Response405WithoutAllowHeader 的单元格,如下所示:

  7. 系统会显示有关故障代码 protocol.http.Response405WithoutAllowHeader 的信息,如下所示:

  8. 点击查看日志 ,然后展开其中一个失败的请求以查看更多信息。

  9. 日志 窗口中,记下以下详细信息:
    • 状态代码502
    • 故障来源target
    • 故障代码protocol.http.Response405WithoutAllowHeader
  10. 如果故障来源target故障代码protocol.http.Response405WithoutAllowHeader,则表示后端 服务器返回 405 Method Not Allowed 状态代码,但不使用 Allow 标头。

跟踪工具

如需使用跟踪工具诊断错误,请执行以下操作:

  1. 启用 跟踪会话,然后执行以下操作之一:
    • 等待 502 Bad Gateway 错误发生,或
    • 如果您可以重现该问题,请进行 API 调用以重现该问题 - 502 Bad Gateway 错误
  2. 确保显示所有 FlowInfo 处于启用状态:

  3. 选择其中一个失败的请求,然后检查跟踪记录。
  4. 浏览跟踪记录的不同阶段,找到发生故障的位置。
  5. 您通常会在已发送到目标服务器的请求 阶段之后的流中找到错误,如下所示:

  6. 记下跟踪记录中的错误值。

    上面的示例跟踪记录显示错误为 Received 405 Response without Allow Header。由于该错误是在请求发送到后端 服务器后由 Apigee 引发的,因此表示后端服务器返回 405 响应状态代码 但不使用 Allow 标头。

  7. 在跟踪记录中前往 AX (已记录分析数据)阶段,然后点击该阶段。
  8. 阶段详情 面板中向下滚动到错误 / 响应标头 部分,然后确定 X-Apigee-fault-codeX-Apigee-fault-source 的值,如下所示:

  9. 您会看到 X-Apigee-fault-codeX-Apigee-fault-source 的值分别为 protocol.http.Response405WithoutAllowHeadertarget, 这表示此错误是由后端返回 405 响应状态代码但不使用 Allow 标头导致的。
    响应标头
    X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader
    X-Apigee-fault-source target

NGINX

如需使用 NGINX 访问日志诊断错误,请执行以下操作:

  1. 如果您是 Private Cloud 用户 ,则可以使用 NGINX 访问日志来确定有关 HTTP 502 错误的关键信息。
  2. 检查 NGINX 访问日志:

    /opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log

    其中ORGORGPORT# 替换为实际值。

  3. 搜索以查看在特定时间段内(如果问题过去发生过)是否存在任何错误代码 protocol.http.Response405WithoutAllowHeader502 错误,或者是否存在任何请求仍然失败并返回 502
  4. 如果您确实发现任何 502 错误,且 X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader 的值匹配,请确定 X-Apigee-fault-source 的值。

    NGINX 访问日志中的 502 错误示例

    NGINX 访问日志中的上述示例条目具有以下 X-Apigee- fault-code X-Apigee-fault-source: 值:

    响应标头
    X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader
    X-Apigee-fault-source target

原因:后端服务器返回 405 响应,但不使用 Allow 标头

诊断

  1. 使用 API 监控、跟踪工具或 NGINX 访问日志确定 故障代码故障来源502 Bad Gateway常见诊断步骤中所述。
  2. 如果故障代码protocol.http.Response405WithoutAllowHeader 且故障来源的值为 target,则表示后端服务器返回 405 状态代码,但不使用 Allow 标头。因此,Apigee 会返回 502 Bad Gateway,并返回错误代码 protocol.http.Response405WithoutAllowHeader

分辨率

请使用以下方法之一来解决此问题:

后端服务器

方法 1:修复后端服务器以返回 405 状态代码,并使用 Allow 标头

  1. 确保后端服务器始终遵循规范 RFC 7231 第 6.5.5 节:405 不允许的方法,并返回 405 状态 代码,方法是在 Allow 标头中添加允许的方法列表, 如下所示:

    Allow: HTTP_METHODS
  2. 例如,如果您的后端服务器允许 GETPOSTHEAD 方法,则需要确保 Allow 标头包含 这些方法,如下所示:
    Allow: GET, POST, HEAD

故障处理

方法 2:使用故障处理从 API 代理返回 405 状态代码,并使用 Allow 标头

如果后端服务器返回 405 状态代码,但不使用 Allow 标头,您可以使用故障处理从 API 代理返回 405 状态代码和 Allow 标头,如下所示:

  1. 创建政策(例如 AssignMessage 政策RaiseFault 政策 ),并将状态代码设置为 405,并使用 Allow 标头和自定义 消息。

    使用 Allow 标头返回 405 的 AssignMessage 政策示例

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-405WithAllowHeader">
        <DisplayName>AM-405WithAllowHeader</DisplayName>
        <Set>
            <Payload contentType="application/json">{"Specified method is not allowed. Please use one of the methods mentioned in the Allow header."}</Payload>
            <StatusCode>405</StatusCode>
            <ReasonPhrase>Method Not Allowed</ReasonPhrase>
        </Set>
        <Add>
            <Headers>
                <Header name="Allow">GET, POST, HEAD</Header>
            </Headers>
        </Add>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
  2. TargetEndpoint 中创建一个 FaultRule,该规则会在收到错误代码为 protocol.http.Response405WithoutAllowHeader502 错误时调用该政策。

    显示 FaultRule 的 TargetEndpoint 配置示例

    <TargetEndpoint name="default">
    ...
        <FaultRules>
           <FaultRule name="405WithoutAllowHeader">
                <Step>
                    <Name>AM-405WithAllowHeader</Name>
                </Step>
                <Condition>(fault.name = "Response405WithoutAllowHeader")</Condition>
            </FaultRule>
        </FaultRules>
  3. 将这些更改保存到 API 代理的新修订版本中,然后部署该修订版本。
  4. 进行 API 调用,并验证您是否收到了 405 状态代码和 Allow 标头。

配置属性

方法 3:在消息处理器中配置属性,以防止 Apigee Edge 返回 502 错误

  1. 如果您是 私有云 用户,则可以将属性 HTTP.ignore.allow_header.for.405 更新为 true,以防止 Apigee Edge 引发 502 错误,即使后端服务器返回 405 状态代码,但不使用 Allow 标头,您也可以使用方法指南: 在消息处理器中配置忽略 405 属性的 Allow 标头
  2. 如果您是 Public Cloud 用户, 请与Apigee Edge 支持团队 联系

规范

Apigee 期望后端服务器返回 405 Method Not Allowed 响应,并使用 Allow 标头,如以下规范中所述:

规范
RFC 7231 第 6.5.5 节:405 不允许的方法
RFC 7231 第 7.4.1 节:允许

需要注意的要点

推荐的解决方案是修复后端服务器以返回 405 状态代码 并使用 Allow 标头,并遵循规范 RFC 7231 第 6.5.5 节:405 不允许的方法

如果您仍然需要 Apigee 支持团队的任何帮助,请前往 必须收集诊断信息

必须收集的诊断信息

如果按照上述说明操作后问题仍然存在,请收集以下 诊断信息,然后与 Apigee Edge 支持团队联系。

如果您是 Public Cloud 用户,请提供以下信息:

  • 组织名称
  • 环境名称
  • API 代理名称
  • 用于重现 502 Bad Gateway(错误代码为 protocol.http.Response405WithoutAllowHeader)的完整 curl 命令
  • API 请求的跟踪文件

如果您是 Private Cloud 用户,请提供以下信息:

  • 针对失败的请求观察到的完整错误消息
  • 环境名称
  • API 代理软件包
  • API 请求的跟踪文件
  • NGINX 访问日志

    /opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log

    其中ORGORGPORT# 替换为实际值。

  • 消息处理器系统日志
    /opt/apigee/var/log/edge-message-processor/logs/system.log

参考

Apigee 中的故障处理