Linux+Apache+Mysql+PHP優(yōu)化技巧
LAMP這個詞的由來最早始于德國雜志“c't Magazine”,Michael Kunze在1990年最先把這些項目組合在一起創(chuàng)造了LAMP的縮寫字。這些組件雖然并不是開開始就設(shè)計為一起使用的,但是,這些開源軟件都可以很方便的隨時獲得并免費獲得。這就導(dǎo)致了這些組件經(jīng)常在一起使用。在過去的幾年里,這些組件的兼容性不斷完善,在一起的應(yīng)用情形變得非常普便。為了改善不同組件之間的協(xié)作,已經(jīng)創(chuàng)建了某些擴展功能。目前,幾乎在所有的Linux發(fā)布版中都默認(rèn)包含了“LAMP stack”的產(chǎn)品。這些產(chǎn)品組成了一個強大的Web應(yīng)用程序平臺
LAMP 平臺由四個組件組成,呈分層結(jié)構(gòu)。每一層都提供了整個軟件棧的一個關(guān)鍵部分:
- Linux:Linux 處在最低層,提供操作系統(tǒng)。其他每個組件實際上也在 Linux 上運行。但是,并不一定局限于 Linux,如有必要,其他組件也可以在 Microsoft® Windows®、Mac OS X 或 UNIX® 上運行。
- Apache:次低層是 Apache,它是一個 Web 服務(wù)器。Apache 提供可讓用戶獲得 Web 頁面的機制。Apache 是一款穩(wěn)定的、支持關(guān)鍵任務(wù)的服務(wù)器,Internet 上超過 65% 的網(wǎng)站都使用它作為 Web 服務(wù)器。PHP 組件實際上是在 Apache 中,動態(tài)頁面可以通過 Apache 和 PHP 創(chuàng)建。
- MySQL:MySQL 提供 LAMP 系統(tǒng)的數(shù)據(jù)存儲端。有了 MySQL,便可以獲得一個非常強大的、適合運行大型復(fù)雜站點的數(shù)據(jù)庫。在 Web 應(yīng)用程序中,所有數(shù)據(jù)、產(chǎn)品、帳戶和其他類型的信息都存放在這個數(shù)據(jù)庫中,通過 SQL 語言可以很容易地查詢這些信息。
- PHP:PHP 是一門簡單而有效的編程語言,它像是粘合劑,可以將 LAMP 系統(tǒng)所有其他的組件粘合在一起。您可以使用 PHP 編寫能訪問 MySQL 數(shù)據(jù)庫中的數(shù)據(jù)和 Linux 提供的一些特性的動態(tài)內(nèi)容。
[檢測工具]
為了得到完整的調(diào)試結(jié)果,建議你采用 ApacheBench 或者 httperf之類的軟件。如果你對非 LAMP 架構(gòu)的服務(wù)器測試有興趣的話,建議你采用微軟的免費軟件: Web Application Stress Tool(需要 NT 或者 2000)。(其它服務(wù)器測試工具)
檢測 Apache ,采用 top d 1 顯示所有進(jìn)程的 CPU 和內(nèi)存情況。另外,還采用 apachectl status 命令
[硬件優(yōu)化]
1、升級硬件的一般規(guī)則:對于 PHP 腳本而言,主要的瓶頸是 CPU ,對于靜態(tài)頁面而言,瓶頸是內(nèi)存和網(wǎng)絡(luò)。一臺 400 Mhz 的普通奔騰機器所下載的靜態(tài)頁面就能讓 T3 專線(45Mbps)飽和。
2、采用 hdparm 來優(yōu)化磁盤,一般能提升 IDE 磁盤讀寫性能 200%,但是對 SCSI 硬盤也有效果。(不同類型的硬盤對比)
[策略優(yōu)化]
3、Apache 處理 PHP 腳本的速度要比靜態(tài)頁面慢 2-10 倍,因此盡量采用多的靜態(tài)頁面,少的腳本。
4、PHP 腳本如果不做緩沖,每次調(diào)用都需要編譯,因此,安裝一個 PHP 緩沖產(chǎn)品能提升 25-100% 的性能。
5、如果你采用了 Linux 系統(tǒng),建議升級內(nèi)核到 2.4,因為靜態(tài)頁面由內(nèi)核服務(wù)。
6、另外一項緩沖技術(shù)是把不常修改的 PHP 頁面采用 HTML 緩沖輸出。
7、不要在 Web 服務(wù)器上運行 X-Windows ,關(guān)掉沒有必要運行的進(jìn)程。
8、如果能夠用文本就不要用圖像,盡量減小圖片的尺寸。
9、分散負(fù)載,把數(shù)據(jù)庫服務(wù)器放到另外的機器上去。采用另外低端的機器服務(wù)圖片和 HTML 頁面,如果所有的靜態(tài)頁面在另外一臺服務(wù)器上處理,可以設(shè)置 httpd.conf 中的 KeepAlives 為 off ,來減少斷開連接的時間。
10、以上所有的方法都是針對單機而言的,如果你覺得系統(tǒng)還是不夠快,可以采用集群,負(fù)載均衡,緩沖技術(shù)。采用 Squid 作為緩沖,配置 Squid 的方法。
[編譯優(yōu)化]
11、把基于文件的會話切換到基于共享內(nèi)存的會話。編譯 PHP 時采用 --with-mm 選項,在 php.ini 中設(shè)置 set session.save_handler=mm 。這個簡單的修改能讓會話管理時間縮短一半。
12、采用最新版本的 Apache ,并把 PHP 編譯其中,或者采用 DSO 模式,不要采用 CGI 方式。
13、編譯 PHP 時,建議采用如下的參數(shù):
--enable-inline-optimization --disable-debug
[配置優(yōu)化]
14、修改 httpd.conf :
# 關(guān)閉 DNS lookups,PHP 腳本只拿 IP 地址
HostnameLookups off
15、如果網(wǎng)絡(luò)擁擠,CPU 資源不夠用,采用 PHP 的 HTML 壓縮功能:
output_handler = ob_gzhandler
PHP 4.0.4 的用戶請不要使用,因為存在內(nèi)存泄漏問題。
16、修改 httpd.conf 中的 SendBufferSize 為你最大的頁面文件的大小。加大內(nèi)核的 TCP/IP 寫緩沖大小。
17、采用數(shù)據(jù)庫的持久連接時,不要把 MaxRequestsPerChild 設(shè)置得太大。
[第三方軟件優(yōu)化]
18、如果喜歡從修改 Apache 源碼入手,可以安裝 lingerd。在頁面產(chǎn)生和發(fā)送后,每個 Apache 進(jìn)程都會浪費一段時光在客戶連接上,Lingerd 能接管這項工作,讓 Apache 迅速服務(wù)下一個客戶請求。
19、如果你足夠勇敢的話,還可以采用 Silicon Graphics 的 Accelerated Apache 補丁。這個工程能使 Apache 1.3 快 10 倍,使 Apache 2.0 快 4 倍。
安裝一個 PHP 緩沖產(chǎn)品能提升 25-100% 的性能。
[Linux系統(tǒng)優(yōu)化]
1.清理服務(wù)器磁盤碎片:
不論Linux文件系統(tǒng)采用什么文件格式(ext3、JFS、XFS、ReiserFS )、何種類型的硬盤(IDE 、SCSI),隨著時間的推移文件系統(tǒng)都會趨向于碎片化。ext3、JFS等高級文件系統(tǒng)可以減少文件系統(tǒng)的碎片化,但是并沒有消除。在繁忙的數(shù)據(jù)庫服務(wù)器中,隨著時間的過去,文件碎片化將降低硬盤性能,硬盤性能從硬盤讀出或?qū)懭霐?shù)據(jù)時才能注意到。時間長了會發(fā)現(xiàn)每個磁盤上確實積累了非常多的垃圾文件,釋放磁盤空間可以幫助系統(tǒng)更好地工作。Linux最好的整理磁盤碎片的方法是做一個完全的備份,重新格式化分區(qū),然后從備份恢復(fù)文件。但是對于7×24小時工作關(guān)鍵任務(wù)服務(wù)器來說是比較困難的。Kleandisk是一個高效的磁盤清理工具,它能把磁盤上的文件分成不同的"組",比如把所有的"core"文件歸成一組(Group),這樣要刪除所有core文件時只要刪除這個組就行了。core文件是當(dāng)軟件運行出錯時產(chǎn)生的文件,它對于軟件開發(fā)人員比較有用,對于其他用戶(比如電子郵件服務(wù)器)卻沒有任何意義。因此,如果沒有軟件開發(fā)的需要,見到core文件就可以將其刪除。
2、開啟硬盤DMA
現(xiàn)在使用的IDE硬盤基本支持DMA66/100/133(直接內(nèi)存讀取)但是Linux發(fā)行版本安裝后一般沒有打開,可以 /etc/rc.d/rc.local 最後面加上一行: /sbin/hdparm -d1 –x66 -c3 -m16 /dev/hda 這樣以后每次開機,硬盤的 DMA 就會開啟,不必每次手動設(shè)定。添加前后你可以使用命令:hdparm -Tt /dev/hda 來測試對比一下。
3、調(diào)整緩沖區(qū)刷新參數(shù)
Linux內(nèi)核中,包含了一些對于系統(tǒng)運行態(tài)的可設(shè)置參數(shù)。緩沖刷新的參數(shù)可以通過調(diào)整 /proc/sys/vm/bdflush文件來完成,這個文件的格式是這樣的: # cat /proc/sys/vm/bdflush 30 64 64 256 500 3000 60 0 0
每一欄是一個參數(shù),其中最重要的是前面幾個參數(shù)。第一個數(shù)字是在"dirty"緩沖區(qū)達(dá)到多少的時候強制喚醒bdflush進(jìn)程刷新硬盤,第二個數(shù)字是每次讓bdflush進(jìn)程刷新多少個dirty塊。所謂dirty塊是必須寫到磁盤中的緩存塊。接下來的參數(shù)是每次允許bd flush將多少個內(nèi)存塊排入空閑的緩沖塊列表。 以上值為RHEL 4.0中的缺省值??梢允褂脙煞N方法修改:
(1)使用命令
- # echo "100 128 128 512 5000 3000 60 0 0">/proc/sys/vm/bdflush
并將這條命令加到/etc/rc.d/rc.local文件中去。
(2)在/etc/sysctl.conf 文件中加入如下行:
- vm.bdflush = 100 128 128 512 5000 3000 60 0 0
以上的設(shè)置加大了緩沖區(qū)大小,降低了bdflush被啟動的頻度,VFS的緩沖刷新機制是Linux文件系統(tǒng)高效的原因之一。
4、優(yōu)化輸入輸出
I/O程序?qū)inux系統(tǒng)性能也是相當(dāng)重要的,網(wǎng)絡(luò)硬件I/O對服務(wù)器尤其重要?,F(xiàn)在大多數(shù)Linux服務(wù)器使用10/100 Mb以太網(wǎng)。如果有較重的網(wǎng)絡(luò)負(fù)載,則可以考慮千兆以太網(wǎng)卡。如果沒有能力購買千兆網(wǎng)卡的話:可以使用多塊網(wǎng)卡虛擬成為一塊網(wǎng)卡,具有相同的IP地址。這項技術(shù),在Linux中,這種技術(shù)稱為Bonding。Bonding在Linux2.4以上內(nèi)核中已經(jīng)包含了,只需要在編譯的時候把網(wǎng)絡(luò)設(shè)備選項中的 Bonding driver support選中見圖1。當(dāng)然利用Bonding技術(shù)配置雙網(wǎng)卡綁定的前提條件是兩塊網(wǎng)卡芯片組型號相同,并且都具備獨立的BIOS芯片。
然后,重新編譯核心,重新起動計算機,執(zhí)行如下命令:
- #ismod bonding
- #ifconfig eth0 down
- #ifconfig eth1 down
- #ifconfig bond0 ipaddress
- #ifenslave bond0 eth0
- #ifenslave bond0 eth1
現(xiàn)在兩塊網(wǎng)卡已經(jīng)象一塊一樣工作了。這樣可以提高集群節(jié)點間的數(shù)據(jù)傳輸.bonding對于服務(wù)器來是個比較好的選擇,在沒有千兆網(wǎng)卡時,用兩塊100兆網(wǎng)卡作bonding,可大大提高服務(wù)器到交換機之間的帶寬.但是需要在交換機上設(shè)置連接bonding網(wǎng)卡的兩個子口映射為同一個虛擬接口。編輯 /etc/modules.conf文件,加入如下內(nèi)容,以使系統(tǒng)在啟動時加載Bonding模塊。 alias bond0 bonding options bond0 mode=0
“mode”的值表示工作模式,共有0、1、2和3四種模式,這里設(shè)定為0。Bonding工作在負(fù)載均衡(Load Balancing (round-robin))方式下,即兩塊網(wǎng)卡同時工作,這時理論上Bonding能提供兩倍的帶寬。Bonding運行在網(wǎng)卡的混雜(Promisc)模式下,而且它將兩塊網(wǎng)卡的MAC地址修改為一樣的?;祀s模式就是網(wǎng)卡不再只接收目的硬件地址是自身MAC地址的數(shù)據(jù)幀,而是可以接收網(wǎng)絡(luò)上所有的幀。
5、減少虛擬終端機的數(shù)量。
Linux安裝后系統(tǒng)默認(rèn)是6個虛擬終端機,也就是 CTRL+ALT F1~F6 那六個,作為服務(wù)器使用可以關(guān)掉其中四個,只留下 CTRL+ALT F1~F2,大約省下 4 Mbytes 的內(nèi)存,但是這樣一來,X-Window 會從原來的 CTRL+ALT F7 變成 CTRL+ALT F3 。 修改 /etc/inittab 中,將 mingetty 3 ~6 全部加上 # 字號 。
6. 關(guān)閉一些不用的服務(wù)
Linux服務(wù)器在啟動時需要啟動很多系統(tǒng)服務(wù),它們向本地和網(wǎng)絡(luò)用戶提供了Linux的系統(tǒng)功能接口,直接面向應(yīng)用程序和用戶。提供這些服務(wù)的程序是由運行在后臺的守護(hù)進(jìn)程(daemons)來執(zhí)行的。守護(hù)進(jìn)程是生存期長的一種進(jìn)程。它們獨立于控制終端并且周期性的執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。他們常常在系統(tǒng)引導(dǎo)裝入時啟動,在系統(tǒng)關(guān)閉時終止。linux系統(tǒng)有很多守護(hù)進(jìn)程,大多數(shù)服務(wù)器都是用守護(hù)進(jìn)程實現(xiàn)的。如Web服務(wù)http 等。同時,守護(hù)進(jìn)程完成許多系統(tǒng)任務(wù),比如,作業(yè)規(guī)劃進(jìn)程crond、打印進(jìn)程lqd等。有些書籍和資料也把守護(hù)進(jìn)程稱作:“服務(wù)”。關(guān)閉服務(wù)方法請查看筆者的文章:深入理解Linux守護(hù)進(jìn)程。