我有通过haproxy-> nginx-> fastcgi接收请求的后端Web服务器。 Web应用程序用于查看多个IP在X-Forwarded-For标题中出现,并与逗号(左边最原始的IP)链接在一起。
在最近的某个时间点(刚刚注意到,所以不知道是什么原因造成的)发生了一些变化,现在我只看到一个单一的IP传递到我的Web应用程序的头部。
我用haproxy 1.4.21和1.4.22(最近升级)尝试了相同的行为。 Haproxy有前锋标题集:
option forwardfor
Nginx的fastcgi_paramsconfiguration定义这个头被传递给应用程序:
fastcgi_param HTTP_X_FORWARDED_FOR $http_x_forwarded_for;
任何人有什么想法可能会出错在这里?
编辑:我刚开始在nginx日志中logging$ http_x_forwarded_forvariables,而nginx只能看到一个单一的IP,而不应该永远如此,因为我们应该总是看到我们的haproxy IP添加在那里,对吗? 所以,问题必须在nginx处理的variables进来,或haproxy不适当的build设。 我会继续挖…
编辑#2:我启用HAProxy中的请求和响应头日志logging,它不是吐出X-Forwarded-For任何东西,这似乎很奇怪:
Oct 10 10:49:01 newark-lb1 haproxy [19989]:66.87.95.74:47497 [10 / Oct / 2012:10:49:01.467] http service / newark2 0/0/0/16/40 301 574 – – —- 4/4/3/0/0 0/0 {} {} “GET / 2zi HTTP / 1.1”O
以下是我在前台设置的选项:
mode http option httplog capture request header X-Forwarded-For len 25 capture response header X-Forwarded-For len 25 option httpclose option forwardfor
编辑#3:它真的好像haproxy正在消耗头,只是一个传递到后端。 这对我们的生产服务是相当影响的,所以如果有人有一个想法,将不胜感激。 我难住… 🙁
为了回应你在评论中的最后一个问题,在XFF中有多个IP地址是正常的,这个头是一个值列表,而代理通常在那里添加他们的客户端地址。 由于长链中的每个人都附加值,因此服务器必须以相反的顺序使用它们。 例如,最后一个值将是haproxy实例在服务器前面添加的值,而前一个值将是haproxy等之前的反向caching添加的值。
如果您不想调整应用程序以正确parsing标题,还可以让haproxy在添加自己的XFF标题之前将其删除:
reqidel ^X-Forwarded-For:
这样,服务器将只获得由haproxy的客户端添加的价值。
我想在你尝试使用X-Forwarded-For标题的时候会有一些困惑。
首先,nginx看到一个IP地址的事实意味着haproxy正确地添加它。 头只包含haproxy收到连接的源地址,所以在nginx日志中看不到haproxy的IP地址是正常的。
其次,还可以预料,在传入的请求中,您不会观察到x-for-forward-for,因为只有一些传出的代理会添加标头,但一般build议在上网时不要这样做。 如果某些用户向您发送带有这样的头部的请求,您将在haproxy的捕获中看到它,并且nginx将logging此值和由haproxy添加的客户端IP。
我不明白的是你的观点#3,因为你似乎认为头部是必然存在于传入的请求,显然不是这样,从haproxy的捕获和nginx日志来判断。 我刚刚向您发送了一个请求,“X-Forwarded-For:嗨,Jesse,这是Willy”,您应该在haproxy和nginx日志中看到它是否可以帮助您排除故障。
有可能的是,之前你曾经在那里看到多个地址,因为你的主要访问者中有一个正在使用,而外部代理添加了XFF头,或者你在haproxy前面有另一个反向代理(例如:apache,stunnel ,…)。
顺便说一句,你应该用“选项http-server-close”replace“选项httpclose”,它将启用与客户端的保持活动,并减less那些经历高延迟的页面加载时间。