2008-11-30 88 views
6

我們運行一個相對較高容量的內容網站。與大多數內容網站一樣,每個網頁的大部分都是相對靜態的。這些文章很少改變,使它們成爲某種形式的靜態/邊緣緩存的理想選擇。但是,有兩個大問題。輔助頁面元素(導航欄,最近的內容列表等)變化非常頻繁,快速使「完整」緩存頁面失效。我們在頁面中包含更多動態位,比如用戶特定的信息等等也是很常見的。反向代理HTTP請求的後處理? (如Akamai的ESI)

有一個反向代理/負載均衡器可以處理後期內容,讓我們處理包含代理/邊緣。對後端的初始請求會返回一個粗略的模板,然後代理軟件可以處理該模板以完成它。該標記可能是這個樣子:

<html> 
<body> 
    <div id="content"> 
    Lorem ipsum whackem smackem. 
    <% 
     dynamic "http://related.content.service/this/story" 
    %> 
    </div> 
    <div id="sidebar"> 
    <% 
     dynamic do |request| 
     url = "http://my.user.service/user-widget.html" 
     if request.cookies.contains?("user_token") 
      url = "http://my.user.service/" + request.cookies["user_token"] + "/user-widget.html" 
     end 

     error_text = "User service not available" 
     { :url => url, :timeout => 500, :error => error_text } 
     end 
    %> 
    </div> 
</body> 
</html> 

什麼,你會在這個例子看到的是紅寶石的一個小一點,其基於cookie的值所包含的文件,然後返回一個哈希的URL來拉,一個超時,以及一些默認的文本顯示在一個錯誤的事件。從理論上講,所有的包含都可以異步地被請求。

我的理解是,亞馬遜做了這樣的事情。各種頁面組件由後端服務生成,具有嚴格的超時限制以確保整體頁面速度。我希望他們的CDN服務能夠包含這樣的內容,但不是這樣!

Edge邊包括(ESI)的W3規範幾乎是我想要的。然而,對於它的支持很少。它可以通過Akamai獲得,有一些Oracle軟件可以完成它,開源的Varnish緩存具有非常基本的實現。這也是一個非常醜陋的XML格式。

所以問題是:什麼能讓我做我想做的事?有沒有其他人以這種方式做事?

回答

2

將Nginx設置爲前端,並使用SSI來選取頁面的動態部分。動態源可以是HTTP服務器,如Apache或FastCGI服務器,例如PHP或Django。

編輯:

許多Web服務器支持某種形式的SSI(服務器端包含),這個功能可以讓你添加一些標籤到HTML的腳本非常有限的形式,更簡單,速度比(及以上) PHP。使用它你可以設置大部分內容的靜態頁面,對於'小動態部分',SSI標籤引用其他地方生成的動態頁面。

我特別喜歡nginx作爲前端幾乎任何東西。它的速度非常快,對資源和可擴展性的要求很高(想想清潔和更穩定的代碼)。作者將其描述爲不是通用的網絡服務器;但是作爲代理前端。後端可以是HTTP服務器(通常是Apache)或FastCGI進程(PHP,Python,Perl,或其他),或者是一個或兩個服務器場。

memcached模塊是驚人的,它使用memcached(這是最快和最可擴展的通用分佈式散列表)直接將網頁與URL相關聯,不涉及磁盤訪問。因爲memcached可以從Web服務器本身的「外部」訪問,所以它甚至可以用於動態頁面(給定一個合理的URL /資源映射)。但我認爲這對你的情況不會有什麼幫助。在任何情況下,首先使用SSI工作,然後您可以(如有必要)使用memcached優化動態部分。

+0

你能擴充這個答案嗎?這聽起來並不像我想要的那麼多,但可能我錯過了一些東西。 – MrKurt 2008-11-30 20:50:32

1

我知道一些人已經寫了關於使用nginx SSI和memcache nginx模塊來拼接內容片段。它比ESI等更有限,但仍然有用。

2

因此,事實證明,清漆已經(並且有)基本的ESI支持,幾乎可以滿足我想要的任何事情。如果任何人需要做一些ESI的東西,清漆似乎工作得很好。這是非常基本的,但仍然很棒。

1

Akamai爲邊緣計算提供了一個解決方案,它允許J2EE在Edge上運行。今天的其他選擇包括任何雲計算服務 - Rackspace和亞馬遜都是這個市場的幾個玩家。理想情況下,您可以使用CDN和雲計算的組合來獲得理想的結果。此外,您可以選擇在頁面模板加載後通過Web服務異步提供動態內容,然後僅使用html模板緩存靜態頁面內容。