采用nginx的stream模块代理Tomcat此时Tomcat如何获取客户端真实IP?

在nginx中使用stream模块代理Tomcat,配置如下:

stream{
    server{
       listen 9000;
       proxy_pass 127.0.0.1:8080;
       proxy_protocol on;#开启后会在三次握手之后发一个proxy包
    }
}

Tomcat的Connector中配置proxyProtocol="true":

<Connector port="8080" connectionTimeout="20000"
               redirectPort="8443" maxParameterCount="1000"
               protocol="HTTP/1.1" proxyProtocol="true"
               />

此时通过nginx代理请求http://localhost:9000/xxx后浏览器提示如下:
image.png
Tomcat的access日志中记录了proxy前缀,但是后面的关键信息(客户端IP、目标IP、客户端端口、目标端口)没有解析到:
image.png
通过抓包会发现在三次握手之后发了一个包,内容是:
PROXY TCP4
IP1 IP2 端口1 端口2
image.png
目前是直接访问不了Tomcat了,如何解决并正常解析到PROXY报文?

阅读 2.4k
1 个回答
新手上路,请多包涵

首先 nginx stream模块里面是解析TCP协议的
你应该是写到http模块里面才对阿

    location / {
          proxy_set_header Host $http_host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header REMOTE-HOST $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:50000/;
    }

一般后端语言就是获取 X-Real-IP

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题