如何提高網(wǎng)站訪問速度

2023-12-04    分類: 網(wǎng)站建設(shè)

如何提高網(wǎng)站訪問速度

     2006年10月份,我開始對web開發(fā)產(chǎn)生了興趣,并決定自己也嘗試開發(fā)一個網(wǎng)站。在此之前,我做過3年的java application的開發(fā),對web開發(fā)應(yīng)該算一無所知。在比較了java,php,ror,和python后,我選擇了基于python的web框架 - django 。到目前為止,我還認為這是一個明智的決定。Django高效的開發(fā)效率讓我僅僅用一個月的業(yè)余時間,就基本完成了網(wǎng)站的開發(fā)。這是一個網(wǎng)絡(luò)書簽的網(wǎng)站,我加上了一些有意思的特性,讓網(wǎng)站顯得有些與眾不同。

     我購買了域名和Dreamhost 的主機空間。Dreamhost支持django,并且第一年的費用只有180元人民幣。2006年11月份,http://www.hpbookmarks.com 上線了。網(wǎng)友們發(fā)來了善意的評論,“很有創(chuàng)意”,“點意思”,“一些feature很不錯”。同時,還有一個非常一致的意見就是,“訪問速度太慢了”。其實,當時的情況不只是訪問速度慢,而且是相當不穩(wěn)定。很多時候是幾個小時網(wǎng)站無法訪問。當時,我并沒有在意,因為我有兩個自以為“合理”的解釋。第一,我用的是國外最便宜的虛擬主機,國內(nèi)訪問慢是很正常的。第二,django的還處于0.95的狀態(tài),效率和穩(wěn)定性方面有問題也正常。

     但是,我慢慢發(fā)現(xiàn)上面的解釋不過是自己騙自己的借口。很多用dreamhost的網(wǎng)站,訪問起來也很快。而且django也已經(jīng)被成功應(yīng)用在許多大型的網(wǎng)站。我開始認真考慮提高網(wǎng)站速度的問題了。畢竟,速度慢的網(wǎng)站很可能在第一次就失去的用戶,他們可以永遠不會再來了。終于,我進行了下面一步一步的優(yōu)化工作,并且取得了一個看起來還不錯的結(jié)果。

     第一步,用Ajax提高用戶體驗

     由于我的網(wǎng)站上鏈接字體的大小是根據(jù)點擊次數(shù)決定,所以每次點擊都要提交到服務(wù)器端并記錄次數(shù),再在客戶端打開網(wǎng)站鏈接。這在localhost測試的時候沒有發(fā)現(xiàn)問題,但是部署到服務(wù)器上,會感到明顯的等待。解決辦法就是用Ajax。用戶點擊網(wǎng)站鏈接后就直接打開,再通過Ajax將點擊的事件提交到服務(wù)器端記錄。這樣用戶感覺不到任何延時。

     第二步,將邏輯移到客戶端的javascript中

     在開始的時候,“網(wǎng)站標簽高亮”和“手氣不錯”的功能都是提交到服務(wù)器端操作,然后返回結(jié)果的。后來,我發(fā)現(xiàn)其實很多邏輯是可以移到客戶端,由 javascript來實現(xiàn)的。Javascript非常強大,可以完成很多復(fù)雜的邏輯。將邏輯移到客戶端的javascript中,可以很有效的減少和服務(wù)器通訊的次數(shù),獲得更好的訪問速度。

     第三步,解決進程的

     由于采用的是fastCGI的方式,我配置了django.fcgi??墒?,我發(fā)現(xiàn)系統(tǒng)進程中,有大量的django.fcgi進程被標記為 < defunct>(失去功能)。這些進程會導(dǎo)致服務(wù)器有時無法正常訪問。我開始嘗試用命令來kill掉這些進程,但是很快發(fā)現(xiàn)這無法從根本上解決問題。后來,我看到一個老外在blog上提到一個解決方案,將django.fcgi改名為dispatch.fcgi。原來,dispatch.fcgi是一個dreamhost的系統(tǒng)進程,它的健壯性是可以得到保障的。果然,我將django.fcgi改名為 dispatch.fcgi后,的現(xiàn)象再沒有出現(xiàn)。

     第四步,優(yōu)化SQL語句

     SQL語句的執(zhí)行通常也是一個很花費時間的操作。經(jīng)過檢查,我發(fā)現(xiàn)我的一條SQL語句,是一個嵌套三層的子表查詢。而這條SQL還必須是一個Raw SQL,即不能采用django的OR Maping。這意味著不能被cache緩存,每次都是真刀真槍的執(zhí)行。更失敗的是,經(jīng)過我的分析,這條SQL完全可以不執(zhí)行。這是一次設(shè)計上的失誤,標
準的over design(過渡設(shè)計)。當時,我是想通過數(shù)據(jù)庫得到一個最精確的統(tǒng)計值。后來發(fā)現(xiàn),這個值完全可以用一個近似的常量代替。優(yōu)化SQL,尤其是避免不必要的SQL執(zhí)行,帶來的效果是非常明顯的。

     第五步,盡量減少頁面大小

     隨著添加網(wǎng)站越來越多,有一天我發(fā)現(xiàn)django生成的首頁已經(jīng)達到了80k。我很清楚這是一個非常不能被接受的數(shù)字。我開始檢查頁面,很快發(fā)現(xiàn)了線索。 第一,因為偷懶,頁面中很多l(xiāng)ayout是用空格( )實現(xiàn)的。第二,因為為了增加代碼可讀行,調(diào)試方便,每行生成的頁面都增加換行符 (\n)。第三,最糟糕的是,大量的用了
inline css。就是將css style直接嵌入標記塊中。于是,我立即動手,用css的align解決layout,去掉\n,將inline css抽象到獨立的css文件中。這樣下來,在不更改任何內(nèi)容的情況下,80k變成了57k。(補充:由于網(wǎng)站鏈接大部分是打開新窗口,所以用了大量的 target=_blank。在ylsdd的提示下,在html的head里增加了,又節(jié)約了4k。)

     第六步,用gzip進行頁面壓縮

     當我興高采烈的把頁面優(yōu)化結(jié)果貼到了smth bbs上,卻被直接潑了盆涼水。原來百分之二十幾的優(yōu)化結(jié)果,實在太一般了。ylsdd給我了一個很重要的線索,deflate。原來apache的 deflate模塊可以把文件進行g(shù)zip壓縮,壓縮后的文件傳到瀏覽器后再被解壓。主流的瀏覽器都支持這種gzip的解壓操作。于是,我在apache 的配置文
件中加入了Add Output

網(wǎng)站名稱:如何提高網(wǎng)站訪問速度
網(wǎng)頁網(wǎng)址:http://www.muchs.cn/news33/298883.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、標簽優(yōu)化、面包屑導(dǎo)航、域名注冊、網(wǎng)站導(dǎo)航、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化