如何對低硬體配置的中小型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. 啟用gzip6. 對圖片和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加索引
推薦閱讀: