nginx Google App Engine Nodejs Bad Gateway错误

tkclm6bt  于 2023-04-20  发布在  Nginx
关注(0)|答案(1)|浏览(125)

我们在Google App Engine的Node.js Flexible Environment中托管了一个项目,用于从传感器收集数据。
我们每秒收到大约10个POST /collect请求,这些请求的大小可能非常不同,但99%的时间都是非常小的请求(~ 100 B到~ 12 MB)。
查看收集的数据,我们会发现每隔一段时间(很明显,每天5-6次)就会遗漏一些数据。
在研究过程中,我们在服务器前面放置了一个代理(仍然在App Engine上),我们称之为PROXY,我们称之为SERVER,以便能够跟踪整个流程并查看我们可能遇到的所有错误和问题。
我们注意到,当数据丢失时,PROXY已经将数据发送到SERVER,并收到了502 Bad Gateway,这会出现在PROXY的日志中(在我们打印的代理中,当请求到达代理时,服务器回复代理时):

07:11:15.000 SENSOR_ID response: 502 Bad Gateway
07:11:15.000 SENSOR_ID request

然后我们查看了SERVER的日志,发现在相同的时间戳,我们得到以下内容:

07:11:15.000 [error] 32#32: *84209 upstream prematurely closed connection while reading response header from upstream, client: 130.211.1.151, server: , request: "POST /collect HTTP/1.1", upstream: "http://172.17.0.1:8080/collect", host: "ourprojectid.appspot.com"

我们的第一个假设是,包含大量数据的大请求会导致服务器因任何原因而失败,但事实并非如此,相反,这些失败事件与请求大小之间没有相关性。
我们使用的堆栈:App Engine示例(在nginx上运行)和Nodejs Flexible Environment。
我们没有任何线索在哪里进一步调查。

iovurdzv

iovurdzv1#

这可能是因为nginx重用连接和您的应用关闭连接之间存在竞争条件,因为您的应用具有与Google在其nginx服务器中配置的keepAliveTimeout相似或更小的keepAliveTimeout。
您可以通过将server.keepAliveTimeout设置为700秒(或至少650秒,再加上一个良好的网络延迟缓冲区)来解决此问题。例如:

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

关于为什么在https://stackoverflow.com/a/76044099中会发生这种情况,有更详细的分析。

相关问题