[英]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
獲取您的值。
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")
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.