NO IMAGE

Apache優化步驟:

1、先檢視apache的執行模式,檢視命令:

httpd -l

Compiled in modules:
           core.c
           prefork.c
           http_core.c
           mod_so.c
        這裡可以看到執行模式是prefork模式。

2、修改apache 的httpd.conf 配置

本文是對512M 記憶體並裝有apache的vps進行優化,請不要跟我說裝nginx就強多了,確實如此,但是你這樣說的話,這篇文章就沒什麼意義了,哈哈。那麼進入正題吧!

作業系統(linux):CentOS 5.5 32位(並不是我說這個比較好,只是Cents我用得比較熟練)

    記憶體:512M
    cpu:1G(1000MHz,vps實際有沒有這個數,很難說)
    apache:2.2(建議低版本的,升級到高版本,畢竟舊版有很多問題,且效能也是高版本好點)

執行的主要是PHP程式,其他的不多說了,與本文關係不大。

首先,如題所說,本文所說的優化是針對apache 2.2以上版本,及使用perfork MPM模式的。perfork是apache在linux下預設安裝下的模式,如果使用apache作為伺服器的放在,還是使用perfork模式比較好,worker模式下對php某些功能並不支援。如果你使用的是win系統或都沒有使有和perfork,那麼下面可以選擇不看或抱著學習的態度看看咯。

以下內容均屬於博主自己的見解,實際測試請根據你的伺服器,程式及其他因素按需處理。

一般情況下,我們需要優化apache就是因為apache佔用大量的記憶體,導致vps當機,因為perfork是多程序處理的,每個程序都會點用一定的記憶體數量。所以限制httpd程序的數量,從而達到優化apache的作用。影響單個httpd程序的記憶體大小,主要都是載入模組,至少什麼模組是合適的,我也很難說,因為這個是按由你的需要而定的。網上有些人說,絕大部分都會用不上的模組列出來,我認為這個是有很大的誤導作用,因為絕大部分人中,也許你就是其中一個。將有用的模組遮蔽掉,最壞的情況,就是重啟apache出錯,或部分功能無法使用。所以我也不會列出什麼最少模組載入方案什麼的。所以,我只會說出一些參考。

apache(perfork)下的模組載入,並不是模組載入列表,沒有的模組並不是遮蔽掉了,只是我也不清楚它的實際作用。

(一)、對於apache2.2,模組名有cache的一般都是有用的,因為有不少的這類别範本都是2.1以上的apache才支援的,所以這類的模組不會是無緣無緣而存在的。

(二)、很有可能或必用到的模組有:

複製程式碼程式碼如下:

LoadModule auth_basic_module modules/mod_auth_basic.so
  LoadModule authn_file_module modules/mod_authn_file.so
  LoadModule include_module modules/mod_include.so
  LoadModule log_config_module modules/mod_log_config.so
  LoadModule expires_module modules/mod_expires.so
  LoadModule deflate_module modules/mod_deflate.so
  LoadModule headers_module modules/mod_headers.so
  LoadModule setenvif_module modules/mod_setenvif.so
  LoadModule mime_module modules/mod_mime.so
  LoadModule autoindex_module modules/mod_autoindex.so
  LoadModule negotiation_module modules/mod_negotiation.so
  LoadModule dir_module modules/mod_dir.so
  LoadModule alias_module modules/mod_alias.so
  LoadModule rewrite_module modules/mod_rewrite.so

(三)、我粗略點了一下apache裡面的模組約在50 以,要從中選擇人人都適用的模組載入列表是不可能的,至少cgi模組我是不會用,但不排除你不會用。

模組載入這一塊就說到這裡,這個大家多百度,多用自然會識別出一些有用模組並漸漸遮蔽不使用的模組。

接下來,就是最為重要的perfork配置,也是困擾了我很久的問題,儘管引數就那麼6個,那是卻足以讓你的vps當機。先列出需要修改的引數,修改位於httpd.conf的檔案裡面

複製程式碼程式碼如下:

Timeout 30
KeepAlive On
MaxKeepAliveRequests 80
KeepAliveTimeout 15
<IfModule prefork.c>
ServerLimit 150
StartServers      5
MinSpareServers   5
MaxSpareServers   10
MaxClients       150
MaxRequestsPerChild 4000
</IfModule> 

上面的程式碼就是要修改的,實際上我們是要修改perfork裡在的引數,之所以將Timeout,KeepAlive等也寫出來,是因為這個也是影響apache效能的。

Timeout是一個連線多少時間後斷開,這個引數設定在30-60是一般的php程式都是適用的,至少要執行一些要佔用大量時間的php程式,那麼適當調高也是可以的,但請不要太高,否則會影響apache效能,本次優化我們使用30就很足夠了。

MaxKeepAliveRequests 是一個連線最大的請求量,對於頁面有較多的圖片等元素,可以適當調高一點,對於一般的網頁設定在80-120是足夠的,我們就設定為100,如果設定太高會導致httpd長時間不能退出釋放記憶體的。

KeepAliveTimeout 是當使用者處理一次連線時,如果在該引數的時間內還有請求則會繼續執行,不需要重新建立新的連線,直到達到MaxKeepAliveRequests的最大值才會退出。對於perfork模式下的,有人認為是將KeepAlive Off會比較好,但是對於絕大多數的網站都會不多不少有些圖片元素,所以將該項開啟,並將KeepTimeOut設定在2-5秒,不但有效提高伺服器效能,也能加快頁面開啟速度。

接下來,就是正式進入perfork的引數設定了,不想伺服器執行一會就記憶體佔滿的得看看哦。

首先是引數ServerLimit就是伺服器最大支援同時連線的客戶端,該值將決定下面引數MaxClient可以設定的值的範圍。ServerLimit實際上只是起到一個限制的作用,並沒有實際有作用,也許有,我就不知道了。實際上起到作用的是,MaxClient引數,但這個值又受ServerLimit的限制,等下會講。

另三個引數StartServers,MinSpareServers,MaxSpareServers,為什麼將這三個引數一起說呢,因為這三個數是聯絡在一起的。這三個數都是決定空閒程序數量,StartServers應該範圍就是MinSpareServers和MaxSpareServers之間。否則,apache會自動將該值還原到兩都之間,所以不要浪費不必要的資源。按照perfork預設的配置,這三個引數分別為:5,5,10。但是對於只有512M記憶體的vps來說,我認為還是有過大的負載。因此,我認為在這裡應該退一步,將這三個引數設定為4,4,10,看起來和上面5,5,10並沒有什麼不同,最大值還是10,但在實際使用中4,4,10釋放的記憶體速度會明顯比5,5,10快很多。

接下來就是MaxClient最大支援多少客戶端在同一時間連線伺服器,簡單說就是最大併發數支援,這個沒有特別需要說的。對於512M的vps你也別想你的站能承受百萬PV,使用預設的150已是超出負載的了。一般將ServerLimit和MaxClient設為一樣值即可。

最後就是MaxRequestsPerChild引數,一個程序在處理多少次之後退出,設定為0則是無限次,也就是說不會退出,那麼httpd程序也不會退出。那麼,你就等著你的vps當機重啟去吧。對於這個引數,我粗略地搜尋了一下,不少人推薦在1000次,也有100次的。據我的測試,對於記憶體只有512M的vps來說,該值設定在500以上都會很快佔滿記憶體,但不至少於當機。而觀察得知,一但記憶體佔滿,cpu的使用率幾乎變為0了。由此可知,當機了那什麼都幹不了了,還不如消耗多一點cpu資源避免,提高穩定性。所以,我最後的決定是將該值定義在30-40之間。這樣設定後,可以看出,記憶體釋放速度得到很大的提升,但也可以看到cpu也在頻繁上下跳動。這樣設定,即使記憶體佔滿,也能在最短時間恢復正常。

所以對於512MB的vps,apache(perfork模式)最後的優方配置為:

複製程式碼程式碼如下:

Timeout 30
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2
<IfModule prefork.c>
ServerLimit 150
StartServers      4
MinSpareServers   4
MaxSpareServers   10
MaxClients       150
MaxRequestsPerChild 40
</IfModule> 

這樣,我們的配置基本完成,進行負載測試即可。負載測試,我們使用ab測試,先宣告一點,是用你本地的虛擬機器去測試伺服器上的一個靜態頁面,而不是在伺服器上測試。之前,我就是這樣做,因為網速一樣,效果都是比較好的,但別人都是不同網速的,所以伺服器上測試是不準確的。

3、現在看看需要怎麼優化:
      連線數理論上是越大越好,但是得根據硬體,伺服器的CPU,記憶體,頻寬等因素,檢視當前的apache連線數:
     

ps aux | grep httpd | wc -l

      計算httpd 佔用記憶體的平均數:
     

ps aux | grep -v grep |awk ‘/httpd/{sum = $6;n };END{print sum/n}’

      這個只是做個參考。計算後要減去伺服器系統本身所需要的資源。
      比如記憶體2G,減去500M留給伺服器,還有1.5G,那麼可得到最大連線數:在8000左右。
      根據情況修改後的httpd.conf的prefork的配置後為:
    

複製程式碼程式碼如下:

<IfModule prefork.c>
     StartServers          5
     MinSpareServers       5
     MaxSpareServers      10
     ServerLimit         5500
     MaxClients          5000
     MaxRequestsPerChild   100
</IfModule>

這裡重點介紹下ServerLimit,必須放到MaxClients前,值要大於MaxClients。

4 重啟apache,再開啟網站看看是否還會有慢的問題了。

附註:可以使用以下命令找到httpd.conf檔案

find / -name httpd.conf

原文連結:http://blog.hehehehehe.cn/a/10242.htm