因此,我配置了 Haproxy,以便日志记录将通过 rsyslog,并且现在全部转储到一个文件中。
这肯定是记录,因为我在启动时收到了那些“启动”消息,但根本没有记录 HTTP 请求。我的配置有什么问题?
haproxy配置文件:
global
log /dev/log local0 debug
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend webfront
option forwardfor
stats enable
stats uri /haproxy?statis
stats realm Haproxy\ Auth
stats auth user:password
bind *:80
timeout client 86400000
acl is_discourse hdr_end(host) -i discourse.mydomain.com
use_backend discourse if is_discourse
use_backend webserver if !is_discourse
backend discourse
balance source
option forwardfor
option httpclose
server server1 127.0.0.1:3080 weight 1 maxconn 1024 check inter 10000
backend webserver
balance source
option forwardfor
option httpclose
server server2 127.0.0.1:4080 weight 1 maxconn 1024 check inter 10000
日志档案:
root@kayak:/var/log/haproxy# tail haproxy.log
Nov 26 21:25:25 kayak haproxy[21646]: Proxy webfront started.
Nov 26 21:25:25 kayak haproxy[21646]: Proxy webfront started.
Nov 26 21:25:25 kayak haproxy[21646]: Proxy discourse started.
Nov 26 21:25:25 kayak haproxy[21646]: Proxy webserver started.
Nov 26 21:28:10 kayak haproxy[21868]: Proxy webfront started.
Nov 26 21:28:10 kayak haproxy[21868]: Proxy discourse started.
Nov 26 21:28:10 kayak haproxy[21868]: Proxy webserver started.
Nov 26 21:30:31 kayak haproxy[22045]: Proxy webfront started.
Nov 26 21:30:31 kayak haproxy[22045]: Proxy discourse started.
Nov 26 21:30:31 kayak haproxy[22045]: Proxy webserver started.
我在两次重启之间访问了一些 Web 服务器页面,并触发了几个 404 错误。为什么什么都没有显示出来?
编辑:rsyslog conf文件。
/etc/rsyslog.d/49-haproxy.conf:
local0.* -/var/log/haproxy_0.log
if ($programname == 'haproxy') then -/var/log/haproxy/haproxy.log
& ~
答案1
如果你真的想记录每个请求,你必须在前端指定日志。但通常这对服务器来说太过分了,你的磁盘很快就会被占满。
frontend webfront
log /dev/log local0 debug
答案2
此链接完美地解释这一点。
如果你查看 /etc/haproxy/haproxy.cfg 的顶部,你会看到类似以下内容:
global
log 127.0.0.1 local2
[...]
这意味着 HAProxy 会将其消息发送到 127.0.0.1 上的 rsyslog。但默认情况下,rsyslog 不会监听任何地址,因此才会出现问题。
让我们编辑 /etc/rsyslog.conf 并取消注释以下行:
$ModLoad imudp
$UDPServerRun 514
这将使 rsyslog 监听所有 IP 地址的 UDP 端口 514。您也可以选择通过添加以下内容将端口限制为 127.0.0.1:
$UDPServerAddress 127.0.0.1
现在创建一个 /etc/rsyslog.d/haproxy.conf 文件,包含以下内容:
local2.* /log/haproxy.log
当然,您可以更加具体,并根据消息级别创建单独的日志文件:
local2.=info /log/haproxy-info.log
local2.notice /log/haproxy-allbutinfo.log
然后重新启动rsyslog,可以看到日志文件被创建了:
# service rsyslog restart
如果您手动创建日志文件/log/haproxy-allbutinfo.log
,/log/haproxy-info.log
请不要忘记将所有者更改为syslog:adm
答案3
在我的 rhel 6.7 上,通过 unix 套接字日志进行记录对我来说不起作用。你可以尝试使用此配置。haproxy(在 81 上工作)将 http 请求转发到 httpd(在 80 上工作)
/etc/haproxy/haproxy.cfg
frontend web_front
log 127.0.0.1 local6
option httplog
bind *:81
default_backend web_back
backend web_back
server web1 127.0.0.1:80
并且您必须启用 rsyslog udp 模块才能从 haproxy 接收 syslog,简单的配置如下:
/etc/rsyslog.d/haproxy.conf
$ModLoad imudp
$UDPServerAddress 127.0.0.1
$UDPServerRun 514
local6.* /var/log/haproxy.log
向 81 发出一个 http 请求,你会得到一些这样的日志
# tail -n 1 /var/log/haproxy.log
May 18 13:51:07 localhost haproxy[31617]: 127.0.0.1:38074 [18/May/2016:13:51:06.999] web_front web_back/web1 0/0/0/2/2 404 466 - - ---- 1/1/0/1/0 0/0 "GET /how-are-you HTTP/1.1"
答案4
这可能是由于它在 chroot jail 中运行而导致的。您需要确保 rsyslog 也在 chroot jail 中创建 dgram 套接字(例如 /var/lib/haproxy/dev/log)。将您的日志指令指向 /dev/log 套接字,这样就没问题了。
我花了几个小时试图弄清楚这一点,因为除了记录失败之外,HAproxy 不会告诉你任何错误。