- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个带有目标组的 ALB 和运行 PHP API 的 ECS 集群。
我正在尝试查询 API 以获得 CSV 响应,但如果请求来自 ALB,我得到的结果会被截断。
当我通过 SSH 进入运行集群的 EC2 实例并尝试手动运行 curl(通过负载均衡器)时,响应被截断:
curl -sSL -D - 'https://my.domain.com/api/export?token=foobar&start_date=01-01-2015&end_date=01-01-2019' \
-H 'Content-Type: application/json' \
-H 'cache-control: no-cache' -o /dev/null
我得到这些 header :
HTTP/2 200
date: Wed, 21 Nov 2018 20:25:27 GMT
content-type: text/csv; charset=utf-8
content-length: 173019
server: nginx
content-transfer-encoding: binary
content-description: File Transfer
content-disposition: attachment;filename=export.csv
cache-control: private, must-revalidate
etag: "b90d0da7b482da96e1a478d59eedd0d16552fbfd"
strict-transport-security: max-age=2592000; includeSubDomains; preload
content-security-policy-report-only: default-src 'self';
x-frame-options: DENY
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
referrer-policy: origin
curl: (92) HTTP/2 stream 1 was not closed cleanly: INTERNAL_ERROR (err 2)
如果我尝试对容器运行相同的 curl(在本地运行 - 而不是通过 ALB)
curl -sSL -D - 'http://localhost:32776/api/export?token=foobar&start_date=01-01-2015&end_date=01-01-2019' \
-H 'Content-Type: application/json' \
-H 'cache-control: no-cache' -o /dev/null
响应:
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/csv; charset=utf-8
Content-Length: 173019
Connection: keep-alive
Content-Transfer-Encoding: binary
Content-Description: File Transfer
content-disposition: attachment;filename=export.csv
Cache-Control: private, must-revalidate
Date: Wed, 21 Nov 2018 20:36:55 GMT
ETag: "b90d0da7b482da96e1a478d59eedd0d16552fbfd"
Strict-Transport-Security: max-age=2592000; includeSubDomains; preload
Content-Security-Policy-Report-Only: default-src 'self;
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Referrer-Policy: origin
当我比较它们时,HTTP 版本有所不同。我尝试在 ALB 中切换到 HTTP1,但仍然遇到相同(或类似)的问题:curl: (18) transfer closed with 130451 bytes remaining to read
。
另一个区别是 Keep-Alive
选项。我不确定这是否是我可以在 ALB 上启用的属性。
当我尝试返回不同的响应(复杂网页/非常长)时,响应通过 ALB 没有问题(未被截断)。根据 ALB 启用 HTTP/1.1
时的错误消息,响应每次都会在 42568 字节后被截断。
有什么想法吗?
更新
如果我在响应中省略 Content-Type
header ,它不会被截断。
return new Response($content, Response::HTTP_OK, [
# Works without this:
# 'Content-Type' => 'text/csv; charset=utf-8',
'Content-Transfer-Encoding' => 'binary',
'Content-Description' => 'File Transfer',
'Content-Disposition' => "attachment;filename=export.csv",
'Content-Length' => strlen($content),
]);
更新 2
将响应 Content-Type
更改为 text/html
会正确返回响应。
最佳答案
经过愉快的调试,我在容器的 Nginx 日志中发现了这个:
nginx stderr | 2018/11/22 01:03:59 [warn] 39#39: *65 an upstream response is
buffered to a temporary file /var/tmp/nginx/fastcgi/4/01/0000000014 while reading
upstream, client: 10.1.1.163, server: _, request: "GET /api/export?
token=foobar&start_date=01-01-2015&end_date=01-01-2019 HTTP/1.1", upstream:
"fastcgi://unix:/var/run/php-fpm.sock:", host: "my.domain.com"
这基本上可以通过将这两行烘焙到我的 nginx 配置中来解决:
client_body_temp_path /tmp 1 2;
fastcgi_temp_path /tmp 1 2;
为什么这种情况只发生在 csv
输出中仍然是个谜。
感谢您的帮助!
关于amazon-web-services - AWS ALB 截断 HTTP 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53420238/
最初,我认为每个 ALB 监听器具有不同路径模式的多个服务以适本地分发 API 调用是显而易见的选择。不过,就健康检查而言(如果其中一项服务出现故障),我不知道有一种聪明的方法可以将该服务的流量转移到
我正在为 2 个服务创建一个 ALB,并带有注释:merged。这行不通。我在日志中也看不到太多 Action 。我究竟做错了什么?工作节点具有 AWS 文档中提到的 ALB 入口策略(也添加了下面的
如果我们需要 AWS 中的静态 IP 地址用于负载均衡器,那么我们必须让网络负载均衡器将请求转发到应用程序负载均衡器。 现在由于ALB只支持HTTP和HTTPS协议(protocol)和NLB只支持T
我在集群上运行了一些服务,并且 ALB 工作正常。但是我有一个 CloudFront 分布,由于一些内部因素,我想使用集群作为入口点。因此,我正在尝试添加一个入口,以根据默认规则或命名主机将请求重定向
我们正在使用 Amazon Webservices ECS 和 Application Load Balancer (ALB) 开发微服务架构。 ALB 每个域都有一个规则,它将路径模式耦合到一个目标
我的 Apache 服务器在 ALB/ELB 后面。我正在负载平衡器上终止 SSL。负载均衡器同时监听 80 和 443。我想将所有 http 请求重定向到 https。 我在 vhost 配置中有这
鉴于 Cloudformation 目前不支持 ALB Lambda 集成,我正在尝试编写一个简单的脚本来创建目标组,将 lambda 注册到目标组,然后将监听器规则指向该目标组。 当我通过用户界面执
我有 ALB 的时间序列数据,我想对其应用异常预测,以便它告诉我 ALB 哪个将出现故障。我已经收集了 ALB 的所有 cloudwatch 指标。谁能指导我如何继续? 最佳答案 如果您引用的是 AW
我正在尝试通过 Python 的 ALB 进行授权。据我了解,ALB 在让您访问该网站之前会查找“AWSELBAuthSessionCookie”cookie。我自己登录应用程序时(使用用户名和密码)
我已经部署了一个 AWS ALB Controller ,并在 EKS 集群中创建了具有入口资源的监听器。 我遵循的步骤如下: 我有一个名为 first-test-api 的服务入口,一切正常 我部署
我在容器中部署了微服务,它们运行良好,我们可以使用 ALBendpoint/microservice 进行访问。 但是我附加到 ALB 的目标组显示“不健康”状态。 AWS 控制台中的错误:这些可用区
我想创建一个 ALB,它应该根据到不同网站的路径来路由我的流量。例如。 example.com/apple/应该转到 8080 example.com/grapes/应该转到 8180 example
我正在尝试找到一种方法来阻止主机 header 攻击发生在我的 ALB 上。我的负载均衡器负责将端口 80 重定向到 443,这就是攻击可能发生的地方。现在我能看到的唯一方法是手动添加我的每个域,然后
我们有很多互联网服务,什么是注意事项 使用指向目标 🎯 组的监听器规则,是对每个服务使用 alb 还是对所有服务使用单个 alb。 这些服务有自己的集群/目标组,具有不同的功能和不同的 url。 一
我以这种方式配置了一个AWS ALB,它应该将IRID_a *重新请求(302)请求到另一个区域。 但是,事实证明,AWS ALB的REDIRECT功能正在将所有http:方法(POST,PUT等)更
背景 : 我有一个 VPC与 3 个公共(public) subnets (子网可以访问互联网网关) 我在这个 VPC 中有一个 EKS 集群,EKS 集群是从控制台创建的,而不是使用 eksctl
我在 ALB 后面有一个 lambda 目标。我的 lambda 是一个 python lambda。 def handler(event, context): response = { "s
对于 ALB -“您必须从至少两个可用区指定子网。” 对于 NLB -“您可以从一个或多个可用区指定子网。” 强制执行 2 个可用区作为 ALB 的 MUST 要求而不是 NLB 的原因是什么? 最佳
我们正在启动 ALB 来访问 EMR 服务的各种 UI。但是,当我们启用启动 3 个主节点的 EMR 的高可用性时,alb 将如何自动指出处于事件状态的新主节点。 ALB 不应将流量分配给辅助实例。它
我尝试使用 cloudformation 部署带有 ALB 的 ECS 堆栈,但在创建服务时出现错误,这似乎缺少访问负载均衡器的权限。 错误如下:无法承担角色并验证指定的 targetGroupArn
我是一名优秀的程序员,十分优秀!