去年我们将EmojiAll网站接入了CloudFlare,这个网站是用Drupal来搭建的,也遇到一些清除缓存等小问题,都是同事们逐步发现、逐步解决。最近陆续接入了其它一些域名,我也多花了一些时间来了解,下面记录一些要点。
先去网上搜了相关关键词,发现Drupal有一个专门的CloudFlare模块,其主要功能是:
- 显示访问者真实IP地址,而不是代理服务器的IP地址;
除了安装这个模块以外,Drupal 7还需要在settings.php中添加:
if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
}
- 在留言功能中集成CloudFlare的防火墙、反垃圾等功能。
前者是需要的,但可以不在Drupal中实现,而是提前到Web服务器中实现,我们去找了Apache的这个模块mod_cloudflare,很方便就下载、安装好了,从apache日志中就可以看到显示的是访问者真实IP,而不是此前的CloudFlare的IP了。
第二个功能我们安装测试了一下,设置的位置都找了半天才找到,用处不大。
所以我们也就没有在Drupal中继续安装这个模块了。
另外,在让Drupal网站接入百度云加速服务的过程中,发现即使我们添加了缓存html页面的规则,但实际上也没有缓存,仔细检查发现是Cloudflare的规则设置中可以添加“源站控制缓存”为开或者关,默认是关,所以规则中添加的页面无论是否头部有Cache-Control都会缓存,而百度云加速中的规则设置里面是没有“源站控制缓存”这个选项的,默认应该是开,所以当Cache-Control是private, no-cache, max-age=0等情况下,是不缓存html页面的,这就会出现与Cloudflare不同的缓存处理方式。
在更仔细分析Drupal站的Cache-Control控制之前,我们先修改了html.tpl.php,添加一句:
header("Cache-Control: public, max-age=7200, s-maxage=3600");
再刷新页面,从Chrome浏览器开发模式的Network中查看Response Headers就可以看到Cache Status为HIT了,而不是此前的一直是MISS。
而为了避免管理员登录后浏览和操作网站的内容被缓存,我们添加了另外一个域名,例如:edit.example.com,在Drupal中设置使用与正常域名www.example.com一样的数据库,而edit.example.com在CloudFlare中设置为不缓存,甚至匿名用户无法访问,就可以做到管理员的操作不影响正常用户看到的内容了。
另外,还可以在管理员界面的底部添加访问正常域名、清理缓存的链接,方便操作。清理缓存是调用CloudFlare的清理缓存API来实现。
补充一下,CloudFlare官方文档中说mod_cloudflare不在更新、不受支持了,推荐使用mod_remoteip这个模块。
另外,临时也可以在PHP端解决,Drupal站settings.php, MediaWiki站的LocalSettings.php中都加入了这段:
if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) { $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP']; } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR']; }
评论