Apache性能優化

 Apache是目前Internet上使用最爲普遍的Web服務器。它具備比商業Web服務器不遑多讓的功能與速度,同時安裝與設置也十分簡單,正是這些特性讓它成爲市場佔有率最高的Web服務器軟件。不過Apache安裝簡單,並不意味着簡單地安裝就能夠適用於絕大多數應用環境,在高負荷的Web站點,Apache還須要進行調整、優化...... php

 
優化方法 
 
Apache的配置文件是httpd.conf。Windows下該文件位於Apache安裝目錄的Conf子目錄下,RedHat Enterprise Linux AS 3.0 Update 2位於/etc/httpd/conf。經過調整該文件的某些參數,能夠優化Apache的運行效率。 
 
爲了驗證後文Apache參數的調整是否起做用,咱們一般用Apache附帶的ab(Apache Bench)對其進行壓力測試。 
 
ab最經常使用的語法格式是這樣的: 
 
ab -n XXX -c YYY -k http://hostname.port/path/filename 
 
其中: 
 
-n XXX: 
表示最多進行XXX次測試。也就是下載filename文件XXX次。 
 
-c YYY: 
客戶端併發鏈接個數。 
 
-k:    
啓用HTTP KeepAlive功能。默認不啓用KeepAlive功能。 
 
好比咱們要對http://hostname:port/file.com下載10000次進行測試,併發訪問爲60個,啓用HTTP KeepAlive功能,則訪問指令爲: 
 
ab -n 10000 -c 60 -k http://hostname:port/file.htm 
 
測試平臺 
 
在本次優化過程當中。筆者採用了兩臺電腦進行壓力測試。其中一臺爲客戶端,運行ab發送請求,另一臺爲服務器,安裝有Apache提供Web服務。 
 
1.服務器配置 
 
服務器端,筆者採用了較低端的配置。這樣更容易經過ab測試看來調整參數後的效果: 
 
CPU:      Intel Celeron 1.0GHz 
內存:    512MB SRAM 100MHz 
硬盤:    Maxtor 4D040H2 
網卡:    D-Link DFE 530TX 
 
服務器端筆者安裝兩種操做系統:Windows Server 2003 Enterprise Edition並升級到最新的Hotfix。Apache服務器版本爲2.0.50;或者RedHat Enterprise Linux AS 3.0 Update 2。 
 
2.客戶端配置 
 
爲了使評測的瓶頸不在客戶端,筆者客戶端配置要比服務器端好,具體硬件配置以下: 
 
CPU:      P4 3.0GHz 533MHz 打開了HT支持 
內存:    512MB DDR 400 
硬盤:    WD1200JB-00CRA1 
網卡:    D-Link DFE 530TX 
 
客戶端安裝有RedHat Enterprise Linux AS 3.0 Update 2。並利用其中的ab來進行性能測試。 
 
通用優化技巧 
 
對於Apache服務器來講,爲了提升性能須要進行的某些參數調整具備通用性,也就是說只要採用了就可使其性能更好。 
 
1.關閉DNS和名字解析 
 
* HostnameLookups on | off | double 
 
Apache 1.3以前HostnameLookups默認是打開的。這樣客戶端在訪問服務器時,服務器將要解析客戶端的主機名,並將其保存在日誌文件中。對客戶端進行域名反向解析會大幅下降服務器速度,因此最好將其設置爲Off。關閉指令以下: 
 
HostnameLookups off 
 
* UseCanonicalName on | off | dns 
 
打開UseCanonicalName是Web服務器的標準作法。這是由於客戶發送的大部分請求都是對本服務器的引用,打開該項設置就能使用ServerName和Port選項的設置內容構建完整的URL。若是將這個參數設置爲Off,那麼Apache將使用從客戶請求中得到服務器名字和端口值,從新構建URL。 
 
若是你不須要在Apache中架設虛擬主機,建議設置爲: 
 
UseCanonicalName on 
 
2.關閉多餘模塊 
 
Apache採用了模塊化設計,管理員能夠有選擇地加載一些模塊來增強服務器的功能。這些模塊,能夠在建立服務器時靜態編譯到服務器的二進制代碼中,也能夠編譯成一些獨立服務器程序的Dynamic Shared Objects(DSO)文件,在Apache啓動的時候根據須要,動態加載。事實證實,不加載多餘的模塊老是能夠提升Apache的性能。 
 
Apache的DSO模塊是在httpd.conf中以: 
 
LoadModule access_module modules/mod_access.so 
 
方式加載。當不須要某個模塊時,只要在其前添加「#」,註釋掉該行。 
 
通常來講,不須要加載如下模塊: 
 
mod_include.so: 
服務器端包含,是一種已通過時的技術。 
 
mod_autoindex.so: 
若是不但願Apache列目錄顯示,能夠刪除。 
 
mod_access.so、mod_auth.so: 
若是你不須要進行安全驗證,也沒有必要加載。 
 
最好加載如下模塊: 
 
mod_dir.so: 
用於定義缺省文檔index.php、index.jsp等。 
 
mod_log_config.so: 
用於定義記錄文件格式。 
 
mod_mime.so: 
定義文件類型的關聯。 
 
最後須要說明一點的是,並非加載全部的模塊都會下降Apache性能。好比mod_zip能夠把文件壓縮以後再傳給客戶端,這樣就能夠減小40%左右的網絡流量,而mod_expires則能夠減小10%左右的重複請求。 
 
3.取消.htaccess驗證 
 
除非你肯定須要使用.htaccess文件來控制客戶端對相應目錄的訪問權限,不然設置「AllowOverride None」,能夠免除Apache在每一個目錄搜索.htaccess文件之苦。 
 
4.取消符號連接 
 
FollowSymLinks容許使用符號鏈接,這將使用瀏覽器有可能訪問文檔根目錄(DocumentRoot)以外的內容,而且只有符號鏈接的目的與符號鏈接自己爲同一用戶所擁有時(SymLinksOwnerMatch),才容許訪問,這個設置將增長一些安全性,但將耗費Apache大量的資源。 
 
筆者建議: 
 
Options FollowSymLinks 
 
可是不要啓用SymLinksOwnerMatch。 
 
5.打開KeepAlive支持 
 
在HTTP 1.0中和Apache服務器的一次鏈接只能發出一次HTTP請求,而KeepAlive參數支持HTTP 1.1版本的一次鏈接,屢次傳輸功能,這樣就能夠在一次鏈接中發出多個HTTP請求。從而避免對於同一個客戶端須要打開不一樣的鏈接。不少請求經過同一個TCP鏈接來發送,能夠節約網絡和系統資源。 
 
在Apache的配置文件httpd.conf中,設置: 
 
KeepAlive on 
KeepAliveTimeout 15 
 
這樣就能限制每一個鏈接的保持時間是15秒。在咱們的評測中發現,打開KeepAlive以前,ab測試的數據爲: 
 
Requests per second:    201.32 [#/sec] (mean) 
Time per request:      298.031 [ms] (mean) 
Time per request:      4.967 [ms] (mean, across all concurrent requests) 
Transfer rate:          839.49 [Kbytes/sec] received 
 
而打開KeepAlive支持以後,ab測試數據爲: 
 
Requests per second:    341.70 [#/sec] (mean) 
Time per request:      175.594 [ms] (mean) 
Time per request:      2.927 [ms] (mean, across all concurrent requests) 
Transfer rate:          1437.04 [Kbytes/sec] received 
 
最能反應Apache服務器性能的Requests per second,即每秒完成的請求次數從201.32提高到341.70,提高幅度爲70%。雖然在現實環境中,不可能有這麼多的同一鏈接發出的請求,但啓用KeepAlive確實在必定程度上能夠提升Apache服務器的吞吐量和反應速度。 
 
另外,能夠設置: 
 
MaxKeepAliveRequests 100 
 
把MaxKeepAliveRequests設置的儘可能大,能夠在一次鏈接中進行更多的HTTP請求。但在咱們的測試中還發現,把MaxKeepAliveRequests設置成1000,則評測的客戶端容易出現「Send requesttimed out」的錯誤,因此具體數值還要根據本身的情形來設置。 
 
參數決定性能 
 
Apache除了能夠經過一些常規方式進行優化外,還須要調整其運行參數,這樣才能構建一個適合相應網絡環境的Web服務。這些指令從兩個級別對Apache進行了優化。 
 
* 進程級(Process-level) 
 
進程級的參數用來控制Apache相應的客戶端請求的進程數Process(在Windows下稱之爲線程數,threads)。 
 
* 協議級(Protocol-level) 
 
協議級的指令則用來控制Apache與客戶端的鏈接多久才自動斷開。 
 
因爲Windows和Linux/UNIX設計原理的不一樣,因此進程級的指令根據Apache是工做在Linux/UNIX或者Windows下,而分紅兩種。 
 
1.Linux下Apache性能優化 
 
Linux下的Apache預設工做在prefork模式下(由每一個進程處理鏈接請求),這種工做模式也是Apache 1.3系列的工做模式。若是你須要其工做在其餘模式下,則須要手工編譯源代碼來實現: 
 
./configure --prefix=/usr/local/apache-2.0.50 --with-mpm=worker --enable-include && make && make install 
 
Linux下進程級的Apache調整參數包括如下五個。 
 
* StartServers 
 
該參數決定Linux啓動時,自動打開的Apache服務器的數目。它對Apache服務器的性能沒有太大的影響。由於若是MinSpareServers設置的比較大,Apache服務器進程數會立刻調整到不小於MinSpareServers的數目。 
 
在Linux下,咱們能夠經過: 
 
ps aux |grep httpd 
 
來查看當前打開的Apache服務進程數。 
 
* MinspareServers 
 
該參數用於配置在任什麼時候候可用的最小Apache進程個數。通常狀況下,當目前可用的Apache進程數不能知足需求時,Apache會自動打開新進程以服務客戶。因此設置MinspareServers爲較大的值只是爲了讓在比較繁忙的Web環境,讓Apache能夠儘快地知足客戶端的訪問需求。對於天天有百萬訪問量的網站來講,下面的數值是比較合適的: 
 
MinspareServers 32 
 
* MaxSpareServers 
 
較大的MinSpareServers能夠保證Apache有較快的反應速度,過大的MinSpareServers又會佔用更多的系統內存。若是你的系統內存不是很充足或者運行有其餘的服務,把MaxSpareServers設置小一些能夠爲其餘服務空出一些內存。當空閒Apache進程超過MaxSpareServers指定的數值時,Apache主進程會殺掉多餘的空閒進程而保持空閒進程在MaxSpareServers指定的數值。 
 
對於天天百萬訪問量的網站來講,配置大容量的內容,而且設置以下的值是比較合適的: 
 
MaxSpareServers 64 
 
* MaxClients 
 
服務器的處理能力畢竟是有限的,不可能同時處理無限多的鏈接請求。參數MaxClients就用於規定服務器支持的最多併發訪問的客戶數。 
 
若是MaxClients設置得過大,系統在繁忙時不得不在過多的進程之間來回切換爲更多的客戶服務。這樣對每一個客戶的反應就會變慢;若是設置得太小,系統繁忙時就會拒絕客戶鏈接請求。 
 
咱們的設想原則是,當服務器性能較高時,能夠適當增長這個值的設置。若是繁忙出現拒絕訪問現象,說明須要升級服務器硬件了。 
 
若是你不在乎訪問速度,或者認爲反應速度慢也總比拒絕鏈接好,能夠把該值設置大一些。 
 
* MaxRequestsPerChild 
 
當設置KeepAlive爲off時,Apache服務器是用單獨的子進程爲一次鏈接服務,這樣,每次鏈接都須要生成、關閉子進程,這些額外的操做浪費了計算機的大量處理能力。最好的方式是一個子進程能夠爲屢次鏈接請求服務。 
 
但子進程在接受訪問請求時,須要不斷地申請和釋放內存,次數多了就會形成內存垃圾,影響系統穩定性。爲了解決這個問題,能夠規定每個子進程處理的最大請求數,超過此數值,就讓該子進程退出,再從原始的httpd進程中從新複製一個乾淨的副本,從而提升系統的穩定性。 
 
第個子進程可以處理服務請求的最大次數由MaxRequestsPerChild定義。RedHat Enterprise Linux AS 3.0 Update 2缺省的設置值爲1000這個值比較適合(設置爲0支持每一個副本進行無限次的服務處理)。 
 
在咱們的測試過程當中發現,RedHat Enterprise Linux AS 3.0 Update 2下默認配置的Apache並不能很好地應付大負荷站點。咱們須要打開KeepAlive,並加大StartServers、MinSpareServers、MaxSpareServers和MaxClients的數值。這些參數對於Apache性能的改善有很大的影響。 
 
小知識: 
RedHat Enterprise Linux AS 3.0 Update 2最大MaxClients只能設置到256。若是你須要設置其爲更高,須要在MaxClients前面添加: 
ServerLimit xxx 
其中xxx不能少於MaxClients的數值。該設置方法適用於Apache 2.0系列。 
 
2.Windows下Apache優化 
 
Windows下,Apache 2.0通過了全新的設計,採用多線程的方式(work)運行。這種運行方式,理論上比Linux/UNIX的Perfork運行模式有更好的性能。 
 
Work模式下由單個控制進程負責子進程的創建。每一個子進程能夠創建由ThreadsPerChild指定的固定數量的線程。由獨立的線程監聽並處理到來的鏈接。 
 
在Windows下能夠執行「Apache -l」。查看當前工做模式,若是顯示「mpm_winnt.c」,則表示Apache工做在多線程模式下;在Linux下執行「httpd -l」看到「prefork.c」表示工做在子進程模式下。 
 
其配置語句是: 
 
 
StartServers          2 
MaxClients          150 
MinSpareThreads      25 
MaxSpareThreads      75          
ThreadsPerChild      25 
MaxRequestsPerChild    0 
 
 
Apache力圖維持一個備用的服務線程池,讓客戶端無須等待線程/進程的創建便可獲得處理。最初創建的進程數由StartServers指定。而後Apache會不停地檢測全部Apache進程中空閒線程的總數,並新建或結束進程使總數維持在MinSpareThreads和MaxSpareThreads所指定的範圍之內。但同時能夠獲得處理的客戶端的最大數量又取決於MaxClients指令,而進程創建的最大數量取決於ServerLimit指令。三者之間的關係爲: 
 
ServerLimit*ThreadsPerChild >=MaxClients 
相關文章
相關標籤/搜索