如何使用 Nginx 作为反向代理在 gRPC Java 服务器端获取真实的客户端 IP

我使用 grpc-java 作为服务器后端,使用 Nginx 作为服务器和客户端之间的负载均衡器,现在我可以获得这样的请求元数据


Metadata(content-type=application/grpc,user-agent=grpc-java-netty/1.12.0,grpc-accept-encoding=gzip,grpc-trace-bin=)

和 Grpc.TRANSPORT_ATTR_REMOTE_ADDR 这样的客户端 IP


{remote-addr=/10.10.10.202:54031}

显然是Nginx节点的本地IP。我已经在 nginx.conf 中设置了 X-Real-IP 和 X-Forwarded-For


...

server  {

    listen       50010 http2;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $remote_addr;

...

这两个键应该出现在请求元数据中。有人可以帮我吗?在 CentOS 7.4 上 gRPC 的版本是 1.12,nginx 的版本是 1.15.2


繁星淼淼
浏览 395回答 2
2回答

互换的青春

在 Java 中,您可以通过查看 ServerCall 的元数据来访问所有标头。元数据和标题是一回事。通常,StreamObservers 不会向您公开它,因为大多数用户不关心标头。在您的情况下,您可以使用 aServerInterceptor访问元数据。公开这一点的正确方法是从元数据中提取正确的标头并将其放入Context. 上下文的范围是 ServerCall,可以在拦截器之外访问。在您的服务器处理程序中,您可以调用Context.current()并获取Context.Key您用于将标头放入上下文中的值。

白衣染霜花

配置“grpc_set_header X-Real-IP $remote_addr;” 用于 grpc 的 nginx:grpc_set_headerserver {    listen  9099  http2;    access_log    /var/log/nginx/access-grpc.log;    location / {        grpc_pass grpc://127.0.0.1:9091;        grpc_set_header X-Real-IP $remote_addr;    }}从 gRPC 服务器端的上下文中获取元数据我的 golang 代码:md, ok := metadata.FromIncomingContext(ctx)...md.Get("x-real-ip")...
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java