我正在将 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
您需要安装 mod_realiphttp://httpd.apache.org/docs/trunk/mod/mod_remoteip.html (http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Remote_IP_Filter) 或 apache 服务器上的 mod_rpaf。