繁体   English   中英

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

[英]How to get real client IP on gRPC Java server side using Nginx as reverse proxy

我使用 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

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

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

  1. 配置“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;
    }
}
  1. 从 gRPC 服务器端的上下文中获取元数据

    我的 golang 代码:

md, ok := metadata.FromIncomingContext(ctx)
...
md.Get("x-real-ip")
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM