为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁星淼淼 2021-09-15 14:23:24
我使用 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
查看完整描述

2 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

在 Java 中,您可以通过查看 ServerCall 的元数据来访问所有标头。元数据和标题是一回事。通常,StreamObservers 不会向您公开它,因为大多数用户不关心标头。

在您的情况下,您可以使用 aServerInterceptor访问元数据。公开这一点的正确方法是从元数据中提取正确的标头并将其放入Context. 上下文的范围是 ServerCall,可以在拦截器之外访问。在您的服务器处理程序中,您可以调用Context.current()并获取Context.Key您用于将标头放入上下文中的值。


查看完整回答
反对 回复 2021-09-15
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

配置“grpc_set_header X-Real-IP $remote_addr;” 用于 grpc 的 nginx:grpc_set_header

server {

    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")

...


查看完整回答
反对 回复 2021-09-15
  • 2 回答
  • 0 关注
  • 394 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信