日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux apache两种工作模式详解

發(fā)布時(shí)間:2025/5/22 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux apache两种工作模式详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

apache兩種工作模式詳解
剛接觸這兩個(gè)配置時(shí)很迷糊,全部開(kāi)啟或全部注釋沒(méi)有幾多變化。今天搜索到這么一篇講得還不錯(cuò)的文章,看了幾篇,還是不能完全記住,做一個(gè)收藏。
空閑子進(jìn)程:是指沒(méi)有正在處理請(qǐng)求的子進(jìn)程。
1、prefork.c模塊(一個(gè)非線程型的、預(yù)派生的MPM)
??? prefork MPM 使用多個(gè)子進(jìn)程,每個(gè)子進(jìn)程只有一個(gè)線程。每個(gè)進(jìn)程在某個(gè)確定的時(shí)間只能維持一個(gè)連接。在大多數(shù)平臺(tái)上,Prefork MPM在效率上要比Worker MPM要高,但是內(nèi)存使用大得多。prefork的無(wú)線程設(shè)計(jì)在某些情況下將比worker更有優(yōu)勢(shì):他能夠使用那些沒(méi)有處理好線程安全的第三方模塊,并且對(duì)于那些線程調(diào)試?yán)щy的平臺(tái)而言,他也更容易調(diào)試一些。
ServerLimit?? 20000
StartServers?? 5
MinSpareServers?? 5
MaxSpareServers?? 10
MaxClients?? 1000
MaxRequestsPerChild 0


ServerLimit???? 2000
//默認(rèn)的MaxClient最大是256個(gè)線程,假如想配置更大的值,就的加上ServerLimit這個(gè)參數(shù)。20000是ServerLimit這個(gè)參數(shù)的最大值。假如需要更大,則必須編譯apache,此前都是無(wú)需重新編譯Apache。
生效前提:必須放在其他指令的前面

StartServers?? 5
//指定服務(wù)器啟動(dòng)時(shí)建立的子進(jìn)程數(shù)量,prefork默認(rèn)為5。

MinSpareServers?? 5
//指定空閑子進(jìn)程的最小數(shù)量,默認(rèn)為5。假如當(dāng)前空閑子進(jìn)程數(shù)少于MinSpareServers ,那么Apache將以最大每秒一個(gè)的速度產(chǎn)生新的子進(jìn)程。此參數(shù)不要設(shè)的太大。

MaxSpareServers?? 10
// 配置空閑子進(jìn)程的最大數(shù)量,默認(rèn)為10。假如當(dāng)前有超過(guò)MaxSpareServers數(shù)量 的空閑子進(jìn)程,那么父進(jìn)程將殺死多余的子進(jìn)程。此參數(shù)不要設(shè)的太大。假如您將該指令的值配置為比MinSpareServers小,Apache將會(huì)自動(dòng)將其修改成"MinSpareServers+1"。

MaxClients?? 256
//限定同一時(shí)間客戶端最大接入請(qǐng)求的數(shù)量(單個(gè)進(jìn)程并發(fā)線程數(shù)),默認(rèn)為256。任何超過(guò)MaxClients限制的請(qǐng)求都將進(jìn)入等候隊(duì)列,一旦一個(gè)鏈接被釋放,隊(duì)列中的請(qǐng)求將得到服務(wù)。要增大這個(gè)值,您必須同時(shí)增大ServerLimit 。
MaxRequestsPerChild 10000

//每個(gè)子進(jìn)程在其生存期內(nèi)允許伺服的最大請(qǐng)求數(shù)量,默認(rèn)為10000.到達(dá)MaxRequestsPerChild的限制后,子進(jìn)程將會(huì)結(jié)束。假如MaxRequestsPerChild為"0",子進(jìn)程將永遠(yuǎn)不會(huì)結(jié)束。
將MaxRequestsPerChild配置成非零值有兩個(gè)好處:
1.能夠防止(偶然的)內(nèi)存泄漏無(wú)限進(jìn)行,從而耗盡內(nèi)存。
2.給進(jìn)程一個(gè)有限壽命,從而有助于當(dāng)服務(wù)器負(fù)載減輕的時(shí)候減少活動(dòng)進(jìn)程的數(shù)量。
工作方式:
一個(gè)單獨(dú)的控制進(jìn)程(父進(jìn)程)負(fù)責(zé)產(chǎn)生子進(jìn)程,這些子進(jìn)程用于監(jiān)聽(tīng)請(qǐng)求并作出應(yīng)答。Apache總是試圖保持一些備用的 (spare)或是空閑的子進(jìn)程用于迎接即將到來(lái)的請(qǐng)求。這樣客戶端就無(wú)需在得到服務(wù)前等候子進(jìn)程的產(chǎn)生。在Unix系統(tǒng)中,父進(jìn)程通常以root身份運(yùn)行以便邦定80端口,而 Apache產(chǎn)生的子進(jìn)程通常以一個(gè)低特權(quán)的用戶運(yùn)行。User和Group指令用于配置子進(jìn)程的低特權(quán)用戶。運(yùn)行子進(jìn)程的用戶必須要對(duì)他所服務(wù)的內(nèi)容有讀取的權(quán)限,但是對(duì)服務(wù)內(nèi)容之外的其他資源必須擁有盡可能少的權(quán)限。


2、worker.c模塊(支持混合的多線程多進(jìn)程的多路處理模塊)
??? worker MPM 使用多個(gè)子進(jìn)程,每個(gè)子進(jìn)程有多個(gè)線程。每個(gè)線程在某個(gè)確定的時(shí)間只能維持一個(gè)連接。通常來(lái)說(shuō),在一個(gè)高流量的HTTP服務(wù)器上,Worker MPM是個(gè)比較好的選擇,因?yàn)閃orker MPM的內(nèi)存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,假如一個(gè)線程崩潰,整個(gè)進(jìn)程就會(huì)連同其任何線程一起"死掉".由于線程共享內(nèi)存空間,所以一個(gè)程式在運(yùn)行時(shí)必須被系統(tǒng)識(shí)別為"每個(gè)線程都是安全的"。
ServerLimit?? 50
ThreadLimit?? 200
StartServers?? 5
MaxClients?? 5000
MinSpareThreads?? 25
MaxSpareThreads?? 500
ThreadsPerChild?? 100
MaxRequestsPerChild 0

ServerLimit 16
//服務(wù)器允許配置的進(jìn)程數(shù)上限。這個(gè)指令和ThreadLimit結(jié)合使用配置了MaxClients最大允許配置的數(shù)值。任何在重啟期間對(duì)這個(gè)指令的改變都將被忽略,但對(duì)MaxClients的修改卻會(huì)生效。

ThreadLimit 64
//每個(gè)子進(jìn)程可配置的線程數(shù)上限。這個(gè)指令配置了每個(gè)子進(jìn)程可配置的線程數(shù)ThreadsPerChild上限。任何在重啟期間對(duì)這個(gè)指令的改變都將被忽略,但對(duì)ThreadsPerChild的修改卻會(huì)生效。默認(rèn)值是"64".

StartServers 3
//服務(wù)器啟動(dòng)時(shí)建立的子進(jìn)程數(shù),默認(rèn)值是"3"。

MinSpareThreads 75
//最小空閑線程數(shù),默認(rèn)值是"75"。這個(gè)MPM將基于整個(gè)服務(wù)器監(jiān)控空閑線程數(shù)。假如服務(wù)器中總的空閑線程數(shù)太少,子進(jìn)程將產(chǎn)生新的空閑線程。

MaxSpareThreads 250
// 配置最大空閑線程數(shù)。默認(rèn)值是"250"。這個(gè)MPM將基于整個(gè)服務(wù)器監(jiān)控空閑線程數(shù)。假如服 務(wù)器中總的空閑線程數(shù)太多,子進(jìn)程將殺死多余的空閑線程。MaxSpareThreads的取值范圍是有限制的。Apache將按照如下限制自動(dòng)修正您配置的值:worker需要其大于等于

MinSpareThreads加上ThreadsPerChild的和MaxClients 400
//允許同時(shí)伺服的最大接入請(qǐng)求數(shù)量(最大線程數(shù)量)。任何超過(guò)MaxClients限制的請(qǐng)求都將進(jìn)入等候 隊(duì)列。默認(rèn)值是"400",16 (ServerLimit)乘以25(ThreadsPerChild)的結(jié)果。因此要增加MaxClients的時(shí)候,您必須同時(shí)增加 ServerLimit的值。

ThreadsPerChild 25
//每個(gè)子進(jìn)程建立的常駐的執(zhí)行線程數(shù)。默認(rèn)值是25。子進(jìn)程在啟動(dòng)時(shí)建立這些線程后就不再建立新的線程了。

MaxRequestsPerChild 0
//配置每個(gè)子進(jìn)程在其生存期內(nèi)允許伺服的最大請(qǐng)求數(shù)量。到達(dá)MaxRequestsPerChild的限制后,子進(jìn)程將會(huì)結(jié)束。假如MaxRequestsPerChild為"0",子進(jìn)程將永遠(yuǎn)不會(huì)結(jié)束。
將MaxRequestsPerChild配置成非零值有兩個(gè)好處:
1.能夠防止(偶然的)內(nèi)存泄漏無(wú)限進(jìn)行,從而耗盡內(nèi)存。
2.給進(jìn)程一個(gè)有限壽命,從而有助于當(dāng)服務(wù)器負(fù)載減輕的時(shí)候減少活動(dòng)進(jìn)程的數(shù)量。
注意
對(duì)于KeepAlive鏈接,只有第一個(gè)請(qǐng)求會(huì)被計(jì)數(shù)。事實(shí)上,他改變了每個(gè)子進(jìn)程限制最大鏈接數(shù)量的行為。
工作方式:
每個(gè)進(jìn)程能夠擁有的線程數(shù)量是固定的。服務(wù)器會(huì)根據(jù)負(fù)載情況增加或減少進(jìn)程數(shù)量。一個(gè)單獨(dú)的控制進(jìn)程(父進(jìn)程)負(fù)責(zé)子進(jìn)程的建立。每個(gè)子進(jìn)程能夠建立ThreadsPerChild數(shù)量的服務(wù)線程和一個(gè)監(jiān)聽(tīng)線程,該監(jiān)聽(tīng)線程監(jiān)聽(tīng)接入請(qǐng)求并將其傳遞給服務(wù)線程處理和應(yīng)答。Apache總是試圖維持一個(gè)備用(spare)或是空閑的服務(wù)線程池。這樣,客戶端無(wú)須等待新線程或新進(jìn)程的建立即可得到處理。在Unix中,為了能夠綁定80端口,父進(jìn)程一般都是以root身份啟動(dòng),隨后,Apache以較低權(quán)限的用戶建立子進(jìn)程和線程。User和Group指令用于配置Apache子進(jìn)程的權(quán)限。雖然子進(jìn)程必須對(duì)其提供的內(nèi)容擁有讀權(quán)限,但應(yīng)該盡可能給予他較少的特權(quán)。另外,除非使用了suexec ,否則,這些指令配置的權(quán)限將被CGI腳本所繼承。

公式:
ThreadLimit >= ThreadsPerChild
MaxClients = MinSpareThreads+ThreadsPerChild

硬限制:
ServerLimi和ThreadLimit這兩個(gè)指令決定了活動(dòng)子進(jìn)程數(shù)量和每個(gè)子進(jìn)程中線程數(shù)量的硬限制。要想改變這個(gè)硬限制必須完全停止服務(wù)器然后再啟動(dòng)服務(wù)器(直接重啟是不行的)。
Apache在編譯ServerLimit時(shí)內(nèi)部有一個(gè)硬性的限制,您不能超越這個(gè)限制。
prefork MPM最大為"ServerLimit 200000"
其他MPM(包括work MPM)最大為"ServerLimit 20000
Apache在編譯ThreadLimit時(shí)內(nèi)部有一個(gè)硬性的限制,您不能超越這個(gè)限制。
mpm_winnt是"ThreadLimit 15000"
其他MPM(包括work prefork)為"ThreadLimit 20000
注意
使用ServerLimit和ThreadLimit時(shí)要特別當(dāng)心。假如將ServerLimit和ThreadLimit配置成一個(gè)高出實(shí)際需要許多的值,將會(huì)有過(guò)多的共享內(nèi)存被分配。當(dāng)配置成超過(guò)系統(tǒng)的處理能力,Apache可能無(wú)法啟動(dòng),或系統(tǒng)將變得不穩(wěn)定。

查看apache的并發(fā)請(qǐng)求數(shù)及其TCP連接狀態(tài):

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

?

?

?

理解和優(yōu)化apache并發(fā)控制參數(shù)prefork

一個(gè)apache有l(wèi)inux下的并發(fā)不是很高的,大約到3K的樣子(其實(shí)處理的http的請(qǐng)求可能只有300/s),普通的服務(wù)器都會(huì)不同程度的出現(xiàn)問(wèn)題.apache有關(guān)并發(fā)控制主要是 prefork和worker二個(gè)其中一個(gè)來(lái)控制.我們可以使用httpd -l來(lái)確定當(dāng)前使用的MPM是prefork.c,還是Worker.c.下面是apache中有關(guān)prefork的配置.下面是我優(yōu)化過(guò)的參數(shù).

<IfModule prefork.c>

#有這個(gè)參數(shù)就不必像apache1一樣修改源碼才能修改256客戶數(shù)的限制,聽(tīng)講要放到最前面才會(huì)生效,2000是這個(gè)參數(shù)的最大值

ServerLimit 2000

#指定服務(wù)器啟動(dòng)時(shí)建立的子進(jìn)程數(shù)量,prefork默認(rèn)為5。

StartServers 25

#指定空閑子進(jìn)程的最小數(shù)量,默認(rèn)為5。如果當(dāng)前空閑子進(jìn)程數(shù)少于MinSpareServers ,那么Apache將以最大每秒一個(gè)的速度產(chǎn)生新的子進(jìn)程。此參數(shù)不要設(shè)的太大。

MinSpareServers 25

#設(shè)置空閑子進(jìn)程的最大數(shù)量,默認(rèn)為10。如果當(dāng)前有超過(guò)MaxSpareServers數(shù)量的空閑子進(jìn)程,那么父進(jìn)程將殺死多余的子進(jìn)程。此參數(shù) 不要設(shè)的太大。如果你將該指令的值設(shè)置為比MinSpareServers小,Apache將會(huì)自動(dòng)將其修改成"MinSpareServers+1"。

MaxSpareServers 50

#限定同一時(shí)間客戶端最大接入請(qǐng)求的數(shù)量(單個(gè)進(jìn)程并發(fā)線程數(shù)),默認(rèn)為256。任何超過(guò)MaxClients限制的請(qǐng)求都將進(jìn)入等候隊(duì)列,一旦一個(gè)鏈接被釋放,隊(duì)列中的請(qǐng)求將得到服務(wù)。要增大這個(gè)值,你必須同時(shí)增大ServerLimit 。

MaxClients 2000

#每個(gè)子進(jìn)程在其生存期內(nèi)允許伺服的最大請(qǐng)求數(shù)量,默認(rèn)為10000.到達(dá)MaxRequestsPerChild的限制后,子進(jìn)程將會(huì)結(jié)束。如果MaxRequestsPerChild為"0",子進(jìn)程將永遠(yuǎn)不會(huì)結(jié)束。

MaxRequestsPerChild 10000

</IfModule>

將MaxRequestsPerChild設(shè)置成非零值有兩個(gè)好處:

1.可以防止(偶然的)內(nèi)存泄漏無(wú)限進(jìn)行,從而耗盡內(nèi)存。

2.給進(jìn)程一個(gè)有限壽命,從而有助于當(dāng)服務(wù)器負(fù)載減輕的時(shí)候減少活動(dòng)進(jìn)程的數(shù)量。

工作方式:

一個(gè)單獨(dú)的控制進(jìn)程(父進(jìn)程)負(fù)責(zé)產(chǎn)生子進(jìn)程,這些子進(jìn)程用于監(jiān)聽(tīng)請(qǐng)求并作出應(yīng)答。Apache總是試圖保持一些備用的 (spare)或者是空閑的子進(jìn)程用于迎接即將到來(lái)的請(qǐng)求。這樣客戶端就不需要在得到服務(wù)前等候子進(jìn)程的產(chǎn)生。在Unix系統(tǒng)中,父進(jìn)程通常以root身 份運(yùn)行以便邦定80端口,而 Apache產(chǎn)生的子進(jìn)程通常以一個(gè)低特權(quán)的用戶運(yùn)行。User和Group指令用于設(shè)置子進(jìn)程的低特權(quán)用戶。運(yùn)行子進(jìn)程的用戶必須要對(duì)它所服務(wù)的內(nèi)容有 讀取的權(quán)限,但是對(duì)服務(wù)內(nèi)容之外的其他資源必須擁有盡可能少的權(quán)限。

對(duì)上面的有些值,一定要記的不是越大越好.這個(gè)需要經(jīng)過(guò)幾次嘗試和出錯(cuò)之后才能選好要使用的值(不同的硬件處理水平不一樣)。最重要的值是maxclient允許足夠多的 工作進(jìn)程,同時(shí)又不會(huì)導(dǎo)致服務(wù)器進(jìn)行過(guò)度的交換(死機(jī))。如果傳入的請(qǐng)求超出處理能力而讓服務(wù)器當(dāng)?shù)舻脑?#xff0c;那么至少滿足此值的那些請(qǐng)求會(huì)得到服務(wù),其他請(qǐng)求被阻塞這樣會(huì)更加好。

?

我們調(diào)優(yōu)常常要查看httpd進(jìn)程數(shù)(即prefork模式下Apache能夠處理的并發(fā)請(qǐng)求數(shù)):

#ps -ef | grep httpd | wc -l

出現(xiàn)的結(jié)果,就是當(dāng)前Apache能夠處理的多少個(gè)并發(fā)請(qǐng)求,這個(gè)值A(chǔ)pache根據(jù)負(fù)載情況自動(dòng)調(diào).

查看Apache的并發(fā)請(qǐng)求數(shù)及其TCP連接狀態(tài):

#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

返回結(jié)果示例:

LAST_ACK 5

SYN_RECV 30

ESTABLISHED 1597

FIN_WAIT1 51

FIN_WAIT2 504

TIME_WAIT 1057

其中的SYN_RECV表示正在等待處理的請(qǐng)求數(shù);ESTABLISHED表示正常數(shù)據(jù)傳輸狀態(tài);TIME_WAIT表示處理完畢,等待超時(shí)結(jié)束的請(qǐng)求數(shù)。

狀態(tài):描述

CLOSED:無(wú)連接是活動(dòng)的或正在進(jìn)行

LISTEN:服務(wù)器在等待進(jìn)入呼叫

SYN_RECV:一個(gè)連接請(qǐng)求已經(jīng)到達(dá),等待確認(rèn)

SYN_SENT:應(yīng)用已經(jīng)開(kāi)始,打開(kāi)一個(gè)連接

ESTABLISHED:正常數(shù)據(jù)傳輸狀態(tài)

FIN_WAIT1:應(yīng)用說(shuō)它已經(jīng)完成

FIN_WAIT2:另一邊已同意釋放

ITMED_WAIT:等待所有分組死掉

CLOSING:兩邊同時(shí)嘗試關(guān)閉

TIME_WAIT:另一邊已初始化一個(gè)釋放

LAST_ACK:等待所有分組死掉

可以使用Linux下的webbench來(lái)作壓力測(cè)試.

?

總結(jié)

以上是生活随笔為你收集整理的linux apache两种工作模式详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。