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

时间:2018-09-12 03:32:43

标签: java nginx reverse-proxy grpc

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

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

和Grpc的客户端IP。TRANSPORT_ATTR_REMOTE_ADDR就像这样

{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 个答案:

答案 0 :(得分:0)

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

根据您的情况,您可以使用ServerInterceptor访问元数据。公开此错误的正确方法是从元数据中提取正确的标头,然后将其放入Context中。上下文的作用域为ServerCall,可以在拦截器之外访问。在服务器处理程序中,可以调用Context.current()并使用将标头放在上下文中的Context.Key来获取值。

答案 1 :(得分:0)

  1. config“ grpc_set_header X-Real-IP $ remote_addr;” nginx for grpc: 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")
...