如何對低硬體配置的中小型php網站進行性能優化?

本人對php不熟悉,現在採用PHP的magento開源項目來做,在盡量少代碼修改的情況下讓頁面載入快些(期望日IP少於2,000,PV少於50,000,首頁打開3s以內)。網站是運行在Digital ocean的VPS(1GB 內存,30GB SSD硬碟)上的,不能做負載均衡。

這個站的圖片比較多,也比較大,但總體數據量在10GB以下。在chrome下監控了打開速度,發現首頁文件等待時間達到了5s,而接收時間為幾百毫秒。另外一些靜態文件(JS,CSS很大,並且都在head內)也block住了其他頁面元素的下載和頁面渲染。所以需要對頁面和伺服器同時進行優化。

我的想法是從以下幾個方面來做:

1.首先從架構上使用lanmp(偏向這個)或者lamp。

打算使用網上的一鍵安裝包,不太清楚這幾個之間最佳的版本組合是什麼樣的(都用最新版本?)? 是自己單獨編譯還是一鍵安裝好?

2.服務端優化,主要使用緩存手段

1)Zend Optimizer優化PHP

2)APC、eaccelerator或者XCache對PHP緩存以及最新出來的Opcache。哪個比較好?

3)Varnish配合Nginx進行緩存靜態資源緩存。相對於squid,哪個比較好?

4)memcached進行資料庫緩存

1-4項同時使用不知道會不會有沒有衝突?或者有沒有更好的方案。因為不想對代碼進行大改,所以服務端緩存最佳實踐這塊請重點給出意見。

3. 使用CDN加速靜態資源

4. 優化靜態資源,使用minify來合併壓縮CSS,JS這些靜態資源

5. 啟用gzip

6. 對圖片和JS等靜態資源增加Expires頭,這條應該算頁面優化吧,放到後面來。

參考了一些資料後發現優化方法有很多,用的太多方法(特別是緩存手段)隱患越大,有沒有優化的最佳策略或者方法論(而不僅僅從工具上)?

請補充或者給意見,謝謝。


所有網際網路的優化,直接或間接都可以歸結為「緩存」和「異步」這四個字的精髓。

但是所有這些網上看來的或者朋友介紹的優化措施,也不是完全的堆壘,你要知道你網站的定位,預估到你網站可能的瓶頸點,就知道用什麼優化較為有效果,而什麼優化基本作用不大。

先說題主的需求,基於magento項目看起來是個電子商務網站,靜態資源、圖片會很多,用戶訪問,基本除了用戶購買流程之外,是讀遠大於寫入,後端數據庫為 mysql。

由此基本可以判斷,題主的網站基本瓶頸會是在圖片過多,瀏覽器需要請求加載渲染負載重,前端優化任務重。數據庫讀寫量並不大,預計量級也不會達到百萬。但是對於用戶訂單方面,要求穩定性和事務性。

因此就用以上題主列舉的幾項優化來說,實際上題主搞錯了方向,server 端的任務並不重,除了數據庫需要優化一下,避免出現瓶頸,基本任務都在於前端優化。我們來一條條分析下:

1)Zend Optimizer優化PHP

zend optimizer的作用是用來緩存 PHP 解析的。因為 PHP 每次訪問都需要先編譯再執行,因此多了一部分 cpu 和時間開銷。但實際上其作用並不大。PHP 語言解析,相對於 IO 方面的開銷,數據庫的等待等等方面基本可以忽略不計的。一般來說要體現效果也就只有特高負載爛 CPU 機器上或者你需要減少服務器陣列的成本時才能看得出。

不過這個東西一般網站開了也就開了,反正也就一個擴展,無可無不可。只是效果沒這麽明顯罷了。

2)APC、eaccelerator或者XCache對PHP緩存以及最新出來的Opcache。哪個比較好?

這些和 zend optimizer 的作用一致,這些裏隨便選一個使用即可。因為如上文所說,並沒有實質性的提升,因此沒有必要太過在意比對效果。

3)Varnish配合Nginx進行緩存靜態資源緩存。相對於squid,哪個比較好?

這個倒是比較重要的部分,靜態資源如果優化的好,是可以對網站整體有個非常大的提升。

不過無論你用 varnish 還是 squid,由於你是美國的 vps,就算緩存了,國內去訪問,也沒有 cdn 的效果好。建議還是把所有靜態資源直接提出來使用雲存儲(國外用戶多就用 amazon 的服務),國內又拍雲之類。他們會在全國各地建立節點,客戶請求的都是就近原則,因此速度上就會提升很多。

此外,建議將 cdn上的靜態資源分為不同域名,起碼和主站域名不同。因為瀏覽器特性,同一域名是有併發請求數限制的,因此如果你分開不同域名,將有助於你提升客戶瀏覽器的圖片加載速度

4)memcached進行資料庫緩存

這一項倒是 ok,有點作用。不過如果你數據庫的數據不到一定量級(eg,10w,百萬),平時 query 的速度不會很低,(尤其題主是使用 SSD 這麽逆天的服務器配置,普通機械硬盤10w 級別數據都能撐下,),那麽 memcached 的作用不會體現,反而多一層判斷,且內容可能不會即時更新。

並且 memcached 如名字所示,是佔用 mem給數據庫做緩存,因此1g 的內存可能講究剛好夠。因為你使用的是 vps,如果不是 xen,而是 openvz 之類的沒有 swap 的啃爹貨,很可能一旦內存耗盡就直接掛機器了。所以,請酌情使用。

另外,題主的另一個需求是儘量少改 php 代碼,但是如果用 memcached 做緩存,估計修改量不會小。當然,如果那開源程序本身自帶memcached插件的功能那就另當別論了。

5)對圖片和JS等靜態資源增加Expires頭

這些是很有必要的。不過基本不用你去操心,如果用 cdn 的話,都是可以自動設置的。

5. 啟用gzip

主說,這是好的。

附加其他建議:

1) mysql 數據庫使用 innodb(支持事務和行鎖),建議至少有一個從庫備份(可以做讀寫分離,主要還是為了容災。商務數據出問題可不是小事)。

2)用 nginx+php-fpm 足矣,不用另加個 apache 進去。

3)圖片能壓縮就壓縮,或者用雲存儲或者雲 cdn 之類的服務自動幫你做。

4)去除無效的 css、js,合併壓縮 css、js。這些是很考教前端優化功夫的。建議找個比較牛的 FE 去做這些事情。當然小網站如果沒有這樣的資源,考慮下 ngx_pagespeed吧。儘量用最小資源做最多事情。

5) 一般商品頁面,首頁,能靜態化就靜態化。不是單單讓你 url 做個偽靜態。而是這一類平時不會修改的內容最好直接做成靜態頁面,這樣 cdn 也能緩存,也不會增加數據庫的讀負擔。

如果開遠程序有全站靜態化或者 cache 的插件,別猶豫,請必須使用。

6)圖片多,靜態資源多,建議修改為能異步加載的就異步加載。比如瀑布流的模式,除了首屏的內容,大部分靜態資源都是等到用戶用滾輪滾過去,才會逐漸加載的。所以這也為什麼越是圖片展越是喜歡用瀑布流,這樣可以有效提高用戶體驗。


先針對你的問題回答.

1.首先從架構上使用lanmp(偏向這個)或者lamp。

為什麼還要加上apache這個"累贅", lnmp即可. php跑fast cgi.

lnmp可以用自己編譯安裝,參考張宴大俠的文章,也可以用lnmp一鍵包,自己定製.

2.服務端優化,主要使用緩存手段.

1 2 使用php cache插件的問題,看你熟悉什麼.這幾個都有自己的優缺點. 我用的xcache.

3.訪問量不大的情況下這幾個都差不多的,但是不推薦squid了,如果你對他很熟可以用他,否則推薦nginx 或者 varnish.

4.使用nosql,對於同硬體資源的吞吐量能數量級的提高.

5.靜態資源問題.訪問量不大的時候還真不太考慮合併資源,多的這點靜態並發數,忽略不計了.有cdn加速是真,能大大提高載入速度.

你的方案都是正確的. 唯一不太推薦的就是你使用 lanmp. 這樣的構架還不如直接用lnmp 或者 lamp. 當然我是lnmp的使用著.也極力推薦lnmp. 至於當硬體資源富裕,產生bad gateway的問題,多半是php fast cgi配置不當造成的.


樓主介紹的不全面啊,揣測是很簡單的小型web1.0 php項目,不考慮高可用等情景,數據量很小&<30g,邏輯簡單,無複雜計算,你這vps也夠用了。

基於上述揣測,覺得重點是前端優化。你說的也差不多了哦,cdn加速靜態資源,客戶端緩存圖片和js,盡量減少http請求,合併css,js等。這塊做好了,80%性能問題也解決了。大膽去做吧。

伺服器端等的優化暫時不展開了,盡量減少IO操作(磁碟IO,網路IO),多cache

建議選用lnmp(linux,nginx,php-fpm,php,mysql),這裡面php如果用框架的話,盡量選用一些性能高的,cakephp之類的少用,性能太差。

如果有其他問題,再發信給我吧。tks


好好努力


給MySQL加索引


推薦閱讀:

TAG:LAMP | 前端性能優化 | 網站優化 | LNMP | 性能優化 |