【发布时间】:2016-11-17 02:35:28
【问题描述】:
我在 apigateway 控制台中创建了一个 API,它充当运行 java 应用程序的后端服务器的 http 代理。我们部署了 api,创建了一个自定义域以通过云端托管它。现在,当我在 Web 应用程序中使用新的 cloundfront URL 时,一些 API 不会立即返回。即使使用 curl 命令也可以注意到相同的行为
curl -v -H "Cookie:session_token=llzAwur3FZS78po6b21FEgvXzDUFY3" https://xyz.execute-api.us-east-1.amazonaws.com/test/api/folder/roo
相同的 API 端点会有不同的响应时间(有时大约为 1 秒,有时可能为几秒)。有时它也会超时。后端服务器(jetty)请求日志显示响应是即时发送的。我们如何调查我们的 APIgateway 部署出了什么问题?
例如,我有来自网关的这两个响应。坏人
< HTTP/1.1 504 Gateway Time-out
< Content-Type: text/html
< Content-Length: 669
< Connection: keep-alive
< Server: CloudFront
< Date: Fri, 11 Nov 2016 12:27:14 GMT
< X-Cache: Error from cloudfront
< Via: 1.1 xyz.cloudfront.net (CloudFront)
< X-Amz-Cf-Id: Wfjk3bqdwhAbFQhzerMd0DJ5t_2xAF6E_NUTvqif1p9cb9E-jy0GUw==
<
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>ERROR</H1>
<H2>The request could not be satisfied.</H2>
<HR noshade size="1px">
CloudFront attempted to establish a connection with the origin, but either the attempt failed or the origin closed the connection.
<BR clear="all">
<HR noshade size="1px">
<PRE>
Generated by cloudfront (CloudFront)
Request ID: 881Muk_9up7A0phYvmmchNkYWj16yFCsthuKFivS2vbtpULtCk9lnw==
</PRE>
<ADDRESS>
</ADDRESS>
* Connection #0 to host ulj2mxzix6.execute-api.us-east-1.amazonaws.com left intact
</BODY></HTML>
还有这个——好一个
< HTTP/1.1 200 OK
< Content-Type: application/json;charset=UTF-8
< Content-Length: 1839
< Connection: keep-alive
< Date: Fri, 11 Nov 2016 12:28:43 GMT
< x-amzn-Remapped-Connection: keep-alive
< x-amzn-Remapped-Content-Length: 1839
< x-amzn-Remapped-Date: Fri, 11 Nov 2016 12:28:43 GMT
< x-amzn-Remapped-Server: nginx/1.4.6 (Ubuntu)
< x-amzn-RequestId: 621bff67-a80a-11e6-bb0a-1bc973821ef5
< X-Cache: Miss from cloudfront
< Via: 1.1 1d43f56d3213a63608863fd0e49585b9.cloudfront.net (CloudFront)
< X-Amz-Cf-Id: ZGwu2NAXKCouMssDjHwSnjyWXe4OFukmeyL7nzC_Y4Lz6QnixdhbEg==
编辑/解决方案:
正如下面的答案中提到的,我必须禁用标头才能获取响应标头中的内容长度。我正在使用 Spring MVC 实现 REST API 并添加以下过滤器似乎已经完成了技巧
<filter>
<filter-name>bufferFilter</filter-name>
<filter-class>org.springframework.web.filter.ShallowEtagHeaderFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>bufferFilter</filter-name>
<url-pattern>/api/*</url-pattern>
</filter-mapping>
【问题讨论】:
-
您是否将 CloudFront 分配放在 API 网关前面?
-
是的。我创建了一个带有 SSL 证书的自定义域。正如我提到的 curl 命令有时确实有效,但它大多挂起或需要大约一分钟才能返回。任何解决我的问题的帮助将不胜感激。谢谢
-
您是否创建了自定义域并指向您自己的 CloudFront 分配,然后指向 API Gateway?
-
是的,当然。我有时确实会收到回复,这证实了集成已经到位。
标签: amazon-web-services aws-api-gateway