首先,讓我們談?wù)勄岸藘?yōu)化。80%的用戶訪問(wèn)網(wǎng)頁(yè)的等待時(shí)間發(fā)生在瀏覽器前面,尤其是下載網(wǎng)頁(yè)和頁(yè)面中的各種元素(圖片、CSS、JavaScript、flash…)。因此,在許多情況下,與花費(fèi)大量時(shí)間在困難和復(fù)雜的程序改進(jìn)上相比,前端優(yōu)化往往可以以一半的努力獲得兩倍的結(jié)果
對(duì)于第一次訪問(wèn)您的網(wǎng)站但尚未將您的網(wǎng)站內(nèi)容緩存在瀏覽器緩存中的用戶,我們可以做到以下幾點(diǎn):
1)減少頁(yè)面訪問(wèn)生成的HTTP連接數(shù)
對(duì)于第一次訪問(wèn)您網(wǎng)站的用戶,頁(yè)面生成的HTTP連接數(shù)是影響性能的關(guān)鍵瓶頸
對(duì)策:
盡可能簡(jiǎn)化頁(yè)面設(shè)計(jì),盡量減少圖片使用,使用一些JavaScript技術(shù)減少不必要的頁(yè)面置換效果,如使用
-優(yōu)化圖片的數(shù)量;圖像地圖技術(shù);使用內(nèi)聯(lián)圖像將CSS圖像捆綁到網(wǎng)頁(yè)中
-嘗試合并JS和CSS文件以減少單獨(dú)文件的數(shù)量
2)將CSS放在頁(yè)面頂部,JS文件放在頁(yè)面底部
CSS引用應(yīng)放在HTML的標(biāo)題中,JS文件引用應(yīng)盡可能放在頁(yè)面底部的標(biāo)記之后。其主要思想是盡快顯示核心頁(yè)面內(nèi)容。但是,需要注意的是,對(duì)于一些使用大量JS的頁(yè)面,底部的一些JS文件可能會(huì)導(dǎo)致一些不可預(yù)測(cè)的問(wèn)題,可以根據(jù)實(shí)際情況適當(dāng)使用這些問(wèn)題。具體來(lái)說(shuō),一些JavaScript壓縮工具用于壓縮JS腳本、刪除空白字符和注釋,以及最小化變量名。基于gzip壓縮,JS內(nèi)容的壓縮可以將性能再提高5%
3)最小化外部腳本的使用,減少DNS查詢時(shí)間
對(duì)于網(wǎng)站的頻繁用戶,主要的優(yōu)化思想是充分利用用戶瀏覽器的緩存,以減少服務(wù)器的開銷
4)在標(biāo)題中添加過(guò)期
在標(biāo)題中為靜態(tài)內(nèi)容添加更長(zhǎng)的過(guò)期時(shí)間,這樣用戶將來(lái)只能讀取緩存中的文件,而無(wú)需與服務(wù)器進(jìn)行任何交互。然而,這樣做也存在一些問(wèn)題。在更新圖像、CSS和JS文件時(shí),如果用戶不刷新瀏覽器,則無(wú)法獲得更新。這樣,當(dāng)我們修改圖像、CSS和JS文件時(shí),我們必須重命名它們,以確保用戶可以訪問(wèn)有價(jià)值的內(nèi)容。這可能會(huì)給開發(fā)帶來(lái)很多麻煩,因?yàn)檫@些文件可能會(huì)被網(wǎng)站中的許多文件引用。Flickr提出的處理方法是通過(guò)URL重寫,使不同版本號(hào)的URL實(shí)際上指向同一個(gè)文件,這是聰明的方法,因?yàn)閁RL級(jí)別的操作效率非常高,可以為開發(fā)過(guò)程提供很多便利
理解原因,您必須了解瀏覽器在訪問(wèn)URL時(shí)的工作方式:
a.首次訪問(wèn)URL時(shí),用戶從服務(wù)器段獲取頁(yè)面內(nèi)容,放入相關(guān)文件(圖像、CSS、JS…)進(jìn)入緩存,并在文件頭
B中保留過(guò)期時(shí)間、LastModified、Etag等相關(guān)信息當(dāng)用戶重復(fù)訪問(wèn)URL時(shí),瀏覽器首先檢查緩存中是否有同名文件。如果是,請(qǐng)檢查文件的到期時(shí)間;如果文件未過(guò)期,則直接從緩存讀取文件,并且不再訪問(wèn)服務(wù)器
C如果緩存中文件的過(guò)期時(shí)間不存在或已超過(guò),瀏覽器將訪問(wèn)服務(wù)器以獲取文件的標(biāo)題信息,并檢查L(zhǎng)astModified、etags和其他信息。如果發(fā)現(xiàn)自上次訪問(wèn)以來(lái)本地緩存中的文件未被修改,將使用本地緩存中的文件
根據(jù)我的經(jīng)驗(yàn),如果可能,嘗試遵循此原則來(lái)增加靜態(tài)文件的過(guò)期時(shí)間,為了大大減少用戶對(duì)服務(wù)器資源的重復(fù)訪問(wèn)
5)CSS和JS文件在單獨(dú)的外部文件中引用
將CSS和JS文件放在單獨(dú)的文件中,以便它們可以單獨(dú)緩存,并且在訪問(wèn)其他頁(yè)面時(shí)可以直接從瀏覽器的緩存中讀取。一些網(wǎng)站的主頁(yè)可能是個(gè)例外。這些主頁(yè)的自瀏覽量可能不大,但這是用戶訪問(wèn)網(wǎng)站的***印象,也是引導(dǎo)用戶訪問(wèn)其他頁(yè)面的起點(diǎn)。這些頁(yè)面本身也可能使用大量Ajax本地更新和技術(shù)。此時(shí),CSS和JS文件可以直接寫入ie中的頁(yè)面
,包括重復(fù)的JS腳本將導(dǎo)致瀏覽器的緩存無(wú)法使用。仔細(xì)檢查你的程序。刪除重復(fù)的引用腳本應(yīng)該不難
除了標(biāo)題中的手動(dòng)重定向之外,網(wǎng)頁(yè)重定向通常是無(wú)意中發(fā)生的,重定向的內(nèi)容不會(huì)使用瀏覽器的緩存。例如,當(dāng)用戶正在訪問(wèn)時(shí),服務(wù)器將轉(zhuǎn)到/通過(guò)301,后跟“/”。如果服務(wù)器配置不當(dāng),也會(huì)給服務(wù)器帶來(lái)額外負(fù)擔(dān)。通過(guò)配置Apache的別名或使用Mod_uurewritemodule等方法,可以盡可能避免不必要的重定向
還有其他方法,比如使用CDN分發(fā)機(jī)制、避免CSS表達(dá)式、避免ETag等。因?yàn)樗鼈儾怀S茫栽谶@里不再重復(fù)
經(jīng)過(guò)上述優(yōu)化,您可以嘗試使用Yslow測(cè)試網(wǎng)頁(yè)的性能分?jǐn)?shù),通常可以達(dá)到70分以上
當(dāng)然,除了優(yōu)化瀏覽器前端和靜態(tài)內(nèi)容外,它還優(yōu)化了程序腳本、服務(wù)器、數(shù)據(jù)庫(kù)和加載。這些更深層次的優(yōu)化方法對(duì)技術(shù)有更高的要求。本文的下半部分將重點(diǎn)討論后端優(yōu)化
[991]
如何優(yōu)化網(wǎng)站性能?對(duì)于前端和后端代碼框架優(yōu)化
2,后端優(yōu)化
前端優(yōu)化可以盡可能避免不必要的服務(wù)器和帶寬資源浪費(fèi),但隨著網(wǎng)站訪問(wèn)量的增加,僅靠前端優(yōu)化并不能解決所有問(wèn)題。后端軟件處理并行請(qǐng)求的能力、程序效率、硬件性能和系統(tǒng)可擴(kuò)展性將成為影響網(wǎng)站性能和穩(wěn)定性的關(guān)鍵瓶頸。為了優(yōu)化系統(tǒng)和程序的性能,我們可以從以下幾個(gè)方面入手:
1)Apache、MySQL等軟件的配置優(yōu)化
雖然Apache、MySQL等軟件安裝后使用的默認(rèn)設(shè)置足以運(yùn)行您的網(wǎng)站,您仍然可以通過(guò)調(diào)整MySQL和Apache的一些系統(tǒng)參數(shù)來(lái)追求更高的效率和穩(wěn)定性。在這個(gè)領(lǐng)域有很多專業(yè)文章和論壇(例如:),為了掌握它,我們需要進(jìn)行深入的研究和實(shí)踐,這里將不討論這些內(nèi)容
Apache是一個(gè)功能齊全但相對(duì)較大的web服務(wù)器。它的資源消耗基本上與同時(shí)運(yùn)行的進(jìn)程數(shù)成正比。它消耗大量服務(wù)器內(nèi)存,通常在處理并行任務(wù)時(shí)非常高效。在某些情況下,我們可以使用輕量級(jí)web服務(wù)器托管靜態(tài)圖像、樣式表和JavaScript文件。只有這樣,我們才能大大提高靜態(tài)文件的處理速度,并大大減少內(nèi)存占用。我使用的web服務(wù)器是俄羅斯的nginx。其他選項(xiàng)包括lighttpd和thttpd
當(dāng)當(dāng)前服務(wù)器不足以處理用戶訪問(wèn)時(shí),通過(guò)前端機(jī)器進(jìn)行web訪問(wèn)的負(fù)載平衡是最快、最可行的方案。通過(guò)ApacheMod_u2;基于反向代理,代理可以很容易地實(shí)現(xiàn)負(fù)載均衡。建議使用nginx作為代理服務(wù)器,這比Apache更快
2)使用緩存技術(shù)提高數(shù)據(jù)庫(kù)效率,文件緩存和分布式緩存
3)檢查服務(wù)器的運(yùn)行狀態(tài),找出影響性能的瓶頸
無(wú)法一勞永逸地優(yōu)化系統(tǒng)。我們需要檢查服務(wù)器的運(yùn)行狀態(tài),及時(shí)發(fā)現(xiàn)影響性能的瓶頸和可能存在的潛在問(wèn)題,因?yàn)榫W(wǎng)站的性能總是取決于桶中的短板。你可以編寫一些腳本來(lái)檢查Web服務(wù)的運(yùn)行,一些開源軟件也提供了良好的功能
一些技能和技術(shù)可以幫助你克服當(dāng)前的困難,但是如果你想讓網(wǎng)站具備處理大規(guī)模訪問(wèn)的能力,你需要從系統(tǒng)架構(gòu)上進(jìn)行仔細(xì)的規(guī)劃。幸運(yùn)的是,許多前輩無(wú)私地分享了他們的建筑。