簡體   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