比尔盖子 博客

Tag: CDN

比尔盖子最近做的事情——优化优化再优化

先说说公告。大家都应该知道了,七月份,比尔盖子换到了Linode主机。但是由于比尔盖子没有经过强调,大家可能都不知道比尔盖子换域名网址了。由于比尔盖子博客表现出与比尔盖子所有网站都独立的性质,所以购买了新域名。以前的blog.biergaizi.com已经变更为biergaizi.info,如果访问blog.biergaizi.com也会自动转到biergaizi.info。这个新域名怎么记呢?比尔盖子的网站是biergaizi.com;博客是biergaizi.info就是了。

从上个月的事情开始絮叨。上个月,比尔盖子博客使用了Cloudflare进行整站CDN加速。加速效果还是有的,但是唯一的悲剧是不能使用HTTPS。而且,有时候CDN服务器还抽风。虽然说使用CDN能避免Linode的抽风导致网站不正常,但是如果Cloudflare抽风Linode不抽风,也是一种悲剧。再有,Cloudflare的加速效果也不是很明显,因为它在中国/中国香港/中国台湾都没有服务器,因此Cloudflare对此任何形式的中国人都没有加速效果。而只能主要对美国佬进行加速。

经过一番调查,最后发现了个收费不错的CDN,亚马逊云CDN——Cloudfront。收费也是一贯“的亚马逊云作风”:按量收费。而且每GB也不过0.15$而已。即使对比尔盖子所有流量进行加速,一个月也只不过50¥而已。加速支持两种类型,其一是使用亚马逊的域名,其二是可以使用别名记录来使用自己的域名。但是,如果使用别名记录的话,虽然可以达到整站加速的效果,但是会无法使用HTTPS。因此,比尔盖子选择了第一种方案:使用比尔盖子的服务器来加载网站主体,而使用Cloudfront进行网站所有资源(如图片、JS等)进行加速。部署完了,加速效果没有经过测试,不过反正是能减少VPS的负担就是了。

这样一来,CDN就算是折腾完了,接下来是折腾HTTPS加密。由于买biergaizi.info这个域名的时候送了一个SSL证书,不用也是闲着,用了还能让博客更安全,防止被XX,何乐而不为呢?开始折腾了,导致了Apache不断报错抗议,网站宕机2小时。好不容易折腾完了,除了发现网站变慢的,还发现用了加密以后网站反而提示不安全,总是有一些不安全的脚本啊,图片啊什么的。

最后下载了一个插件来强制HTTPS加密,这下查看源代码,果然没有那些不安全的元素了,但是浏览器依然提示不安全。经过论证,发现这个不安全的元素原来是比尔盖子使用的“量子横道网站统计”的JS代码!最后没办法, 量子恒道如何的烂我也没有抛弃,最后抛弃它的原因居然是没有HTTPS,量子恒道得重视这个问题了。最后还是使用了Google分析。这下网站的安全标志终于出现了。

不过问题又来了,自从“比尔盖子 博客”采用了HTTPS加密以后,速度就很慢、很慢、很慢,慢的比尔盖子自己都难以忍受了。比尔盖子甚至有增加“HTTP透明访问”功能的考虑,但最后由于安全期间,没有实施。比尔盖子到现在也很疑惑是什么原因,因为理论上讲,HTTPS并不会使网站变慢多少啊,何况我使用的还是日本人的“Camellia 256”加密算法,而不是通常的“AES 256″加密算法,理论上还会比AES快一点。

不管这么多了,反正优化优化就是了。于是使用Yslow+Pagespeed+Firebug进行了一番疯狂的提速优化,速度有了一些改善。又装了Pagespeed的Apache插件来提高HTTP的速度,目前来看,表现良好。

另外,比尔盖子Linux已经完成测试。之前的维护页面已经被“比尔盖子Linux”取代,但由于比尔盖子的电脑挂了,所以最近依然不会更新。

在用户使用代理,或者服务器使用反向代理或CDN的情况下,获得访客的正确IP

这个方法既可以获得使用代理访问网站访客的真实IP,也可以在服务器使用反向代理或CDN的情况获取访客的真实IP。

由IP不正确想到的

最近,比尔盖子博客使用了Cloudflare的免费CDN服务来加速博客的访问,但是从昨天开始比尔盖子留意到这样一个问题:

由于Cloudflare CDN的本质是代理服务器(反向代理),因此,网站系统评论获取评论信息时,就会将用户的IP统统获取为CDN服务器的IP,导致了无法正确获得浏览者的IP。

 

因为比尔盖子常使用HTTP代理,所以对代理还是有一些了解的。

代理一般分为“透明代理、匿名代理、超级匿名代理”。如果使用透明代理,服务器将依旧可以通过一些方式来获取用户的真实IP;如果使用匿名代理,服务器可以通过一些方式发现用户可能在使用代理服务器,但无法确定用户的真实IP;使用超级匿名代理时,服务器无论如何也无法检测出用户使用了代理服务器。

那么,Cloudflare CDN的反向代理会不会也是一个透明代理呢?能否采用识别使用代理服务器用户真实IP的一般方法,来获取在服务器使用Cloudflare CDN或反向代理时获取正确的用户IP呢?

原理

在PHP中用户的IP有三个属性:HTTP_CLIENT_IP、
HTTP_X_FORWARDED_FOR、REMOTE_ADDR。

REMOTE_ADDR是和服务器连接时,服务器看到的IP地址(如果使用代理,就是最后一台代理的IP);HTTP_CLIENT_IP为代理服务器的IP,不使用代理就没数据;HTTP_X_FORWARDED_FOR是使用代理时,用户的真实IP,不使用代理就没数据(如果用户使用的多层代理,则 用户–> A –> B –> 网站,那么数据就为“用户IP,A的IP”,即最后一台代理服务器之前数据流经过的所有服务器的IP地址)。

这三个值均可伪造,不过如果不是匿名代理或超级匿名代理,是不会对其伪造的。

测试

因此,比尔盖子编写了一个PHP脚本来测试。这个脚本可以使用http://biergaizi.com/ipaddress.php访问。需要注意的是,为了知道Cloudflare CDN是不是透明代理,这个脚本也被CDN加速了,因此本质上是你是用一个代理访问的。

源码如下:

<?php

global $ip;
global $ip2;
global $ip3;
$ip = getenv("HTTP_CLIENT_IP");
$ip2 = getenv("HTTP_X_FORWARDED_FOR");
$ip3 = getenv("REMOTE_ADDR");

echo "HTTP_CLIENT_IP:     ","<br>",$ip,"<br><br>";
echo "HTTP_X_FORWARDED_FOR:     ","<br>",$ip2,"<br><br>";
echo "REMOTE_ADDR:     ","<br>",$ip3,"<br><br>";

?>

测试的结果是:REMOTE_ADDR是代理服务器的IP,HTTP_X_FORWARDED_FOR是访问者真实的IP!也就是说,Cloudflare CDN本质上是透明代理,可以用HTTP_X_FORWARDED_FOR来获得访问者真实的IP!但是唯一奇怪的是,HTTP_CLIENT_IP是没有数据的,请懂的同学解答一下。

实现

有了刚才测试的结果,实现起来就容易多了。

WordPress中获取IP是通过获取REMOTE_ADDR实现的。我们只需要修改Wordpress中获取访问者IP的函数,增加一个逻辑判断:如果HTTP_X_FORWARDED_FOR有数据,就用HTTP_X_FORWARDED_FOR代替REMOTE_ADDR,这样就实现了获得浏览者的正确IP。

但关键是找不到Wordpress获取IP的函数在哪个文件,因此又找到了这样一种方法:因为Wordpress的wp-config.php配置文件是一个公共文件,大部分文件都会调用它,所以只需要修改wp-config.php就行了。修改的方法也异常简单,只需要在wp-config.php开头加上

if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) 
{
$list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $list[0];
}

就搞定了。这段代码的意思是:如果HTTP_X_FORWARDED_FOR有数据(那就肯定是用代理了),那么就用HTTP_X_FORWARDED_FOR里的IP替换REMOTE_ADDR的IP。这样真实IP就把代理服务器的IP替换掉了。

这个方法正如开头强调的,这个方法不仅可以获得使用代理访问网站访客的真实IP,也可以在服务器使用反向代理或CDN的情况获取访客的真实IP。

Copyright © 2022 比尔盖子 博客

Theme by Anders NorenUp ↑