apache-httpd的三種模式

apache httpd-2.4

新增模塊;

mod_proxy_fcgi(可提供 fcgi 代理)

mod_ratelimit(限制用戶帶寬)

mod_request(請求模塊,對請求做過濾)

mod_remoteip(匹配客戶端的 IP 地址)

對于基于 IP 的訪問控制做了修改,不再支持 allow,deny,order 機制,而是統一使用 require進行

還新增以下幾條新特性;

1、MPM 支持在運行時裝載;不過要開啟這種特性,在編譯安裝要啟用這三種功能;

--enable-mpms-shared=all --with-mpm=event

2、支持 event

3、支持異步讀寫

4、在每個模塊及每個目錄上指定日志級別

5、增強版的表達式分析器

6、每請求配置:<If>, <Elseif>

7、毫秒級別的 keepalive timeout

8、基于 FQDN 的虛擬主機不再需要 NameVirtualHost 指令

9、支持使用自定義變量

安裝時HTTPd 可以添加許多模塊

相關模塊解析:

--enable-so:支持動態共享模塊(即打開 DSO 支持)

--enable-rewrite:支持 url 重寫

--enable-ssl:支持 ssl

--with-ssl=/usr/local/openssl:指定 ssl 安裝位置

--enable-cgi:啟用 cgi

--enable-cgid:MPM 使用的是 event 或 worker 要啟用 cgid

--enable-modules=most:明確指明要靜態編譯到 httpd 二進制文件的模塊,<MODULE-LIST>為

空格分隔的模塊名列表、all 或者 most,all 表示包含所有模塊,most 表示包含大部分常用模

--enable-mpms-shared=all:啟用 MPM 所有支持的模式,這樣 event、worker、prefork 就會以

模塊化的方式安裝,要用哪個就在 httpd.conf 里配置就好了。

--with-mpm=event:指定啟用的 mpm 模式,默認使用 enevt 模式,在 apache 的早期版本 2.0

默認 prefork,2.2 版本是 worker,2.4 版本是 event.

--with-pcre=/usr/local/pcre:支持 pcre

--with-z=/usr/local/zlib:使用 zlib 壓縮庫

--with-apr=/usr/local/apr:指定 apr 的安裝路徑

--with-apr-util=/usr/local/apr-util:指定 apr-util 的安裝路徑

--enable-expires:激活彧通過配置文件控制 HTTP 的“Expires:”和“Cache-Control:”頭內容,即

對網站圖片、js、css 等內容,提供客戶端瀏覽器緩存的設置。這個是 apache 調優的一個重

要選項之一。

--enable-deflate:提供對內容的壓縮傳輸編碼支持,一般是 html、js、css 等內容的站點。使

用此參數會打打提高傳輸速度,提升訪問者訪問的體驗。在生產環境中,這是 apache 調優

的一個重要選項之一。

Apache 的優化配置:

apache 所運行的硬件環境都是對性能影響最大的因素,即使不能對硬件進行升級,也最好

給 apache 一個單獨的主機以免受到其他應用的干擾。各個硬件指標中,對性能影響最大的

是內存,對于靜態內容(圖片、javascript 文件、css 文件等),它決定了 apache 可以緩存多

少內容,它緩存的內容越多,在硬盤上讀取內容的機會就越少,大內存可以極大提高靜態站

點的速度;對動態高負載站點來說,每個請求保存的時間更多一些,apache 的 mpm 模塊會

為每個請求派生出相應的進程或線程分別處理,而進程或線程的數量與內存的消耗近似成正

比,因此增大內存對提高動態站點的負載和運行速度也極為有利

其次是硬盤的速度,靜態站點尤為突出,apache 不斷的在讀取文件并發送給相應的請求,

硬盤的讀寫是極其頻繁的;動態站點也要不斷的加載 web 程序(php 等),一個請求甚至要讀

取十幾個文件才能處理完成,因此盡可能的提高硬盤速度和質量對提高 apache 的性能是有

積極意義的。

最后是 cpu 和網絡,cpu 影響的是 web 程序執行速度,網絡影響流量大小。

apache? 的工作模式:

Apache HTTP 服務器被設計為一個強大的、靈活的能夠在多種平臺以及不同環境下工作的服

務器。這種模塊化的設計就叫做“多進程處理模塊”(Multi-Processing Module,MPM),也叫

做工作模式。

Prefork 模式(一個非線程型的):

其主要工作方式是:當 Apache 服務器啟動后,mpm_prefork 模塊會預先創建多個子進程(默

認為 5 個),每個子進程只有一個線程,當接收到客戶端的請求后,mpm_prefork 模塊再將

請求轉交給子進程處理,并且每個子進程同時只能用于處理單個請求。如果當前的請求數將

超過預先創建的子進程數時,mpm_prefork 模塊就會創建新的子進程來處理額外的請求。

Apache 總是試圖保持一些備用的或者是空閑的子進程用于迎接即將到來的請求。這樣客戶

端的請求就不需要在接收后等候子進程的產生。

由于在 mpm_prefork 模塊中,每個請求對應一個子進程,因此其占用的系統資源相對其他

兩種模塊而言較多。不過 mpm_prefork 模塊的優點在于它的每個子進程都會獨立處理對應

的單個請求,這樣,如果其中一個請求出現問題就不會影響到其他請求。Prefork 在效率上

要比 Worker 要高,但是內存使用大得多不擅長處理高并發的場景。

Apache 在 prefork 工作模式下影響性能的重要參數說明

# prefork MPM

<IfModule mpm_prefork_module>

StartServers 5

#apache 啟動時候默認開始的子進程數

MinSpareServers 5

#最小的閑置子進程數

MaxSpareServers 10

#最大的閑置子進程數

MaxRequestWorkers 250

#MaxRequestWorkers 設 置 了 允 許 同 時 的 最 大 接 入 請 求 數 量 。 任 何 超 過MaxRequestWorkers 限制的請求將進入等候隊列,在 apache2.3.1 以前的版本

MaxRequestWorkers 被稱為 MaxClients,舊的名字仍舊被支持。

MaxConnectionsPerChild 500

#設置的是每個子進程可處理的請求數。每個子進程在處理了“MaxConnectionsPerChild”

個請求后將自動銷毀。0 意味著無限,即子進程永不銷毀。雖然缺省設為 0 可以使每個

子進程處理更多的請求,但如果設成非零值也有兩點重要的好處:1、可防止意外的內

存泄漏。2、在服務器負載下降的時侯會自動減少子進程數。因此,可根據服務器的負

載來調整這個值。在 Apache2.3.9 之前稱之為 MaxRequestsPerChild。

</IfModule>

注 1:MaxRequestWorkers 是這些指令中最為重要的一個,設定的是 Apache 可以同時處理

的請求,是對 Apache 性能影響最大的參數。如果請求總數已達到這個值(可通過 ps -ef|grep

http|wc -l 來確認),那么后面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源

還剩下很多而 HTTP 訪問卻很慢的主要原因。雖然理論上這個值越大,可以處理的請求就越

多,建議將初始值設為(以 Mb 為單位的最大物理內存/2),然后根據負載情況進行動態調整。

比如一臺 4G 內存的機器,那么初始值就是 4000/2=2000。

注 2:prefork 控制進程在最初建立“StartServers”個子進程后,為了滿足 MinSpareServers 設

置的需要創建一個進程,等待一秒鐘,繼續創建兩 個,再等待一秒鐘,繼續創建四個……如

此按指數級增加創建的進程數,最多達到每秒 32 個,直到滿足 MinSpareServers 設置的值為

止。這種模式 可以不必在請求到來時再產生新的進程,從而減小了系統開銷以增加性能。

MaxSpareServers 設置了最大的空閑進程數,如果空閑進程數大于這個 值,Apache 會自動 kill

掉一些多余進程。這個值不要設得過大,但如果設的值比 MinSpareServers 小,Apache 會自

動把其調整為 MinSpareServers+1。如果站點負載較大,可考慮同時加大 MinSpareServers 和

MaxSpareServers。

注 3:ServerLimit 和 MaxClients(MaxRequestWorkers)有什么區別呢?

是因為在 apache1 時代,控制最大進程數只有 MaxClients 這個參數,并且這個參數最大值為

256,并且是寫死了的,試圖設置為超過 256 是無效的,這是由于 apache1 時代的服務器硬

件限制的。但是 apache2 時代由于服務器硬件的升級,硬件已經不再是限制,所以使用

ServerLimit 這個參數來控制最大進程數,ServerLimit 值>=MaxClient 值才有效。ServerLimit

要放在 MaxClients 之前,值要不小于 MaxClients。

注 4:查看 Apache 加載的模塊

[root@www ~]#apachectl -t -D DUMP_MODULES

[root@www ~]# apachectl -M

[root@www ~]# apachectl –l (小寫 L,只顯示靜態模塊)

如何查看 Apache 的工作模式呢?可以使用 httpd -V 命令查看,另外使用 httpd -l 也可以查

看到

注 5:如何修改 prefork 參數和啟用 prefork 模式

1.[root@www ~]# vi /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf

2.[root@www ~]# vi /usr/local/http-2.4.23/conf/httpd.conf

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

Include conf/extra/httpd-mpm.conf

3 重啟httpd

Worker 模式(多線程多進程):

和 prefork 模式相比,worker 使用了多進程和多線程的混合模式,worker 模式也同樣會先預

派生一些子進程,然后每個子進程創建一些線程,同時包括一個監聽線程,每個請求過來會

被分配到一個線程來服務。線程比起進程會更輕量,因為線程是通過共享父進程的內存空間,

因此,內存的占用會減少一些,在高并發的場景下會比 prefork 有更多可用的線程,表現會

更優秀一些;另外,如果一個線程出現了問題也會導致同一進程下的線程出現問題,如果是

多個線程出現問題,也只是影響 Apache 的一部分,而不是全部。由于用到多進程多線程,

需要考慮到線程的安全了,在使用 keep-alive 長連接的時候,某個線程會一直被占用,即使

中間沒有請求,需要等待到超時才會被釋放(該問題在 prefork 模式下也存在)

總的來說,prefork 方式速度要稍高于 worker,然而它需要的 cpu 和 memory 資源也稍多于

woker。

Apache 在 worker 工作模式下影響性能的重要參數說明

# worker MPM

<IfModule mpm_worker_module>

StartServers 3

#apache 啟動時候默認開始的子進程數

MinSpareThreads 75

#最小空閑數量的工作線程

MaxSpareThreads 250

#最大空閑數量的工作線程

ThreadsPerChild 25

#每個子進程產生的線程數量

MaxRequestWorkers 400

#與 prefork 模式相同

MaxConnectionsPerChild 0

#與 prefork 模式相同

</IfModule>

注 1:Worker 由主控制進程生成“StartServers”個子進程,每個子進程中包含固定的

ThreadsPerChild 線程數,各個線程獨立地處理請求。同樣, 為了不在請求到來時再生成線

程,MinSpareThreads 和 MaxSpareThreads 設置了最少和最多的空閑線程數;

而 MaxRequestWorkers 設置了同時連入的 clients 最大總數。如果現有子進程中的線程總數不

能滿足負載,控制進程將派生新的子進程

MinSpareThreads 和 MaxSpareThreads 的最大缺省值分別是 75 和 250。這兩個參數對 Apache

的性能影響并不大,可以按照實際情況相應調節 。

注 2:ThreadsPerChild 是 worker MPM 中與性能相關最密切的指令。ThreadsPerChild 的最大

缺省值是 64,如果負載較大,64 也是不夠的。這時要顯式使用 ThreadLimit 指令,它的最大

缺省值是 20000。

注 3:Worker 模式下所能同時處理的請求總數是由子進程總數乘以 ThreadsPerChild 值決定

的,應該大于等于 MaxRequestWorkers。如果負載很大,現有的子進程數不能滿足時,控制

進程會派生新的子進程。默認最大的子進程總數是 16,加大時 也需要顯式聲明 ServerLimit

(系統配置的最大進程數量,最大值是20000)。需要注意的是,如果顯式聲明了 ServerLimit,

那么它乘以 ThreadsPerChild的值必須大于等于MaxRequestWorkers,而且MaxRequestWorkers

必須是 ThreadsPerChild 的整數倍,否則 Apache 將會自動調節到一個相應值。

注 4:進程與線程的區別

線程是指進程內的一個執行單元,也是進程內的可調度實體.

與進程的區別:

(1)地址空間:進程內的一個執行單元;進程至少有一個線程;它們共享進程的地址空間;而進程

有自己獨立的地址空間;

(2)資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源

(3)線程是處理器調度的基本單位,但進程不是.

(4)二者均可并發執行.

進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對

應用的并發性。

進程和線程的區別在于:

簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.

線程的劃分尺度小于進程,使得多線程程序的并發性高。

另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程

序的運行效率。

Event 模式:

這是 Apache 最新的工作模式,是 worker 模式的變種,它把服務進程從連接中分離出來,一

worker 模式不同的是在于它解決了 keep-alive 長連接的時候占用線程資源被浪費的問題,在

event 工作模式中,會有一些專門的線程用來管理這些 keep-alive 類型的線程,當有真實請

求過來的時候,將請求傳遞給服務器的線程,執行完畢后,又允許它釋放。這增強了在高并

發場景下的請求處理。event 模式不能很好的支持 https 的訪問(HTTP 認證相關的問題)。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,334評論 2 377

推薦閱讀更多精彩內容