Haproxy 选项 forwardfor 仅在第一个请求时有效

Haproxy 选项 forwardfor 仅在第一个请求时有效

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 连接的行为,它将帮助您理解它为什么会这样。

相关内容