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

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