七层负载地址透传
- haproxy是一个反向代理 发往服务器的请求中的客户端IP均为Haproxy主机的IP地址 而非真正的客户端地址 这会是服务器端的日志信息记录不了真实的IP X-Forwarded-For 首部则可用于解决此问题
- Haproxy可以向每个发往服务器的请求上添加此X-Forwarded-For首部,并以客户端IP为value
- option forwardfor语法:option forwardfor [ except
] [header ] [if-none ]
1.: 可选参数,当指定时,源地址为匹配至此网络中的请求都禁用此功能
2.: 可选参数,可自定义一个首部,如X-client来替代X-Forwarded-For
3.if-none: 仅在此首部不存在时,才将其添加至请求报文中 - option forwardfor示例:
defaults
option forwardfor #此为默认值,首部字段为 X-Forwarded-For
nginx定义log的格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
四层负载地址透传
1.配置Haproxy基于TCP协议访问
frontend app_frontend
bind *:80
default_backend app
backend app
balance roundrobin
mode tcp
server app1 192.168.1.254:80 check send-proxy #将proxy protocol协议发送到后端节点
2.配置后端web节点
日志
#nginx配置 变量$proxy_protocol_addr 记录传床过来客户端真实IP
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'"$http_user_agent" "$proxy_protocol_addr"';
nginx配置
server {
listen 80 proxy_protocol; #启动此项 将无法直接访问此网站 只能通过四层代理访问 client --> proxy-L4 -->web
root /var/www/html;
index index.html;
access_log /var/log/80_access.log main;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}