4
回答
nginx反向代理的日志IP问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

目前两台服务器,一台是apache+nginx(tengine),nginx做负载均衡,另一台就apache。

本地apache日志记录的是用户ip,另一台服务器apache日志却是显示代理服务器的IP。

nginx配置如下

upstream backend{
     server 127.0.0.1:88 weight=2;
     server 10.200.18.200:88 weight=1;
     ip_hash;
 }
 server {
     listen       80;
     server_name xxxxx;
     root /xxxxx;
     index  index.html index.php index.htm;
     location ~ \.php$ {
         proxy_pass http://backend;
         include naproxy.conf;
     }
     location / {
         try_files $uri @apache;
     }
     location @apache {
         proxy_pass http://backend;   
         include naproxy.conf;                                                                               
     }                                                                                                       
 }
其中naproxy.conf内容如下
proxy_connect_timeout 30s;
proxy_send_timeout   90;
proxy_read_timeout   90;
proxy_buffer_size    32k;
proxy_buffers     4 32k;
proxy_busy_buffers_size 64k;
proxy_redirect     off;
proxy_hide_header  Vary;
proxy_set_header   Accept-Encoding '';
proxy_set_header   Host   $host;
proxy_set_header   Referer $http_referer;
proxy_set_header   Cookie $http_cookie;
proxy_set_header   X-Real-IP  $remote_addr;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_intercept_errors on;

而两台服务器上的apache的配置是一样的。

不知道这问题出在哪里?

举报
leo108
发帖于5年前 4回/3K+阅
共有4个答案 最后回答: 5年前

好吧解决了。用的是apache的mod_rpaf模块,第二台apache其实也有这个模块,但是没配正确。

默认配置是RPAFproxy_ips 127.0.0.1,ip改成nginx所在服务器就可以了

取IP方法的代码要修改,java是这么干的

String ip = request.getHeader("X-Real-IP");
if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
return ip;
}
ip = request.getHeader("X-Forwarded-For");
if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
// 多次反向代理后会有多个IP值,第一个为真实IP。
int index = ip.indexOf(',');
if (index != -1) {
return ip.substring(0, index);
} else {
return ip;
}
} else {
return request.getRemoteAddr();
}

引用来自“dede.g”的答案

取IP方法的代码要修改,java是这么干的

String ip = request.getHeader("X-Real-IP");
if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
return ip;
}
ip = request.getHeader("X-Forwarded-For");
if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
// 多次反向代理后会有多个IP值,第一个为真实IP。
int index = ip.indexOf(',');
if (index != -1) {
return ip.substring(0, index);
} else {
return ip;
}
} else {
return request.getRemoteAddr();
}

和代码没关系,是日志的问题,apache的日志
顶部