GCP云运行出现上游连接错误或在请求头之前连接中断/重置。 重置原因:协议错误。

7
我有一款使用webpack打包的Node应用程序,我正在尝试将其部署到Cloud Run中。为了能够在Cloud Run中加载大于32 MB(设置的限制)的文件,我将('Transfer-encoding' : 'chunked')标头添加到了webpack配置文件中。(该文件是网站的min.js文件,即网站的缩小版本,并在点击URL时加载。)
本地一切正常,但是当此更改部署在Cloud Run上并点击应用程序URL后,会出现以下错误:
(502 错误)
"upstream connect error or disconnect/reset before headers. reset reason: protocol error"
我已在部署中禁用了http2 end-to-end选项。
这是webpack文件,其中添加了标头:
webpack.config.js
devServer: {
    contentBase: path.resolve(__dirname, 'build'),

    host: '0.0.0.0',
    port: process.env.PORT || 8601,
    sockPort: 'location',
    disableHostCheck: true,
    devServer: {
       headers: {
         'Transfer-encoding': 'chunked',
       },
    },
    
}

嗨Joh,实际上,现在我设置的不是传输编码头(http1.1),而是在devServer中设置了(http2:true)(因为云运行文档说使用http2时请求和响应没有大小限制,因此没有32 mb限制)。再次在本地和docker run(使用https,不安全)上运行良好,也看到了显着更快的加载时间。但是当部署到Cloud run时,它会给出503,服务不可用。再次尝试在部署中启用和禁用http2标志。在上面的帖子中发布了503 curl输出。 - Vibhor Gaur
同时,我正在使用80端口。 - Vibhor Gaur
添加了curl输出,同时检查Cloud Run服务器日志,不要获取任何其他信息,它们与本地运行方式相似,具有相同的最终消息(“编译成功”)和无错误日志,连接问题是否由于使用http2引起? - Vibhor Gaur
你说你没有使用http2。那么你用80端口做什么?必须使用HTTPS(443端口)向Cloud Run发出请求。对于80端口的请求将会被重定向。 - John Hanley
(只有错误日志是GET 503) - Vibhor Gaur
显示剩余5条评论
3个回答

9

根本原因

之前我勾选了选项Use HTTP/2 end-to-end,上面写着如果您的容器是gRPC流服务器或能够直接处理HTTP/2明文请求,请使用。

我这样做是为了进行一些故障排查。在选择Use HTTP/2 end-to-end并在Cloud Run上部署服务后,需要一些时间才能使这些设置生效。

因此,当您打开Use HTTP/2 end-to-end时,您可能不会立即看到故障。可能会出现诸如gcp cloud run upstream connect error or disconnect/reset before headers. reset reason: protocol error等失败。

enter image description here

解决方法

要解决问题,请从GCP控制台中取消选择,导航到Cloud Run -> Your Service -> Edit -> Connections Tab -> Use HTTP/2 end-to-end

enter image description here

然后选择选项Serve this revision immediately并单击Deploy

enter image description here

现在,您的应用程序应该像我的案例一样正常工作。

enter image description here


1
TLDR: Check your response header for special characters.

你好,

我们在调用Cloud Run实例时也遇到了502响应,响应内容如下:

upstream connect error or disconnect/reset before headers. reset reason: protocol error

我们的Cloud Run服务提供文档生成功能,其中json输入的属性被用作文档名称的一部分。我们的响应头包含了一个类似于以下内容的头部条目:

Content-Disposition: attachment; filename=<the-attribute-value>.pdf

我们的服务也在用西里尔字母书写属性的国家运行。这给我们带来了问题。
我们找到了一个替代文件名的方法,它不依赖于用户的输入。
希望这能有所帮助!

1

我曾经遇到过这个错误,因为我发送了一个带有消息正文的204响应。如果您也是这种情况,请将状态更改为200或202。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接