我设置了一对新的 haproxy (v1.5) 负载均衡器,并在其后面放置了 2 个 Web 服务器(Centos 6 上的 apache)。我设置了 X-forwarded-for,我可以在 Web 服务器上的 access_log 中看到客户端的真实 IP。
但是,我在 error_log 中看不到客户端的真实 IP,它只记录了 haproxy 节点的 IP。我做错了什么?附件是 Web 服务器的日志配置。
LogLevel warn
<IfModule log_config_module>
LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%a %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
</IfModule>
SetEnvIf Request_URI "^/check\.txt$" dontlog
CustomLog "logs/access_log" combined env=!dontlog
</IfModule>
答案1
由于您没有向我们展示,我猜您使用的是默认错误日志格式其中不包含您想要的信息。您必须使用 ErrorLogFormat 指令来配置要记录的内容。
答案2
从 Apache 2.4 开始ErrorLogFormat
指令可用,它允许您调整 ErrorLog 中记录的内容。
大多数反向代理都会添加一个带有客户端原始 IP 地址的标头,您可以在反向代理的 IP 地址之外或替代该 IP 地址进行记录。
X-Forwarded-For: <client-ip>
您可以使用以下方式捕获(反向) 代理设置的相当常见的标头%{VARNAME}i
:
%{X-Forwarded-For}i
例如
ErrorLogFormat "[%t] [%l] [pid %P] %F: %E: [client: %{X-Forwarded-For}i forwarded by: %a] %M"