般情况下,我们根据nginx的建议配置,在location元素下配置如下元素

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
表示在转发到tomcat的请求中,在http头上加上X-Real_IP以及X-Forwarded-For。分别表示远端真实ip,以及代理重重转发的代理地址链。该配置在nginx+tomcat下运行没有任何问题。
但是,由于运营需要,需要在nginx前段再加上一个反向代理HaProxy,这时候问题来了,tommcat下的应用从http头中取到的X-Real-IP以及X-Forwarded-For的值是HaProxy的ip地址。由于HaProxy是知道真实ip是什么,通过HTTP协议,也可以把真实ip放在http头中,根据HaProxy手册,可以在它的配置文件中加上下面两行:
option httpclose
option forwardfor
这样HaProxy在转发http请求给nginx的时候,会把真实ip放在X-Forwarded-For中,当然也可以指定存放真实ip的http头的名字。此时的配置,nginx就可以将X-Forwarded-For头转发给tomcat了。
如果我们不想要代理ip链,那么可以稍微nginx修改一下配置:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
这样tomcat下的应用通过http头获取到X-Forwarded-For的地址就是真实ip了。
网上所说的nginx需要在配置和安装的时候加上–with-http_realip_module的配置项是没有必要的。