我们在Nginx后面的Kubernetes上运行了一个gRPC dotnet核心服务。该服务具有双向流端点。入口按照文档配置为grpc_read_timeout、grpc_send_timeout和client_body_timeout,以允许连接保持打开。以下是部分入口的定义:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
namespace: message-api
labels:
App: message-api
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/backend-protocol: GRPC
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/server-snippet: |
client_body_timeout 360s;
grpc_read_timeout 360s;
grpc_send_timeout 360s;
有一个gRPC dotnet客户端应用程序,它使用这个gRPC服务并使用SocketsHttpHandler,这样它就可以在不活动期间发送KeepAlive页面。
从Nginx调试日志中,我们可以看到从客户端发送保持活动的pings,但是当在不活动期间到达grpc_read_timeout / grpc_send_timeout时,服务器会重置流。我们尝试了客户机,但没有启用“保持活动”pings,并且行为仍然相同,连接一直处于打开状态,直到达到读/发送超时为止。因此,保持活力似乎没有增加任何价值。
我的理解/假设是,如果我们继续发送保持活动的pings,服务器不应该重置流。不确定我们是否有一些配置/实现问题,或者我们是否在误解&这是出于设计?
任何指示/帮助都是非常感谢的。谢谢。
发布于 2022-11-02 06:39:56
看起来这是NGINX期望的行为,它不支持保持活跃的pings。有关进一步解释,请参阅此https://trac.nginx.org/nginx/ticket/1887。
在我们的例子中,轮廓特使帮了忙。
https://stackoverflow.com/questions/70670465
复制相似问题