环境:
[root@node154 logs]# haproxy -v
HA-Proxy version 1.5.18 2016/05/10
Copyright 2000-2016 Willy Tarreau <willy@haproxy.org>
[root@node154 logs]# uname -a
Linux node154 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@node154 logs]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
拓扑图:
client ------> Haproxy -------> LNAP
192.168.67.68 192.168.67.154 192.168.67.153
1.在haproxy.cfg中加入下面参数。
vim /etc/haproxy/haproxy.conf
listen frontend_86
bind 0.0.0.0:86
mode http #需要在HTTP模式下才可以,TCP模式下不行
balance source
option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,必须要放在listen模块下
capture request header Host len 20
capture request header Referer len 60
server srv152 192.168.67.152:86 weight 1 maxconn 10000 check inter 10s
server srv153 192.168.67.153:86 weight 1 maxconn 10000 check inter 10s
2.如果是apache,则加入下面参数(即修改)
LogFormat “\”%{X-Forwarded-For}i\”%l %t \"%r\" %>s %b \"%{Referer}i\"\"%{User-Agent}i\"" combined 主要是“\”%{X-Forwarded-For}i\ 这个参数可以记录IP
这里我们可以写成这样方便切割日志 LogFormat “%{X-Forwarded-For}i %l %t \"%r\" %>s %b \"%{Referer}i\"\"%{User-Agent}i\"" combined 注意空格之类的,可以直接复制
3.如果是后端web是nginx则加入下面参数
set_real_ip_from ip;(这个ip填写的是proxy的ip) (这个ip填写的是haproxy的ip)真实服务器上一级代理的IP地址或者IP段,可以写多行 不记录指定的ip
real_ip_header X-Forwarded-For; #从哪个header头检索出所要的IP地址
real_ip_recursive on #递归的去除所配置中的可信IP。排除set_real_ip_from里面出现的IP。如果出现了未出现这些IP段的IP,那么这个IP将被认为是用户的IP。
nginx配置如下:
vim nginx.conf
http
{
log_format main 'Client ip:$remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for';
set_real_ip_from 192.168.67.154;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
}
虚拟主机配置:
vim V_HOST.conf
server {
access_log /www/wwwlogs/5110.log main;
}
nginx输出的日志:
Client ip:192.168.67.68 - - [23/Aug/2019:14:54:03 +0800] GET / HTTP/1.1 200 24508 - Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0 192.168.67.68
备注:
(后面日志路径也要定义main 和Apache一样,属于一种日志格式)
在log_format里添加$remote_addr或者$http_x_forwarded_for参数。