Google App Engine 502 具有“上游过早关闭连接”,但似乎无法到达我们的实例

2024-01-01

我们有一个提供 API 的 Node.js App Engine 服务。

很少(500 个请求中就有 1 个)向客户端返回 502,并从 Google Cloud Logging 的 nginx 日志中获取错误:upstream prematurely closed connection while reading response header from upstream.

这些请求似乎没有到达我们的实例,因为在尝试调试此实例时,我们设置日志记录以在收到请求后立即记录任何请求。

失败的请求通常看起来相当随机。

该问题与中描述的问题非常相似https://groups.google.com/g/google-appengine/c/6gvlur9tXW0/m/bXzY_qAYBAAJ https://groups.google.com/g/google-appengine/c/6gvlur9tXW0/m/bXzY_qAYBAAJ,但该线程在解决之前已关闭。


解决方案

将 server.keepAliveTimeout 设置为 700 秒(或至少 650 秒,加上良好的网络延迟缓冲区)。例如:

const server = http.createServer({ keepAliveTimeout: 700_000 }, app)
server.listen(port, () => console.log('Server listening'));

原因

如果您收到错误“上游过早关闭连接”,则意味着谷歌前端 (GFE) https://cloud.google.com/docs/security/infrastructure/design#google_front_end_service收到请求并转发给nginx,nginx收到请求并转发给应用程序。然后,Ngnix 等待响应,但应用程序没有得到响应,而是关闭了连接,因此它不能再用于接收响应。由于它必须将响应发送回客户端,因此它会向 GFE 发送 502 响应。

这通常是由于应用程序的连接保活超时小于 nginx 上的保活超时,从而导致服务终止连接之间的竞争条件。 Google 在 GAE 上配置的 nginx keepalive_timeout 为 650 秒,以避免与超时为 600 秒的 Google 云负载均衡器 (GCLB) 发生竞争状况。

竞争条件的发生就好像超时在基础设施的深处变得更短一样,外部包装器可能会在内部服务关闭连接时尝试重用连接。例如,如果您的应用程序的超时时间为 5 秒(Node.js 中的默认设置 https://nodejs.org/docs/latest-v18.x/api/http.html#serverkeepalivetimeout):

  • t0:nginx收到请求,打开连接并转发
  • t5:nginx 收到另一个请求,重用该连接(当 5

这是更详细的解释(仅涉及 GCLB -> 您的应用程序,而不是 GCLB -> nginx -> 您的应用程序):https://blog.percy.io/tuning-nginx-behind-google-cloud-platform-http-s-load-balancer-305982ddb340 https://blog.percy.io/tuning-nginx-behind-google-cloud-platform-http-s-load-balancer-305982ddb340

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google App Engine 502 具有“上游过早关闭连接”,但似乎无法到达我们的实例 的相关文章

随机推荐

  • 异步任务 android onPostExecute

    在我的 Android 应用程序中 我使用 AsyncTask 从互联网下载图像 我传递了 url 然后我的 AsyncTask 进行下载 但是我如何将位图返回到我的活动中 目前 我将回调函数传递给 asynctask 构造函数 并在 On
  • 替换成有一个where子句吗?

    我正在编写一个应用程序 并使用 MySQL 作为 DBMS 我们正在下载房产报价 但存在一些性能问题 旧的架构看起来像这样 属性已更新 如果受影响的行数不为 1 则更新不被视为成功 否则更新查询解决了我们的问题 如果更新不成功 并且受影响的
  • 使用 HttpClient 检查互联网连接

    我很难理解以下代码如何处理偶尔的互联网连接丢失 理想情况下 我想在连接丢失后暂停应用程序 并在连接再次启动时恢复 有关于如何操作的指南吗 HttpClientHandler clientHandler new HttpClientHandl
  • 平衡绳的串联复杂度是多少?

    我查看了不同的论文 以下是我收集的信息 SGI实施 http www sgi com tech stl ropeimpl html and C cords http www cs ubc ca local reading proceedin
  • 不寻常的范围解析运算符

    今天重构一些 C 代码时 我得到了一些代码 可归结为以下内容 class x public void x y 是否x 范围解析运算符在这里做任何事情 这是一个错误 还是其他什么 我最好的猜测是 它是一些自动完成功能留下的人工制品 但我很想知
  • 从文件系统或 URL 解析 iPhone 的 Objective-C 中的 m3u 文件

    下面的示例应从 m3u 播放列表获取链接并将其添加到 anArray 所以我会得到NSArray NSMutableArray 其中包含某些链接 NSString fileContents NSString stringWithConten
  • 使用 JavaScript 三角法缩放旋转图像以填充 HTML5 Canvas?

    下面是我当前正在使用的代码 和0旋转 图像正确缩放以填充画布 如同background size cover 除了在 Canvas 上使用 JavaScript 我正在尝试添加旋转功能 具有以下功能 旋转时保持图像居中 我尝试使用width
  • 1318 - PROCEDURE 的参数数量不正确

    DROP PROCEDURE ModificarUsuario CREATE DEFINER root localhost PROCEDURE ModificarUsuario IN Aid INT IN Aced VARCHAR 100
  • 如何获取启动时运行的 CHKDSK 结果?

    有问题的 CHKDSK当我的机器重新启动时运行 并显示一些内容 问题是我不知道它显示了什么 因为它随后继续 完成后重新启动机器 我怎样才能让它停下来 暂停一下还是让我看看它做了什么 chkdsk 无法运行 因为该卷正在被另一个进程使用 CH
  • 如何从 pyodbc 结果行创建逗号分隔的字符串?

    我有一个存储在cursor rows 中的行结果集 这些行是从pyodbc cursor execute 命令返回的 解压这些数据并将其放入逗号分隔字符串列表 或解压到自定义对象中 的最快方法是什么 目前我正在做以下事情 cursor ex
  • 如何使用 Google Sheets API 添加超链接?

    我正在尝试编写一个 python 脚本来添加超链接到谷歌工作表 我正在为此使用谷歌API 通过搜索 我发现我需要向其余 api 传递 HYPERLINK 类型的消息 来自文档 https developers google com shee
  • 如何检查单选按钮

    我有以下 MySQL 表 id Title Windows Linux IDE GUI RAD 1 Software 1 1 0 1 0 0 2 Software 2 0 1 0 1 0 我想通过查询 mySQL 数据库来填充表单 到目前为
  • 使用 std::function 移动语义

    std function从右值引用提供构造函数 按照标准 移动的函数对象会发生什么 会不会是空的 这样再次调用就没有效果了 这个问题有太多的混乱 我会尽力把事情说清楚 本节描述 std 定义对象的移出状态 17 6 5 15 lib typ
  • ECMAScript 6 中的 Symbol.for(string)

    我花了一段时间 但我终于弄清楚了 ECMAScript 6 中符号的用途是什么 在将属性附加到共享对象 例如 HTML 元素 时避免名称冲突 如果您遇到同样的问题 我建议本文 https hacks mozilla org 2015 06
  • 基于 div 而非 screen 的条件 CSS

    所以我做了一些研究并且接近答案 但是我想要做的事情可能无法仅用 CSS 实现 我真的希望如此 最终目标是 如果 id 为 Primary 的元素的宽度为 915 或更小 则将一类 bricks 的元素的宽度设置为 90 html 片段 di
  • 从数据创建 CMSampleBufferRef

    我正在尝试从数据创建 CMSampleBuffer Ref 并尝试将其提供给 AVAssetWriter 但资产编写者未能根据数据创建电影 以下是创建 CMSampleBufferRef 的代码 CVImageBufferRef cvimg
  • 从 QList 填充 QVector

    我有一个 QList 和 QVector 我填充 Qlist 然后尝试复制到 QVector 奥维特有一个来自列表 http qt project org doc qt 4 8 qvector html fromList方法 但这不起作用
  • 链接到 jQuery 文件的最佳方式[重复]

    这个问题在这里已经有答案了 就网站性能 速度而言 链接到 jquery 是否更好 如下所示 或者将文件放在服务器上并从那里链接到它们 如下所示 这取决于谁拥有更快的服务器 对吗 有一些优点code jquery com 这很常见 如果用户访
  • 将十六进制字符串转换为十六进制整数

    我必须将十六进制字符串转换为十六进制整数 如下所示 color 0xFF00FF can be any color else defined by functions colorto 0xFF00FF copy of color but f
  • Google App Engine 502 具有“上游过早关闭连接”,但似乎无法到达我们的实例

    我们有一个提供 API 的 Node js App Engine 服务 很少 500 个请求中就有 1 个 向客户端返回 502 并从 Google Cloud Logging 的 nginx 日志中获取错误 upstream premat