首页 > 解决方案 > 如何使用 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

标签: javanginxreverse-proxygrpc

解决方案


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

推荐阅读