我正在尝试追踪 javascript 客户端与应用程序服务器交互方式的一些问题,并希望看到来回传递的整个 http 有效负载(标头、正文和所有内容)。
碰巧的是,应用服务器前面已经有一个 haproxy 服务器,所以我希望能够使用 haproxy 提供相关日志。显然,在生产中启用它会很糟糕,但我有一个整个环境的克隆,可以在进行调试时将其隔离。
有没有办法让 haproxy 记录发往特定后端服务器的 POST 请求的整个 http 有效负载?
答案1
Haproxy 没有记录 POST 内容或 HTTP 主体的功能。
改用 Wireshark。
答案2
显然从 1.6.0 版(2015 年 10 月)开始,您就可以这样做了。有一条新指令:
option http-buffer-request
您将其包含在前端或后端中,以便 HAProxy 可以访问主体。然后使用 req.body 来访问它。以下是我使用的配置的摘要:
global
log 127.0.0.1 local0
debug
maxconn 2048
ulimit-n 8012
# ...
defaults
mode http
option httplog
log-format frontend:%f/%H/%fi:%fp\ GMT:%T\ body:%[capture.req.hdr(0)]\ request:%r
option dontlognull
# ...
frontend www-http
log global
option http-buffer-request
# id=0 to store body for logging
declare capture request len 40000
bind 7.7.7.7:8007
http-request capture req.body id 0
default_backend www-backend
backend www-backend
mode http
option forwardfor
# ...
答案3
这可能会有所帮助,请确保保持行的顺序相同。我在前端和监听块中测试了它,我不知道这在后端会如何工作:
## ------ LOG ----------
#no log ####this is real line USE THIS to disable log!!! when commented allows log
mode http
option http-buffer-request
declare capture request len 40000000
http-request capture req.body id 0
capture request header user-agent len 150
capture request header Host len 15
log-format '{"srcIP":"%[src]","backend":"%s","bIP":"%si","bPORT":"%sp","method":"%[capture.req.method]","user-agent":"%[capture.req.hdr(1),json(utf8s)]","uri":"%[capture.req.uri]","body":"%[capture.req.hdr(0)]"}'
## --------------------
这不完全是您要求的,因为它不仅会记录所有 POST 请求,而且您以后还可以在日志文件中查找“POST”,因为它将请求方法保存在日志中。