web服务中获取客户端ip

X-Forwarded-For

X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。 Squid 缓存代理服务器的开发人员最早引入了这一HTTP头字段,并由IETF在HTTP头字段标准化草案中正式提出。

相关 $remote_addr

是nginx与客户端进行TCP连接过程中,获得的客户端真实地址. Remote Address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求

格式

这一HTTP头一般格式如下:

X-Forwarded-For: client1, proxy1, proxy2, proxy3

其中的值通过一个 逗号+空格 把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址【remote_addr】添加到右边。 在上面这个例子中,这个请求成功通过了三台代理服务器:proxy1, proxy2 及 proxy3。请求由client1发出,到达了proxy3(proxy3可能是请求的终点)。请求刚从client1中发出时,XFF是空的,请求被发往proxy1;通过proxy1的时候,client1被添加到XFF中,之后请求被发往proxy2;通过proxy2的时候,proxy1被添加到XFF中,之后请求被发往proxy3;通过proxy3时,proxy2被添加到XFF中,之后请求的的去向不明,如果proxy3不是请求终点,请求会被继续转发。

鉴于伪造这一字段非常容易,应该谨慎使用X-Forwarded-For字段。正常情况下XFF中最后一个IP地址是最后一个代理服务器的IP地址, 这通常是一个比较可靠的信息来源

使用

1.使用nginx进行反向代理的时候设置

1
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

这样ngixn会将请求来源IPremote_addr追加到X-Forwarded-For并用(, + 空格)隔开 。请求header中不存在X-Forwarded-For 则是remote_addr

2.在最前端的转发代理服务器中设置X-Forwarded-For,后端服务器程序从中获取客户端IP时,从后向前(防止伪造代理的IP)取X-Forwarded-For中最前端代理IP之前一个IP就是客户端的IP(和最前端代理进行tcp连接的真实IP)【如果使用了cdn,cdn的IP就是最前端IP】【如果没有使用代理服务器转发,直接使用remote_addr就可以】

nginx proxy_pass和fastcgi_pass 的区别

proxy_pass是反向代理模块。

fastcgi_pass是转发给 factcgi 后端处理。这种方式nginx只是web服务器,应用程序获取的remote_addrIP,就是请求到nginx的真实IP

FastCGI全称 快速通用网关接口(FastCommonGatewayInterface)。

FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。

php-fmp 就是FastCGI的实现。