文章來源: http://www.ibm.com/developerworks/cn/linux/l-tune-lamp-2.html
LAMP 系統(tǒng)性能調(diào)優(yōu),第 2 部分: 優(yōu)化 Apache 和 PHP是什么降低了 Apache 的速度,如何使 PHP 發(fā)揮最大效力 ![]() |
![]() |
![]() |
級別: 中級
Sean A. Walberg
(
sean@ertw.com
), 高級網(wǎng)絡工程師
2007 年 6 月 07 日 如今,使用 LAMP(Linux?、Apache、MySQL 和 PHP/Perl)架構的應用程序不斷被開發(fā)和部署。但是,服務器管理員常常對應用程序本身幾乎沒有控制能力,因為應用程序是別人編寫的。這份 共三部分的系列文章 將討論許多服務器配置問題,這些配置會影響應用程序的性能。第二篇文章重點討論可為優(yōu)化 Apache 和 PHP 而采取的措施。<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES--> Linux、Apache、MySQL 和 PHP(或 Perl)是許多 Web 應用程序的 LAMP 架構的基礎。有很多基于 LAMP 組件的開源軟件包可用于解決各種各樣的問題。隨著應用程序負載的增加,底層基礎設施的瓶頸也會越來越明顯,其表現(xiàn)形式就是響應用戶請求的速度變慢。 上一篇文章 展示了調(diào)優(yōu) Linux 系統(tǒng)的方法,還介紹了 LAMP 和性能度量的基礎知識。本文重點關注 Web 服務器組件:Apache 和 PHP。 Apache 是一種高度可配置的軟件。它具有大量特性,但每一種都代價高昂。從某種程度上來說,調(diào)優(yōu) Apache 來說就是以恰當?shù)姆绞椒峙滟Y源,還涉及到將配置簡化為僅包含必要內(nèi)容。 Apache 是模塊化的,因為可以輕松添加和移除特性。在 Apache 的核心,多處理模塊(Multi-Processing Module,MPM)提供了這種模塊化功能性 —— 管理網(wǎng)絡連接、調(diào)度請求。MPM 使您能夠使用線程,甚至能夠?qū)?Apache 遷移到另外一個操作系統(tǒng)。
每次只能有一個 MPM 是活動的,必須使用
每個請求使用一個進程的傳統(tǒng)模型稱為
prefork
。較新的線程化模型稱為
worker
,它使用多個進程,每個進程又有多個線程,這樣就能以較低的開銷獲得更好的性能。最新的
event
MPM 是一種實驗性的模型,為不同的任務使用單獨的線程池。要確定當前使用的是哪種 MPM,可執(zhí)行
選擇使用何種 MPM 取決于許多因素。在 event MPM 脫離實驗狀態(tài)之前,不應考慮這種模型,而是在使用線程和不使用線程之間作出選擇。表面上看來,如果所有底層模塊(包括 PHP 使用的所有庫)都是線程安全的,線程要優(yōu)于分叉(forking)。而 Prefork 是較為安全的選擇;如果選擇了 worker,則應該謹慎測試。性能收益還取決于您的發(fā)布版所附帶的庫及硬件。 無論選擇了哪種 MPM,都必須恰當?shù)嘏渲盟R话愣裕渲?MPM 包括告知 Apache 怎樣去控制有多少 worker 正在運行,它們是線程還是進程。prefork MPM 的重要配置選項如清單 1 所示。 清單 1. prefork MPM 的配置
prefork 模型會為每個請求創(chuàng)建一個新進程。多余的進程保持空閑,以處理傳入的請求,這縮短了啟動延遲。只要 Web 服務器出現(xiàn),預先完成的配置就會立即啟動 50 個進程,并盡力保持 10 到 20 個空閑服務器運行。進程數(shù)的硬性限制由
配置線程化 MPM 與之類似,不同之處只是必須確定使用多少線程和進程。Apache 文檔解釋了所有必要的參數(shù)和計算。
要經(jīng)過幾次嘗試和出錯之后才能選好要使用的值。最重要的值是
如果
根據(jù)服務器的角色調(diào)優(yōu)要啟動和保持空閑的服務器數(shù)量。如果服務器僅運行 Apache,那么可以使用適中的值,如 清單 1 所示,因為這樣就能充分利用機器。如果系統(tǒng)中還有其他數(shù)據(jù)庫或服務器,那么就應該限制運行中的空閑服務器的數(shù)量。 Apache 處理的每個請求都要履行一套復雜的規(guī)則,這些規(guī)則指明了 Web 服務器必須遵循的約束或特殊指令。對文件夾的訪問可能按 IP 地址約束為某個特定文件夾,也可配置用戶名和密碼。這些選項還包含處理特定文件,例如,如果提供了一個目錄列表,該如何處理的文件,或輸出結果是否應壓縮。 這些配置以 httpd.conf 中容器的形式出現(xiàn),例如 <directory>,以便指定所用配置引用的是磁盤上的一個位置;再如 <location>,表示引用是 URL 中的路徑。清單 2 展示了一個實際的 Directory 容器。</location></directory> 清單 2. 為根目錄應用的一個 Directory 容器
在清單 2 中,位于一對
最后這個場景正是導致兩方面關注的原因所在。第一個方面與性能有關。如果禁用了
至此,有安全意識的讀者應該有了警惕的感覺。安全性永遠是功能性與風險之間的權衡。在我們的例子中,功能性是速度,而風險是允許對系統(tǒng)上的文件進行未經(jīng)授權的訪問。緩解風險的措施之一是 LAMP 應用服務器通常專注于一種具體功能,用戶無法創(chuàng)建危險的符號連接。如果有必要啟用符號連接,那么可以將其約束在文件系統(tǒng)的特定區(qū)域,如清單 3 所示。 清單 3. 將 FollowSymLinks 約束為一個用戶的目錄
在清單 3 中,一個用戶的主目錄中的任何 public_html 目錄及其所有子目錄都移除了
如您所見,通過主服務器配置,可為每個目錄單獨配置選項。用戶可以自行重寫這種服務器配置(如果管理員通過
即便
最簡單的解決方案是不允許重寫,這能消除 Apache 檢查 .htaccess 的需求。之后的任何特殊配置都將直接放在 httpd.conf 中。清單 4 顯示為對一個用戶的項目目錄進行密碼檢查向 httpd.conf 增加的代碼,而不是將其放入一個 .htaccess 文件并依賴于
清單 4. 將 .htaccess 配置移入 httpd.conf
如果配置轉(zhuǎn)移到 httpd.conf 中,且
有時不可能徹底消除 .htaccess 文件的使用。例如,在清單 5 中,一個選項被約束到文件系統(tǒng)的特定部分,重寫也可以是有作用域的。 清單 5. 限定 .htaccess 檢查的作用域
實現(xiàn)清單 5 之后,Apache 會在父目錄中查找 .htaccess 文件,但會在 public_html 目錄處停止,因為文件系統(tǒng)的其余部分禁用了此功能。例如,如果請求的是一個映射到 /home/user/public_html/project/notes.html 的文件,那么僅有 public_html 和 project 目錄被搜索。
關于每目錄單獨配置的最后一個提示就是:要按順序依次進行。任何介紹 Apache 調(diào)優(yōu)的的文章都會告訴您,應通過
一個客戶機連接到 Web 服務器時,允許客戶機通過同一個 TCP 連接發(fā)出多個請求,這減少了與多個連接相關的延遲。在一個 Web 頁面引用了多幅圖片時,這就很有用:客戶機可以通過一個連接先請求頁面,再請求所有圖片。其缺點在于服務器上的 worker 進程必須等待客戶機要關閉的會話,之后才能轉(zhuǎn)到下一個請求。
Apache 使您能夠配置如何處理持久連接(稱為
keepalives
)。httpd.conf 全局級的
持久連接的處理并非 “一刀切” 式的配置。對于某些 Web 站點,禁用 keepalives 更合適(
Web 服務器能夠在將輸出發(fā)回給客戶機之前壓縮它。這將使通過 Internet 發(fā)送的頁面更小,代價是 Web 服務器上的 CPU 周期。對于那些負擔得起 CPU 開銷的服務器來說,這是提高頁面下載速度的好辦法 —— 頁面壓縮后大小變?yōu)樵瓉淼娜种贿@種事情并不罕見。
圖片通常已經(jīng)是壓縮過的,因此壓縮應僅限于文本輸出。Apache 通過
PHP 是運行應用程序代碼的引擎。應該僅安裝計劃使用的那些模塊,并配置您的 Web 服務器,使之僅為腳本文件(通常是以 .php 結尾的那些文件)使用 PHP,而非所有靜態(tài)文件。 請求一個 PHP 腳本時,PHP 會讀取該腳本,并將其編譯為 Zend 操作碼 ,這是要執(zhí)行的代碼的一種二進制表示形式。隨后,此操作碼由 PHP 執(zhí)行并丟棄。操作碼緩存將保存這個編譯后的操作碼,并在下一次調(diào)用該頁面時重用它。這會節(jié)省很多時間。有多種緩存可用,我比較常用的是 eAccelerator。 要安裝 eAccelerator,您的計算機上需要有 PHP 開發(fā)庫。由于不同的 Linux 發(fā)布版存放文件的位置不同,所以最好直接從 eAccelerator 的 Web 站點獲得安裝說明(參見 參考資料 部分獲得鏈接)。您的發(fā)布版也有可能已經(jīng)包含了一個操作碼緩存,只需安裝即可。
無論如何在系統(tǒng)上安裝 eAccelerator,都有一些配置選項需要注意。配置文件通常是 /etc/php.d/eaccelerator.ini。
如果共享內(nèi)存的分配超出極限,eAccelerator 必須將舊腳本從內(nèi)存中清除。默認情況下,這是被禁用的;
另一種流行的 eAccelerator 替代工具是 Alternative PHP Cache(APC)。Zend 的廠商也提供了一種商業(yè)操作碼緩存,包括一個進一步提高效率的優(yōu)化器。 PHP 的配置是在 php.ini 中完成的。四個重要的設置控制 PHP 可使用多少系統(tǒng)資源,如表 1 所列。 表 1. php.ini 中與資源相關的設置 設置 描述 建議值
具體數(shù)字主要取決于您的應用程序。如果要從用戶處接收大文件,那么
PHP 可執(zhí)行的日志記錄數(shù)是可配置的。在生產(chǎn)環(huán)境中,禁用除最重要的日志以外的一切日志記錄能夠減少磁盤寫操作。如果需要使用日志來排除問題,那么可以按需啟用日志記錄。
本文重點探討 Web 服務器的調(diào)優(yōu),包括 Apache 和 PHP。對于 Apache,總體的想法是消除 Web 服務器必須執(zhí)行的多余檢查,例如處理 .htaccess 文件。還必須調(diào)優(yōu)所用的多處理模塊,以便在使用的系統(tǒng)資源和可供傳入請求使用的空閑 worker 之間找到平衡。對于 PHP,最好的事情就是安裝一個操作碼緩存。密切注意幾個資源設置也能確保腳本不會浪費系統(tǒng)資源,不會減慢系統(tǒng)處理其他任務的速度。 本系列的下一篇也是最后一篇文章將介紹 MySQL 數(shù)據(jù)庫的調(diào)優(yōu)。請繼續(xù)關注! |
[轉(zhuǎn)]LAMP 系統(tǒng)性能調(diào)優(yōu),第 2 部分: 優(yōu)化 Apache 和 PHP
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
