让 Tomcat 使用 X-Real-IP

让 Tomcat 使用 X-Real-IP

我正在将 nginx 配置为 Tomcat 7 前面的反向代理。我在 nginx 配置中添加了以下几行:

set_real_ip_from 127.0.0.1;
...
location / {
    proxy_pass http://tomcat;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

但是我仍然在 Tomcat 日志中看到以下图片:

127.0.0.1 - - [10/Jun/2013:11:25:48 +0600] "GET /app/welcome;jsessionid=6C1B02376C5F748C509B28FC7CE416C9 HTTP/1.0" 200 10571
127.0.0.1 - - [10/Jun/2013:11:25:48 +0600] "GET /app/welcome;jsessionid=0BBE0174C1F0E94FDF49610144E809D3 HTTP/1.0" 200 10571
127.0.0.1 - - [10/Jun/2013:11:25:48 +0600] "GET /app/welcome;jsessionid=AD48005AD453F3A0BE46F1AC978F145D HTTP/1.0" 200 10571

有什么方法可以强制 Tomcat 使用 X-Real-IP 标头(并将其写入日志文件)无需修改网络应用程序?

答案1

需要在 Tomcat 配置中添加 Valve:

<Valve className="org.apache.catalina.valves.RemoteIpValve"
               remoteIpHeader="X-Forwarded-For"
               requestAttributesEnabled="true"
               internalProxies="127\.0\.0\.1"  />

之后,Tomcat 开始调度从 nginx 传递过来的 headers:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

答案2

通过谷歌找到了这个问题,并想在已批准的答案中添加评论:

根据文档默认情况下,此阀值(RemoteIpValve)对写入访问日志的值没有影响。为了在日志中获取真实 IP,您应该添加

requestAttributesEnabled="true"

也用于 AccessLogValve。

答案3

Tomcat 配置的另一个有用示例: 内部代理由于接受正则表达式,可以用管道符(|)分隔。

<Valve
   className="org.apache.catalina.valves.RemoteIpValve"
   internalProxies="192\.168\.10\.110|127\.0\.0\.1"
   remoteIpHeader="x-forwarded-for"
   proxiesHeader="x-forwarded-by"
   protocolHeader="x-forwarded-proto"
   />

更多示例请参阅tomcat 文档

答案4

相关内容