頁面靜態(tài)化是搭建高性能網(wǎng)站必用的招式之一,頁面靜態(tài)化可以有效提升系統(tǒng)響應(yīng)速度,同時(shí)也有利于搜索引擎優(yōu)化。但在頁面靜態(tài)化后,靜態(tài)頁面之間包含(例如所有的靜態(tài)頁面包含頁頭、頁腳)以及靜態(tài)頁面中的局部信息的動(dòng)態(tài)更新又成為新的問題。
靜態(tài)頁面之間的包含一般有如下一些方案:
1、Client Side Includes(CSI):通過frame、iframe、javascript、javacript+ajax等方式將另外一個(gè)頁面的內(nèi)容動(dòng)態(tài)包含進(jìn)來。像現(xiàn)在流行的jquery等javascript庫對(duì)此有較好的支持。
優(yōu)點(diǎn):能夠利用瀏覽器客戶端并行處理及裝載的機(jī)制;通過瀏覽器緩存機(jī)制可以降低網(wǎng)絡(luò)傳輸時(shí)間,提高性能;計(jì)算放在客戶端,能夠降低服務(wù)器端壓力
缺點(diǎn):搜索引擎優(yōu)化問題;javascript兼容性問題;客戶端緩存可能導(dǎo)致服務(wù)器端內(nèi)容更新后不能及時(shí)生效;XSS等安全隱患
2、Server Side Includes(SSI):
優(yōu)點(diǎn):SSI技術(shù)是通用技術(shù),不受具體語言限制,只需要Web服務(wù)器或應(yīng)用服務(wù)器支持即可,Ngnix、Apache、Tomcat、Jboss等對(duì)此都有較好的支持
缺點(diǎn):SSI在語法上不能夠直接包含其他服務(wù)器的url(當(dāng)然也可以通過redirect等來變通實(shí)現(xiàn)),因此在需要充分利用緩存及負(fù)載均衡的環(huán)境下相對(duì)不是很靈活。
當(dāng)然如果不使用單獨(dú)的緩存服務(wù)器,而是使用Ngnix,利用Ngnix對(duì)SSI及Memcached支持,通過NginxHttpSsiModule、NginxHttpMemcachedModule也可以實(shí)現(xiàn)頁面緩存,但與專業(yè)的緩存服務(wù)器(例如Varnish)相比較,Ngnix作為緩存服務(wù)器只適合于中小規(guī)模的場(chǎng)合。
3、Edge Side Includes (ESI):
Edge Side Includes(ESI) 和Server Side Includes(SSI)和功能類似。SSI需要特殊的文件后綴(shtml,inc)。ESI可以直接通過URI包含遠(yuǎn)程服務(wù)器文件,ESI更適合用于緩存服務(wù)器上,緩存整個(gè)頁面或頁面片段,因此ESI特別適合用于緩存。像當(dāng)下流行的緩存服務(wù)器Varnish對(duì)此有所支持。
SSI可以很容易滿足讓所有靜態(tài)頁面include其他靜態(tài)頁面的需求。
大部分的網(wǎng)站都有這樣的需求:在整個(gè)靜態(tài)頁面的局部有需要?jiǎng)討B(tài)更新的內(nèi)容片段,包括:
1、與用戶個(gè)性化無關(guān)的信息,所有用戶進(jìn)來看到的內(nèi)容都一樣。例如最熱新聞、最活躍的用戶等
2、與用戶個(gè)性化信息相關(guān)。例如用戶登錄信息、用戶好友等
以上兩種情況,一般情況下都采用ajax方式來實(shí)現(xiàn)靜態(tài)頁面局部信息的刷新,ajax直接提交給Web服務(wù)器或應(yīng)用服務(wù)器獲取動(dòng)態(tài)數(shù)據(jù)?;蛘卟捎肁jax+Memcached的模式,將動(dòng)態(tài)變化的內(nèi)容放入Memcached中,ajax直接存取Memcached,這樣能夠緩解Web服務(wù)器或應(yīng)用服務(wù)器壓力。但采用ajax的方案,直接繞過了緩存服務(wù)器,并沒有充分利用緩存服務(wù)器對(duì)于靜態(tài)頁面的緩存支持。
使用Varnish及其對(duì)ESI的支持很容易實(shí)現(xiàn)對(duì)以上兩種需求的較好支持:
1、與用戶個(gè)性化無關(guān)的信息:直接由Varnish+ESI就可以實(shí)現(xiàn)。對(duì)于動(dòng)態(tài)變化的局部頁面,可以在ESI制定的url地址返回的http header的Cache-Control來指定緩存策略,實(shí)現(xiàn)局部頁面緩存(fragment caching)。
2、與用戶個(gè)性化信息相關(guān):對(duì)于整個(gè)頁面的緩存策略仍然使用Varnish+ESI方式。而需要fragment caching的局部頁面,可以根據(jù)用戶Cookie信息獲得用戶身份標(biāo)識(shí)信息(例如userid),然后在ESI的URL中帶上用戶身份信息提交到后端的Web服務(wù)器或應(yīng)用服務(wù)器以獲取與用戶個(gè)性化相關(guān)的信息??梢詤⒖迹?/code>Caching logged in users 。
簡(jiǎn)單梳理了一下基于Varnish+ESI實(shí)現(xiàn)靜態(tài)頁面緩存的思路,有空再寫代碼具體測(cè)試一下。
Varnish作為一個(gè)高性能的緩存服務(wù)器,值得好好研究一下。
盡管Varnish和Ngnix都具有Load Balancing的功能,但Ngnix只能根據(jù)客戶端IP進(jìn)行負(fù)載均衡,不支持基于Session狀態(tài)維護(hù)(session persistence)方式,無法維護(hù)Session狀態(tài);而Varnish的Load Balancing都不支持。而這正是HAproxy的強(qiáng)項(xiàng)。
由此得到一個(gè)相對(duì)理想的架構(gòu):
Nginx (用于HTTP compression及https) –> Varnish (用于reverse proxy caching) –>HAProxy(用作Load Balancing)–>Ngnix(Web Server)或Tomcat
http://www.trygve-lie.com/blog/entry/esi_explained_simple
http://jimmyg.org/blog/2009/ssi-memcached-nginx.html
http://docs.heroku.com/http-caching
http://docs.heroku.com/memcached
http://kovyrin.net/2007/08/05/using-nginx-ssi-and-memcache-to-make-your-web-applications-faster/
http://www.ibm.com/developerworks/opensource/library/os-php-varnish/index.html
聯(lián)系客服