nginx - Nginx 1.18 Reverse Proxy for GRPC Streaming 的问题:上游为关闭的流 1 发送帧,同时读取上游
问题描述
我创建了一个简单的容器来使用 .NET 中的 GRPC 上传文件。该容器在我的本地机器和远程工作正常,它由 Nginx 服务器代理。部署容器后,我可以顺利地将文件流式传输到服务器。但是,当我等待回复时:
var response = await stream.ResponseAsync;
我得到以下异常:
例外:HTTP/2 服务器重置流。HTTP/2 错误代码 'INTERNAL_ERROR' (0x2).", DebugException="System.IO.IOException: 请求被中止。---> System.Net.Http.Http2StreamException: HTTP/2 服务器重置流。HTTP/2 错误代码“INTERNAL_ERROR”(0x2)。--- 内部异常堆栈跟踪结束 --- System.Net.Http.Http2Connection.ThrowRequestAborted(Exception innerException) at System.Net.Http.Http2Connection.Http2Stream.CheckResponseBodyState() at System.Net.Http.Http2Connection.Http2Stream .TryReadFromBuffer(Span
1 buffer, Boolean partOfSyncRead) at System.Net.Http.Http2Connection.Http2Stream.ReadDataAsync(Memory
1 buffer, HttpResponseMessage responseMessage, CancellationToken cancelToken) at Grpc.Net.Client.StreamExtensions.ReadMessageAsync[TResponse](Stream responseStream, DefaultDeserializationContext deserializationContext, ILogger logger,2 deserializer, String grpcEncoding, Nullable
2 compressionProviders, Boolean singleMessage, CancellationToken cancellationToken) at Grpc.Net.Client.Internal.GrpcCall
2.RunCall(HttpRequestMessage request, Nullable`1 timeout)")) ---> Grpc.Core.RpcException: Status(StatusCode="Internal", Detail="Error starting gRPC call. IOException: The request was aborted. Http2StreamException: HTTP/2 服务器重置流。HTTP/2 错误代码 'INTERNAL_ERROR' (0x2).", DebugException="System.IO.IOException: 请求被中止。
经过大量调查,似乎 Nginx 反向代理有问题。这是 Nginx 设置:
server {
listen 13*.**.**.** ssl http2;
server_name mydomain.com 13*.**.**.**;
access_log /var/log/nginx/myservice.log;
error_log /var/log/nginx/myservice_error.log;
ssl_certificate /etc/ssl/certs/myssl.crt;
ssl_certificate_key /etc/ssl/private/myssl.key;
ssl_prefer_server_ciphers on;
proxy_buffering off;
location / {
grpc_pass grpcs://127.0.0.1;
}
}
GRPC 服务工作正常并完成所有请求,但 Nginx 引发以下问题(我检查了错误日志):
2021/10/16 17:58:16 [错误] 1137904#1137904: *2371 在读取上游时关闭流 1 的上游发送帧,客户端:******,服务器:mydomain.com,请求:“POST / FileManagementService.Grpc.FileManagem>
解决方案
推荐阅读
- python - 从一个大列表中将对象分配给一个类并打印它们中的每一个?
- javascript - 在打字稿反应中循环遍历数组时显示下一个数据
- javascript - 在 React 中删除和复制数组元素
- flutter - Dart (Flutter) 迭代 assets 文件夹文件内容
- arrays - 在 Swift 中检查 2 个固定大小的数组是否相等的最快方法是什么?
- algorithm - 空间复杂度总是时间复杂度的下界
- python - 我们是否使用空间滤波或频率滤波来进行模糊、边缘检测?
- mqtt - 将 gcloud 连接到 MQTT 网桥时出现问题
- r - 如何使用 dplyr r 对 grouped_tbl 中的选择列使用行手段来改变新列?
- ios - 未执行 Segue