X-Forwarded-For
为什么 haproxy仅在第一次发送标头?
这是我设置的(唯一)地方option forwardfor
:
backend nodes
mode http
balance roundrobin
option forwardfor
server host ip:80 check
仅第一个 HTTP 请求包含X-Forwarded-For
标头:
Host: example.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:44.0) Gecko/20100101 Firefox/44.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Authorization: Basic Og==
Connection: keep-alive
Cache-Control: max-age=0
X-Forwarded-For: replaced_actual_ip
连续的请求中缺少相同的标头:
Host: example.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:44.0) Gecko/20100101 Firefox/44.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Authorization: Basic Og==
Connection: keep-alive
Cache-Control: max-age=0
有人知道为什么会发生这种情况吗?
(我用的是这个:
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -n -A
在后端 http 服务器端转储标头)
答案1
首先,为了以这种方式使用 Keep Alive,您需要使用 HAProxy 1.5。在 1.4 中,这是预期的行为。如果它不适合您,您将需要关闭连接。
在 1.5 中,Keep Alive 的默认代理模式将具有预期的行为。如果您查看 HAProxy 1.5 手册中的 1.1 节“事务模型”,您将看到 5 种连接模式。其中一种是“隧道”,这是 HAProxy 在 1.5 版之前对 Keep Alive 连接的行为,它将帮助您理解它为什么会这样。