怎麼最佳化Apache網站

Apache最佳化

怎麼最佳化Apache網站

Apache是一個跨平臺的web伺服器,由於其簡單高效、穩定安全的特性,被廣泛應用於計算機技術的各個領域。現在,Apache憑藉其龐大的使用者數,已成為使用者數排名第一的web伺服器。

盡 管如此,在實際的生產環境中,我們仍然不可能直接使用預設配置的Apache來充當伺服器。畢竟,為了更充分合理地利用Apache伺服器,我們都應該根 據自己的實際需要對Apache的預設配置作出一些必要的調整。而針對Apache的最佳化配置過程中,修改Apache的最大併發連線數就顯得尤為重要。

在修改Apache的最大併發連線數之前,我們需要預先了解一些Apache的相關知識。

眾 所周知,Apache是一個跨平臺的、採用模組化設計的伺服器。為了應對不同的平臺和不同的環境產生的各種不同的需求,也為了在具體的平臺或環境下達到最佳的效果,Apache在web伺服器的基礎功能方面(埠繫結、接收請求等)也同樣採用了模組化設計,這個Apache的核心模組就叫做多路處理模組 (Multi-Processing Module,簡稱MPM)。

Apache針對不同的作業系統提供了多個不同的MPM模組,例如:mpm_beos、mpm_event、mpm_netware、mpmt_os2、mpm_prefork、mpm_winnt、mpm_worker。 如果條件允許,我們可以根據實際需求將指定的MPM模組編譯進我們自己的Apache中(Apache的原始碼是開放的,允許使用者自行編譯)。不過,如果在 編譯時我們沒有選擇,Apache將按照如下表格根據不同的作業系統自行選擇對應的MPM模組,這也是Apache針對不同平臺推薦使用的MPM模組。

怎麼最佳化Apache網站

mpm_event模組

可以看作是mpm_worker模組的一個變種,不過其具有實驗性質,一般不推薦使用。

當然,Apache在其官方網站上也提供了根據不同作業系統已經編譯好對應MPM模組的成品Apache。你可以進入Apache官方網站下載。

此外,如果我們想要知道某個Apache內部使用的是何種MPM模組,我們可以以命令列的方式進入Apache安裝目錄\bin,然後鍵入命令httpd -l,即可檢視到當前Apache內部使用的何種MPM模組。

使用httpd -l命令檢視編譯模組

由於在平常的開發工作中,BeOS、NetWare、OS/2等作業系統並不常見,這裡我們主要針對Windows和Unix/Linux作業系統上的MPM模組進行講解。在Windows和Unix/Linux作業系統上,MPM模組主要有mpm_winnt、mpm_prefork、mpm_worker三種。

mpm_prefork模組

mpm_prefork模組主要應用於Unix/Linux平臺的Apache伺服器,其主要工作方式是:當Apache伺服器啟動後,mpm_prefork模組會預先建立多個子程序(預設為5個),當接收到客戶端的請求後,mpm_prefork模組再將請求轉交給子程序處理,並且每個子程序同時只能用於處理單個請求。如果當前的請求數將超過預先建立的子程序數時,mpm_prefork模組就會建立新的子程序來處理額外的請求。Apache總是試圖保持一些備用的或者是空閒的子程序用於迎接即將到來的請求。這樣客戶端的請求就不需要在接收後等候子程序的產生。

由於在mpm_prefork模組中,每個請求對應一個子程序,因此其佔用的系統資源相對其他兩種模組而言較多。不過mpm_prefork模組的優點在於它的每個子程序都會獨立處理對應的單個請求,這樣,如果其中一個請求出現問題就不會影響到其他請求。同時,mpm_prefork模組可以應用於不具備執行緒安全的第三方模組(比如PHP的非執行緒安全版本),且在不支援執行緒除錯的平臺上易於除錯。此外,mpm_prefork模組還具有比mpm_worker模組更高的穩定性。

mpm_worker模組

mpm_worker模組也主要應用於Unix/Linux平臺的Apache伺服器,它可以看作是mpm_prefork模組的改進版。mpm_worker模組的工作方式與mpm_prefork模組類似。不過,由於處理相同請求的情況下,基於程序(例如mpm_prefork)比基於執行緒的處理方式佔用的系統資源要多。因此,與mpm_prefork模組不同的是,mpm_worker模組會讓每個子程序建立固定數量的服務執行緒和一個監聽執行緒,並讓每個服務執行緒來處理客戶端的請求,監聽執行緒用於監聽接入請求並將其傳遞給服務執行緒處理和應答。Apache總是試圖維持一個備用或是空閒的服務執行緒池。這樣,客戶端無須等待新執行緒或新程序的建立即可得到處理。

與mpm_prefork模組相比,mpm_worker模組可以進一步減少系統資源的開銷。再加上它也使用了多程序,每個程序又有多個執行緒,因此它與完全基於執行緒的處理方式相比,又增加了一定的穩定性。

mpm_winnt模組

mpm_winnt模組是專門針對Windows作業系統而最佳化設計的MPM模組。它只建立一個單獨的子程序,並在這個子程序中輪流產生多個執行緒來處理請求。

修改MPM模組配置

在對Apache的MPM模組具備一定了解後,我們就可以針對不同的MPM模組來修改Apache的最大併發連線數配置了。

1.啟用MPM模組配置檔案

在Apace安裝目錄/conf/extra目錄中有一個名為httpd-mpm。conf的配置檔案。該檔案主要用於進行MPM模組的相關配置。不過,在預設情況下,Apache的MPM模組配置檔案並沒有啟用。因此,我們需要在httpd。conf檔案中啟用該配置檔案,如下所示:

# Server-pool management (MPM specific)

Include conf/extra/httpd-mpm。conf (去掉該行前面的註釋符號“#”)

2.修改MPM模組配置檔案中的相關配置

在啟動MPM模組配置檔案後,我們就可以使用文字編輯器開啟該配置檔案,我們可以看到,在該配置檔案中有許多配置節點。

只有Apache使用對應MPM模組時,對應配置才會生效

此時,我們就需要根據當前Apache伺服器所使用的MPM模組,來修改對應節點下的引數配置。首先,我們來看看mpm_winnt模組下的預設配置:

#由於mpm_winnt模組只會建立1個子程序,因此這裡對單個子程序的引數設定就相當於對整個Apache的引數設定。

ThreadsPerChild 150 #推薦設定:小型網站=1000 中型網站=1000~2000 大型網站=2000~3500

MaxRequestsPerChild 0 #推薦設定:小=10000 中或大=20000~100000

對應的配置引數作用如下:

ThreadsPerChild:每個子程序的最大併發執行緒數。

MaxRequestsPerChild:每個子程序允許處理的請求總數。如果累計處理的請求數超過該值,該子程序將會結束(然後根據需要確定是否建立新的子程序),該值設為0表示不限制請求總數(子程序永不結束)。

該引數建議設為非零的值,可以帶來以下兩個好處:

可以防止程式中可能存在的記憶體洩漏無限進行下去,從而耗盡記憶體。

給程序一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動程序的數量。

注意:在以上涉及到統計請求數量的引數中,對於KeepAlive的連線,只有第一個請求會被計數。

接著,我們再來看看mpm_perfork模組和mpm_worker模組下的預設配置:

#mpm_perfork模組

StartServers 5 #推薦設定:小=預設 中=20~50 大=50~100

MinSpareServers 5 #推薦設定:與StartServers保持一致

MaxSpareServers 10 #推薦設定:小=20 中=30~80 大=80~120

MaxClients 150 #推薦設定:小=500 中=500~1500 大型=1500~3000

MaxRequestsPerChild 0 #推薦設定:小=10000 中或大=10000~500000

(此外,還需額外設定ServerLimit引數,該引數最好與MaxClients的值保持一致。)

# StartServers:數量的伺服器程序開始

# MinSpareServers:最小數量的伺服器程序,儲存備用

# MaxSpareServers:最大數量的伺服器程序,儲存備用

# MaxRequestWorkers:最大數量的伺服器程序允許開始

# MaxConnectionsPerChild:最大連線數的一個伺服器程序服務

prefork 控制程序在最初建立 “StartServers”個子程序後,為了滿足MinSpareServers設定的需要建立一個程序,等待一秒鐘,繼續建立兩 個,再等待一秒鐘, 繼續建立四個……如此按指數級增加建立的程序數,最多達到每秒32個,直到滿足MinSpareServers設定的值為止。這種模式 可以不必在請求到 來時再產生新的程序,從而減小了系統開銷以增加效能。MaxSpareServers設定了最大的空閒程序數,如果空閒程序數大於這個 值,Apache 會自動kill掉一些多餘程序。這個值不要設得過大,但如果設的值比MinSpareServers小,Apache會自動把其調整 為 MinSpareServers+1。如果站點負載較大,可考慮同時加大MinSpareServers和MaxSpareServers。

MaxRequestsPerChild設定的是每個 子程序可處理的請求數。每個子程序在處理了“MaxRequestsPerChild”個請求後將自 動銷燬。0意味著無限,即子程序永不銷燬。雖然預設 設為0可以使每個子程序處理更多的請求,但如果設成非零值也有兩點重要的好處:1、可防止意外的記憶體洩漏。2、在伺服器負載下降的時侯會自動減少子程序數。

因此,可根據伺服器的負載來調整這個值。

MaxRequestWorkers指令集同時將服務請求的數量上的限制。任何連線嘗試在MaxRequestWorkerslimit將通常被排隊,最多若干基於上ListenBacklog指令。

在apache2。3。13以前的版本MaxRequestWorkers被稱為MaxClients。

(MaxClients是這些指令中最為重要的一個,設定的是Apache可以同時處理的請求,是對Apache效能影響最大的引數。其預設值150是遠遠不夠的,如果請求總數已達到這個值(可透過 ps -ef|grep http|wc -l來確認),那麼後面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源還剩下很多而HTTP訪問卻很 慢的主要原因。雖然理論上這個值越大,可以處理的請求就越多,但Apache預設的限制不能大於256。)

#mpm_worker模組

StartServers 2 #推薦設定:小=預設 中=3~5 大=5~10

MaxClients 150 #推薦設定:小=500 中=500~1500 大型=1500~3000

MinSpareThreads 25 #推薦設定:小=預設 中=50~100 大=100~200

MaxSpareThreads 75 #推薦設定:小=預設 中=80~160 大=200~400

ThreadsPerChild 25 #推薦設定:小=預設 中=50~100 大型=100~200

MaxRequestsPerChild 0 #推薦設定:小=10000 中或大=10000~50000

(此外,如果MaxClients/ThreadsPerChild大於16,還需額外設定ServerLimit引數,ServerLimit必須大於等於 MaxClients/ThreadsPerChild 的值。)

對應的配置引數作用如下:

StartServers:啟動Apache時建立的子程序數。

MinSpareServers:處於空閒狀態的最小子程序數。

所謂空閒子程序是指沒有正在處理請求的子程序。如果當前空閒子程序數少於MinSpareServers,那麼Apache將以最大每秒一個的速度產生新的子程序。只有在非常繁忙機器上才需要調整這個引數。此值不宜過大。

l MaxSpareServers:處於空閒狀態的最大子程序數。

只有在非常繁忙機器上才需要調整這個引數。此值不宜過大。如果你將該指令的值設定為比MinSpareServers小,Apache將會自動將其修改成MinSpareServers+1。

MaxClients:允許同時連線的最大請求數量。

任何超過MaxClients限制的請求都將進入等待佇列,直到達到ListenBacklog指令限制的最大值為止。

對於非執行緒型的MPM(也就是mpm_prefork),MaxClients表示可以用於處理客戶端請求的最大子程序數量,預設值是256。要增大這個值,你必須同時增大ServerLimit。

對於執行緒型或者混合型的MPM(也就是mpm_beos或mpm_worker),MaxClients表示可以用於處理客戶端請求的最大執行緒數量。執行緒型的mpm_beos的預設值是50。對於混合型的MPM預設值是16(ServerLimit)乘以25(ThreadsPerChild)的結果。因此要將MaxClients增加到超過16個程序才能提供的時候,你必須同時增加ServerLimit的值。

MinSpareThreads:處於空閒狀態的最小執行緒數。

不同的MPM對這個指令的處理是不一樣的:

mpm_worker的預設值是75。這個MPM將基於整個伺服器監視空閒執行緒數。如果伺服器中總的空閒執行緒數太少,子程序將產生新的空閒執行緒。mpm_netware的預設值是10。既然這個MPM只執行單獨一個子程序,此MPM當然亦基於整個伺服器監視空閒執行緒數。mpm_beos和mpmt_os2的工作方式與mpm_netware差不多,mpm_beos的預設值是1;mpmt_os2的預設值是5。

MaxSpareThreads:處於空閒狀態的最大執行緒數。

不同的MPM對這個指令的處理是不一樣的:

mpm_worker的預設值是250。這個MPM將基於整個伺服器監視空閒執行緒數。如果伺服器中總的空閒執行緒數太多,子程序將殺死多餘的空閒執行緒。mpm_netware的預設值是100。既然這個MPM只執行單獨一個子程序,此MPM當然亦基於整個伺服器監視空閒執行緒數。mpm_beos和mpmt_os2的工作方式與mpm_netware差不多,mpm_beos的預設值是50;mpmt_os2的預設值是10。

備註:ServerLimit表示Apache允許建立的最大程序數。 值得注意的是,Apache在編譯時內部有一個硬限制ServerLimit 20000(對於mpm_prefork模組為ServerLimit 200000)。你不能超越這個限制。

使用這個指令時要特別當心。如果將ServerLimit設定成一個高出實際需要許多的值,將會有過多的共享記憶體被分配。如果將ServerLimit和MaxClients設定成超過系統的處理能力,Apache可能無法啟動,或者系統將變得不穩定。

注意:在配置相關引數時,請先保證伺服器具備足夠的硬體效能(例如:CPU、記憶體等)。 如果發現自啟動後,隨著伺服器的執行時間增加,伺服器的記憶體佔用也隨之增加,可能是程式中出現記憶體洩露,請向下調整引數MaxRequestsPerChild的值以降低記憶體洩露帶來的影響,然後儘快找出程式中的問題之所在。

案例:把apache的最大併發數配置成1000個

1。首先確認apache的mpm方式

cmd>httpd。exe -l 可以看到是什麼模式了

這裡就看mpm_xxx。c這個xxx就是那個了

2。修改httpd。conf檔案

搜尋mpm,找到 Server-pool management(MPM specific)

去掉# Include conf/extra/httpd-mpm。conf

3。修改conf/extra/httpd-mpm。conf檔案

prefork模式就修改這裡

StartServers 5 # 預先開啟的程序

MinSpareServers 5 # 最小預留5個

MaxSpareServers 10 # 最大留10

MaxClients 150 # 最多併發多少個 *

MaxRequestsPerChild 0 # 最多請求多少次 0不限制

winnt模式

ThreadsPerChild 150 # 最大併發數 *

MaxRequestsPerChild 0 # 最多處理多少次請求 0不限制

修改後面有*的那個欄位的數值然後重新啟動apache

說明:配置到多大,不一定就可能支撐這麼大的併發,考慮到本身apache所在的機器硬體效能(如:記憶體,CPU,硬碟IO)

系統是linux/unix,配置perfork

StartServers 5

MinSpareServers 5

MaxSpareServers 10

MaxClients 150 *#併發量

MaxRequestsPerChild 0

給大家一個合理的建議配置,對大部分網站,中型網站配置

StartServers 5 # 預先啟動

MinSpareServers 5

MaxSpareServers 10 # 最大空閒程序

ServerLimit 1500 *# 用於修改apache程式設計引數

MaxClients 1000 *# 最大併發數

MaxRequestsPerChild 0

注:apache2。2以後才有的ServerLimit這個引數,其中ServerLimit數值大於MaxClients數值

如果網站的pv值 百萬

ServerLimit 2500 *# 用於修改apache程式設計引數

MaxClients 2000 *# 最大併發數

注:調到這就是極限了,要是網站訪問還是大,哪就要增加apache伺服器了

最佳化配置10條建議:

1。控制MaxClients的設定,以避免伺服器產生太多的子程序而發生交換。

程序間的資料交換會佔用很大記憶體,資料交換產生的滯後使使用者總感覺”不夠快”,所以使用者就可能去按”停止”和”重新整理”,從而帶來更大的負載。一般建議小網站將MaxClients設定為12~24。

2。選擇更好的硬體,CPU、記憶體、硬碟等等

這句很雞肋啦,如果有更多的銀子,誰不願意換更好的呢?^_^

3。定期更新作業系統,打上系統補丁;如果你的作業系統支援sendfile()系統呼叫,則務必安裝帶有此功能的版本或補丁

在支援sendfile的系統中,Apache2可以更快地傳送靜態內容而且佔用較少的CPU時間。

4。HostnameLookups設定為off

儘量較少DNS查詢的次數。如果你使用了任何”Allow from domain”或”Deny from domain”指令(也就是domain使用的是主機名而不是IP地址),則代價是要進行兩次DNS查詢(一次正向和一次反向,以確認沒有作假)。所以,為了得到最高的效能,應該避免使用這些指令(不用域名而用IP地址也是可以的)。

5。為Directory加上FollowSymLinks

如果網站空間中沒有使用 Options FollowSymLinks ,Apache就必須執行額外的系統呼叫以驗證符號連線。例如:在請求”/index。html”時,Apache將對”/www”、”/www/htdocs”、”/www/htdocs/index。html”執行lstat()呼叫。而且lstat()的執行結果不被快取,因此對每一個請求都要執行一次。

6。將AllowOverride設定為None

對於使用虛擬主機的朋友可能會覺得不方便,這樣設定將會使。htaccess中的設定失效,如果實在需要,並且在有條件的情況下,請在conf配置檔案中直接寫入rewrite規則

7。禁用內容協商

儘管在實踐中,內容協商的好處大於效能的損失,如果你很在意那一點點的效能損失,則可以禁止使用內容協商。但是仍然有個方法可以提高伺服器的速度,就是不要使用萬用字元。

8。MaxRequestsPerChild設定為非0以防止記憶體洩漏

MaxRequestsPerChild用於控制Apache子程序在何時銷燬,預設為0,代表永不銷燬子程序,這可能會存在記憶體洩漏的風險,建議設定為10000

9。KeepAlive與KeepAliveTimeOut

如果你使用的使mpm_prefork模式(Apache預設安裝),那麼建議你將KeepAlive設定為off;因為,開啟keepalive會為每個客戶端建立一個連線,prefork不會建立執行緒,估計100個使用者同時訪問你的網站,Apache就會掛了~,如果你實在想開啟,那麼請將KeepAliveTimeOut 時間設定更短些,例如5,預設是60秒呢

10。不要靜態編譯Apache

儘管會有很多人和你說靜態編譯的好處,同時,你自己也想自己編譯一把,以體驗樂趣~但是,將模組已靜態方式編譯進Apache絕對不是一個好選擇,尤其是對於缺銀子的站長們來說,一個配置不當,Apache會在啟動時就佔用光你所有的記憶體,最後拖垮伺服器~