由于,前端使用了nginx作为代理服务器,代理后端的web服务器和tomcat服务器,发现后端服务器的访问日志记录的客户端ip是nginx反代机器的ip,,所以,以下方法可以让后端服务器获取到真正的客户机ip。
首先在前端nginx服务器的server{ } 里添加:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
以上增加了3个HTTP header,其中 X-Real-IP 是真正的ip
然后后端服务器则需要添加一个模块,--with-http_realip_module ,如果是tengine,则不需要重新编译,他已经自带。
nginx在线平滑添加新模块,(这里是后端web服务器)
先查看已经编译过的模块 /usr/local/webserver/nginx/sbin/nginx -V
1、cd nginx1.2.6
2、./configure --with-luajit --with-http_flv_module --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module
3、make 不要make install 负责会覆盖以前的配置文件
4、 cp /usr/local/webserver/nginx/sbin/nginx /usr/local/webserver/nginx/sbin/nginx.bak
5、cp ./objs/nginx /usr/local/webserver/nginx/sbin/
(如果出现 “nginx正在忙的提示” 先停止nginx运行/usr/local/webserver/nginx/sbin/nginx -s stop )
6、 重启 /usr/local/webserver/nginx/sbin/nginx
7、cd /usr/local/webserver/nginx/conf
vim nginx.conf
在server中添加以下,并打开默认日志格式。
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /home/nginx/logs/nginx_access.log main;
include deny.ip;
server {
listen 80;
server_name localhost www.ifeng.com;
more_set_headers 'Server: VodServer.KSD';
underscores_in_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
set_real_ip_from 反代的ip地址;
real_ip_header X-Real-IP;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
8、监控 /home/nginx/logs/nginx_access.log ,是否生效,如果没有出现反代的ip表明已经获取到真正ip
本文转自crazy_charles 51CTO博客,原文链接:
http://blog.51cto.com/douya/1579159,如需转载请自行联系原作者