Nginx多级代理统计客户端真实ip
前提概述:
由于普通反向代理没加proxy_set_header X-Real-IP $remote_addr; 后端服务器统计ip来源时显示的是前一个代理服务器的ip地址,比如109.1访问109.139没设置上面代理语句,后端109.140日志记录访问ip来源是109.139而不是真正的109.1 。
实验环境:
设置第一个代理服务器192.168.109.139
1、在192.168.109.139服务器主配置文件设置日志格式main
vim /usr/local/nginx/conf/nginx.conf
------------------------------------------------------------------------
http {
include /usr/local/nginx/conf/mime.types; #加载支持的文件类型
default_type application/octet-stream; #没找到支持文件类型,默认以二进制流提>示下载
#日志格式定义
log_format main '(客户端ip: $http_x_real_ip )- $remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "代理服务ip组:$http_x_forwarded_for"';
sendfile on;
tcp_nopush off;
tcp_nodelay on;
keepalive_timeout 10;
#虚拟主机部分
include /usr/local/nginx/virtual/*.conf;
}
$http_x_real_ip 用于输出真实的ip信息
$http_x_forwarded_for" #用于输出代理服务器信息
2、在192.168.109.139服务器上虚拟主机配置文件如下:
vim /usr/local/nginx/virtual/gz2.com.conf
-------------------------------------------------------------------------------
server {
listen 80;
server_name www.gz2.com;
charset utf-8;
access_log /data/web/gz2.com/logs/gz2.com.access.log main; #设置虚拟主机日志格式
location / {
root /data/web/gz2.com;
index index.html index.htm;
proxy_pass http://192.168.109.140; #反向代理到后端服务器
proxy_set_header X-Real-IP $remote_addr; #将真实客户端ip传给后端服务器
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
设置第二个代理服务器192.168.109.140
1、主配置main日志格式和第一个代理服务器一样
2、虚拟主机反向代理设置
只需将前一个虚拟主机配置文件修改一下就可以
proxy_pass http://192.168.109.140;改为proxy_pass http://192.168.109.141;
设置第三个代理服务器192.168.109.141
1、主配置main日志格式和第一个代理服务器一样
2、由于本服务器是最后的真实服务器所以不需要设置代理了
server {
listen 80;
server_name www.gz2.com;
charset utf-8;
access_log /data/web/gz2.com/logs/gz2.com.access.log main; #设置日志格式
location / {
root /data/web/gz2.com; #网站家目录
index index.html index.htm; #默认打开的文件类型
}
}
测试一下结果:
1、设置我的win7 hosts文件dns解析
192.168.109.139 www.gz2.com
2、浏览器测试:
访问192.168.109.139 的www.gz2.com 成功代理到后端141的 网站
3、 查看日志文件统计的ip情况
192.168.109.139记录:请求来源是109.1
192.168.109.140记录:请求来源时109.139,客户端真实ip为109.1
如果只有一层代理X-Forwarded-For和X-Real-IP这两个头的值就是一样的。
192.168.109.141 记录:请求来源是109.140,真实ip为109.1
如果有多级代理真实ip为X-Forwarded-For 值的第一个值