Apache是一個跨平臺的web服務器,因爲其簡單高效、穩定安全的特性,被普遍應用於計算機技術的各個領域。如今,Apache憑藉其龐大的用戶數,已成爲用戶數排名第一的web服務器。linux
盡 管如此,在實際的生產環境中,咱們仍然不可能直接使用默認配置的Apache來充當服務器。畢竟,爲了更充分合理地利用Apache服務器,咱們都應該根 據本身的實際須要對Apache的默認配置做出一些必要的調整。而針對Apache的優化配置過程當中,修改Apache的最大併發鏈接數就顯得尤其重要。web
在修改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模塊。windows
不一樣操做系統上默認的MPM模塊 | ||
---|---|---|
操做系統 | MPM模塊 | 描述 |
Windows | mpm_winnt | 不用介紹了吧:) |
Unix/Linux | mpm_prefork | 不用介紹了吧:) |
BeOS | mpm_beos | 由Be公司開發的一種多媒體操做系統,官方版已中止更新。 |
Netware | mpm_netware | 由NOVELL公司推出的一種網絡操做系統 |
OS/2 | mpmt_os2 | 一種最初由微軟和IBM共同開發的操做系統,現由IBM單獨開發(微軟放棄OS/2,轉而開發Windows) |
mpm_event模塊能夠看做是mpm_worker模塊的一個變種,不過其具備實驗性質,通常不推薦使用。安全
固然,Apache在其官方網站上也提供了根據不一樣操做系統已經編譯好對應MPM模塊的成品Apache。你能夠點擊此處進入Apache官方網站下載。服務器
此外,若是咱們想要知道某個Apache內部使用的是何種MPM模塊,咱們能夠以命令行的方式進入Apache安裝目錄\bin
,而後鍵入命令httpd -l
,便可查看到當前Apache內部使用的何種MPM模塊。網絡
因爲在日常的開發工做中,BeOS、NetWare、OS/2等操做系統並不常見,這裏咱們主要針對Windows和Unix/Linux操做系統上的MPM模塊進行講解。在Windows和Unix/Linux操做系統上,MPM模塊主要有mpm_winnt
、mpm_prefork
、mpm_worker
三種。編輯器
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
模塊也主要應用於Unix/Linux平臺的Apache服務器,它能夠看做是mpm_prefork
模塊的改進版。mpm_worker
模塊的工做方式與mpm_prefork
模塊相似。不過,因爲處理相同請求的狀況下,基於進程(例如mpm_prefork
)比基於線程的處理方式佔用的系統資源要多。所以,與mpm_prefork
模塊不一樣的是,mpm_worker
模塊會讓每一個子進程建立固定數量的服務線程和一個監聽線程,並讓每一個服務線程來處理客戶端的請求,監聽線程用於監聽接入請求並將其傳遞給服務線程處理和應答。Apache老是試圖維持一個備用或是空閒的服務線程池。這樣,客戶端無須等待新線程或新進程的創建便可獲得處理。
與mpm_prefork
模塊相比,mpm_worker
模塊能夠進一步減小系統資源的開銷。再加上它也使用了多進程,每一個進程又有多個線程,所以它與徹底基於線程的處理方式相比,又增長了必定的穩定性。
mpm_winnt
模塊是專門針對Windows操做系統而優化設計的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模塊配置文件後,咱們就可使用文本編輯器打開該配置文件,咱們能夠看到,在該配置文件中有許多<IfModule>
配置節點,以下圖所示:
此時,咱們就須要根據當前Apache服務器所使用的MPM模塊,來修改對應<IfModule>
節點下的參數配置。首先,咱們來看看mpm_winnt
模塊下的默認配置:
#因爲mpm_winnt模塊只會建立1個子進程,所以這裏對單個子進程的參數設置就至關於對整個Apache的參數設置。
<IfModule mpm_winnt_module>
ThreadsPerChild 150 #推薦設置:小型網站=1000 中型網站=1000~2000 大型網站=2000~3500 MaxRequestsPerChild 0 #推薦設置:小=10000 中或大=20000~100000 </IfModule>
對應的配置參數做用以下:
該參數建議設爲非零的值,能夠帶來如下兩個好處:
注意:在以上涉及到統計請求數量的參數中,對於KeepAlive的鏈接,只有第一個請求會被計數。
接着,咱們再來看看mpm_perfork
模塊和mpm_worker
模塊下的默認配置:
#mpm_perfork模塊
<IfModule mpm_prefork_module>
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的值保持一致。) </IfModule>
# StartServers: 數量的服務器進程開始
# MinSpareServers: 最小數量的服務器進程,保存備用
# MaxSpareServers: 最大數量的服務器進程,保存備用
# MaxRequestWorkers: 最大數量的服務器進程容許開始
# MaxConnectionsPerChild: 最大鏈接數的一個服務器進程服務
prefork 控制進程在最初創建 「StartServers」個子進程後,爲了知足MinSpareServers設置的須要建立一個進程,等待一秒鐘,繼續建立兩 個,再等待一秒鐘, 繼續建立四個……如此按指數級增長建立的進程數,最多達到每秒32個,直到知足MinSpareServers設置的值爲止。這種模式 能夠沒必要在請求到 來時再產生新的進程,從而減少了系統開銷以增長性能。MaxSpareServers設置了最大的空閒進程數,若是空閒進程數大於這個 值,Apache 會自動kill掉一些多餘進程。這個值不要設得過大,但若是設的值比MinSpareServers小,Apache會自動把其調整 爲 MinSpareServers+1。若是站點負載較大,可考慮同時加大MinSpareServers和MaxSpareServers。
MaxRequestsPerChild設置的是每一個 子進程可處理的請求數。每一個子進程在處理了「MaxRequestsPerChild」個請求後將自 動銷燬。0意味着無限,即子進程永不銷燬。雖然缺省 設爲0可使每一個子進程處理更多的請求,但若是設成非零值也有兩點重要的好處:
一、可防止意外的內存泄 漏。二、在服務器負載降低的時侯會自動減小子進程數。
所以,可根據服務器的負載來調整這個值。
MaxRequestWorkers指令集同時將服務請求的數量上的限制。任何鏈接嘗試在MaxRequestWorkerslimit將一般被排隊,最多若干基於上ListenBacklog指令。
在apache2.3.13之前的版本MaxRequestWorkers被稱爲MaxClients 。
(MaxClients是這些指令中最爲重要的一個,設定的是 Apache能夠同 時處理的請求,是對Apache性能影響最大的參數。其缺省值150是遠遠不夠的,若是請求總數已達到這個值(可經過 ps -ef|grep http|wc -l來確認),那麼後面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源還剩下不少而HTTP訪問卻很 慢的主要緣由。雖然理論上這個值越大,能夠 處理的請求就越多,但Apache默認的限制不能大於256。)
#mpm_worker模塊
<IfModule mpm_worker_module>
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 的值。) </IfModule>
對應的配置參數做用以下:
所謂空閒子進程是指沒有正在處理請求的子進程。若是當前空閒子進程數少於MinSpareServers
,那麼Apache將以最大每秒一個的速度產生新的子進程。只有在很是繁忙機器上才須要調整這個參數。此值不宜過大。
只有在很是繁忙機器上才須要調整這個參數。此值不宜過大。若是你將該指令的值設置爲比MinSpareServers
小,Apache將會自動將其修改爲MinSpareServers+1
。
任何超過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
的值。
不一樣的MPM對這個指令的處理是不同的:
mpm_worker
的默認值是75。這個MPM將基於整個服務器監視空閒線程數。若是服務器中總的空閒線程數太少,子進程將產生新的空閒線程。mpm_netware
的默認值是10。既然這個MPM只運行單獨一個子進程,此MPM固然亦基於整個服務器監視空閒線程數。mpm_beos
和mpmt_os2
的工做方式與mpm_netware
差很少,mpm_beos
的默認值是1;mpmt_os2
的默認值是5。
不一樣的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
的值以下降內存泄露帶來的影響,而後儘快找出程序中的問題之所在。
本文轉自:http://www.365mini.com/page/apache-concurrency-configuration.htm
另外一篇:
如何配置apache最大的併發數
MPM(多路處理模塊)
常見:
1.perfork 預處理進程方式
2.worker 工做者模式
3.winnt 在windows使用
案例:把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模式就修改這裏
<IfModule mpm_prefork_module>
StartServers 5 # 預先開啓的進程
MinSpareServers 5 # 最小預留5個
MaxSpareServers 10 # 最大留10
MaxClients 150 # 最多併發多少個 *
MaxRequestsPerChild 0 # 最多請求多少次 0不限制
</IfModule>
winnt模式
<IfModule mpm_winnt_module>
ThreadsPerChild 150 # 最大併發數 *
MaxRequestsPerChild 0 # 最多處理多少次請求 0不限制
</IfModule>
修改後面有*的那個字段的數值而後從新啓動apache
說明:配置到多大,不必定就可能支撐這麼大的併發,考慮到自己apache所在的機器硬件性能(如:內存,CPU,硬盤IO)
系統是linux/unix,配置perfork
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150 *#併發量
MaxRequestsPerChild 0
</IfModule>
給你們一個合理的建議配置,對大部份網站,中型網站配置
<IfModule mpm_prefork_module>
StartServers 5 # 預先啓動
MinSpareServers 5
MaxSpareServers 10 # 最大空閒進程
ServerLimit 1500 *# 用於修改apache編程參數
MaxClients 1000 *# 最大併發數
MaxRequestsPerChild 0
</IfModule>
注:apache2.2之後纔有的ServerLimit這個參數,其中ServerLimit數值大於MaxClients數值
若是網站的pv值 百萬
ServerLimit 2500 *# 用於修改apache編程參數
MaxClients 2000 *# 最大併發數
注:調到這就是極限了,要是網站訪問仍是大,哪就要增長apache服務器了
原文:http://www.tuicool.com/articles/RJBzmai
統計80端口鏈接數
netstat -ant | grep -i 80 | wc -l
統計httpd協議鏈接數
ps -ef | grep httpd | wc -l