您的位置:首页 > 运维架构 > Apache

NAT负载均衡方式,apache如何在日志中记录客户端IP

2012-04-19 09:47 447 查看
NAT负载均衡方式,apache如何在日志中记录客户端IP (2008-01-07 16:25)

分类: WEB

在负载均衡中,有两种常用的方式,NAT和单臂(lvs叫DR),在nat方式下,后端apache只能看到负载均衡设备的IP而不是客户端的IP,如果想让apache记录客户端的IP,需要在负载均衡设备在请求后端apahce服务器时,在请求头中向apache传送一个环境变量,如在 netscaler中设置source-ip,

修改apache的Logformat,如:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
改为:
LogFormat "%{source-ip}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
然后重启apache即可。
附apache2的Logformat配置语法:

LogFormat和CustomLog指令的格式化参数是一个字符串。这个字符串会在每次请求发生的时候,被记录到日志中去。它可以包含将被原样写入日志的文本字符串以及C风格的控制字符"\n"和"\t"以实现换行与制表。文本中的引号和反斜杠应通过"\"来转义。

请求本身的情况将通过在格式字符串中放置各种"%"转义符的方法来记录,它们在写入日志文件时,根据下表的定义进行转换:

格式字符串

描述

%%


百分号(Apache2.0.44或更高的版本)

%a


远端IP地址

%A


本机IP地址

%B


除HTTP头以外传送的字节数

%b


以CLF格式显示的除HTTP头以外传送的字节数,也就是当没有字节传送时显示'
-
'而不是0。

%{
Foobar
}C


在请求中传送给服务端的cookieFoobar的内容。

%D


服务器处理本请求所用时间,以微为单位。

%{
FOOBAR
}e


环境变量FOOBAR的值

%f


文件名

%h


远端主机

%H


请求使用的协议

%{
Foobar
}i


发送到服务器的请求头Foobar:的内容。

%l


远端登录名(由identd而来,如果支持的话),除非IdentityCheck设为"
On
",否则将得到一个"-"。

%m


请求的方法

%{
Foobar
}n


来自另一个模块的注解Foobar的内容。

%{
Foobar
}o


应答头Foobar
:
的内容。

%p


服务器服务于该请求的标准端口。

%P


为本请求提供服务的子进程的PID。

%{
format
}P


服务于该请求的PID或TID(线程ID),format的取值范围为:
pid
tid
(2.0.46及以后版本)以及
hextid
(需要APR1.2.0及以上版本)

%q


查询字符串(若存在则由一个"
?
"引导,否则返回空串)

%r


请求的第一行

%s


状态。对于内部重定向的请求,这个状态指的是原始请求的状态,---
%>s
则指的是最后请求的状态。

%t


时间,用普通日志时间格式(标准英语格式)

%{
format
}t


时间,用
strftime(3)
指定的格式表示的时间。(默认情况下按本地化格式)

%T


处理完请求所花时间,以秒为单位。

%u


远程用户名(根据验证信息而来;如果返回status(
%s
)为401,可能是假的)

%U


请求的URL路径,不包含查询字符串。

%v


对该请求提供服务的标准ServerName。

%V


根据UseCanonicalName指令设定的服务器名称。

%X


请求完成时的连接状态:

X
=

连接在应答完成前中断。

+
=

应答传送完后继续保持连接。

-
=

应答传送完后关闭连接。

(在1.3以后的版本中,这个指令是
%c
,但这样就和过去的SSL语法:
%{
var
}c
冲突了)

%I


接收的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块。

%O


发送的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块。

修饰符

可以紧跟在"%"后面加上一个逗号分隔的状态码列表来限制记录的条目。例如,"
%400,501{User-agent}i
"只记录状态码400和501发生时的
User-agent
头内容;不满足条件时用"
-
"代替。状态码前还可以加上"
!
"前缀表示否定,"
%!200,304,302{Referer}i
"记录所有不同于200,304,302的状态码发生时的
Referer
头内容。

"<"和">"修饰符可以用来指定对于已被内部重定向的请求是选择原始的请求还是选择最终的请求。默认情况下,
%s, %U, %T, %D, %r
使用原始请求,而所有其他格式串则选择最终请求。例如,
%>s
可以用于记录请求的最终状态,而
%<u
则记录一个已经被内部重定向到非认证资源的请求的原始认证用户。

一些说明

出于安全考虑,从2.0.46版本开始,
%r
,
%i
,
%o
中的特殊字符,除了双引号(")和反斜线(\)分别用
\"
\\
进行转义、空白字符用C风格(
\n
,
\t
等)进行转义以外,非打印字符和其它特殊字符使用
\x
hh格式进行转义(hh是该字符的16进制编码)。在2.0.46以前的版本中,这些内容会被完整的按原样记录。这种做法将导致客户端可以在日志中插入控制字符,所以你在处理这些日志文件的时候要特别小心。

在2.0版本中(不同于1.3),
%b
%B
格式字符串并不表示发送到客户端的字节数,而只是简单的表示HTTP应答字节数(在连接中断或使用SSL时与前者有所不同)。mod_logio提供的
%O
格式字符串将会记录发送的实际字节数。

-------------------------------------------------------------------------------------------------

Apache和nginx等Web服务器前端有负载均衡设备或者CACHE SERVER等情况下,APACHE日志中无法正确获取CLIENT的源IP,无法统计访问量,这个时候就要做一些设置上的更改,这里举例为squid3+apache2.2环境
一、修改Squid配置文件
vi ./squid.conf
  emulate_httpd_log on
  logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh 改为
  logformat combined %{X-Forwarded-For}i %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
access_log /home/web/squid3/var/logs/access.log combined

二、修改Apache配置文件
  vi ./httpd .conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
# squid proxy
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
但是Squid会报错,说语法错误,其实只要修改Apache配置文件就可以了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐