去年我們将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']; }
评论