1. Apache DSO
1.1 Apache DSO是什么
DSO (Dynamic Shared Object) 動(dòng)態(tài)共享目錄的縮寫, 是類Unix 操作系統(tǒng)中存在的一種動(dòng)態(tài)連接機(jī)制, 在程序運(yùn)行是將需要的部分從外部調(diào)入內(nèi)存執(zhí)行的方法.
apache 1.3 版本開(kāi)始支持這種方法, 應(yīng)為早期 apache 一直使用一個(gè)模塊來(lái)擴(kuò)展功能, 并在內(nèi)部使用一個(gè)調(diào)度機(jī)制 來(lái)鏈接擴(kuò)展模塊 到核心模塊.
1.2 Apache DSO 實(shí)現(xiàn)
每個(gè)單個(gè)模塊的動(dòng)態(tài)加載, 都是基于 mod_so 的模塊來(lái)實(shí)現(xiàn)的, 該mod_so 必須被靜態(tài)的編譯 http 服務(wù)器內(nèi)核中, 除了 core 以外的唯一不可以動(dòng)態(tài)方式編譯的模塊, 實(shí)際操作中, apache 模塊在編譯服務(wù)器程序時(shí)通過(guò)單獨(dú)制定其來(lái)編譯為DSO 文件, 應(yīng)當(dāng)在編譯時(shí)制定
--enable-xxx=shared(xxx為模塊名, 如 rewrite), 動(dòng)態(tài)編譯的模塊可以在配置文件中使用LoadModule動(dòng)態(tài)加載Apache 模塊(尤其是第三方模塊)的DSO 文件過(guò)程, apache 提供了工具 apxs (Apache eXtenSion) 動(dòng)態(tài)將模塊編譯成 DSO 文件, 對(duì)具體平臺(tái)編譯器設(shè)置一些標(biāo)志, 便于創(chuàng)建DSO 文件.
1.3 DSO 優(yōu)勢(shì)和劣勢(shì)
-
DSO 優(yōu)勢(shì)
- 服務(wù)器運(yùn)行時(shí)更加靈活實(shí)際服務(wù)器進(jìn)程可以通過(guò)配置文件動(dòng)態(tài)加載組件, 不需要在編譯時(shí)通過(guò)配合參數(shù)指定,
- 服務(wù)器可以方便擴(kuò)展第三方模塊.
-
DSO 劣勢(shì)
- DSO 不是任何平臺(tái)都可以使用, 一些平臺(tái)不支持動(dòng)態(tài)將代碼加載到另一個(gè)程序地址空間中.
- 服務(wù)器啟動(dòng)時(shí)會(huì)更慢一點(diǎn).
1.4 查看模塊
-
查看安裝了的模塊: (包含動(dòng)態(tài)加載的)
- httpd -M
-
查看靜態(tài)安裝的模塊:
- httpd -l
2. Apache MPM
2.1 MPM 介紹
- Apache 2.x開(kāi)始遲滯并行處理模塊, 稱為多路處理模塊(MPM), 在編譯apache 時(shí) 必須選擇且只能選擇一種MPM, 對(duì)于類似Unix系統(tǒng), 有多個(gè)不用的 MPM 可以選擇, 會(huì)影響到apache 速度和可升縮性.
2.2 Apache2.4 支持的MPM
- apache2.4 支持多種模塊
2.2.1 Prefork MPM:
這個(gè)多路處理模塊(MPM) 實(shí)現(xiàn)了一些非線程, 預(yù)派生的 web 服務(wù)器, 工作方式類似于 Apache1.3, 適合沒(méi)有現(xiàn)成安全庫(kù), 需要避免線程兼容性問(wèn)題影響系統(tǒng). 要求將每個(gè)請(qǐng)求相互獨(dú)立的情況最好的 MPM, 請(qǐng)求出現(xiàn)問(wèn)題就不會(huì)影響其他請(qǐng)求.
MPM 具有很強(qiáng)自我調(diào)節(jié)能力, 需要很少的配置指令調(diào)整,
設(shè)置:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule mpm_prefork_module>
-------------
StartServers
服務(wù)啟動(dòng)時(shí), 啟動(dòng)的進(jìn)程
MinSpareServers
服務(wù)閑置時(shí), 保留的最小進(jìn)程數(shù)
MaxSpareServers
服務(wù)閑置時(shí), 保留的最大進(jìn)程數(shù)
MaxRequestWorkers
工作時(shí)會(huì)啟動(dòng)的 最多的進(jìn)程數(shù)
MaxConnectionPerChild
服務(wù)器殺死就進(jìn)程和重啟的頻率, 0表示永不殺死, 設(shè)置100 表示進(jìn)程服務(wù)100次后, 就會(huì)被殺死
2.2.2 Worker MPM
該多路處理模塊(MPM) 使用網(wǎng)絡(luò)服務(wù)器 支持混合的多線程多進(jìn)程, 由于使用線程來(lái)處請(qǐng)求, 所以可以處理海量請(qǐng)求, 系統(tǒng)資源開(kāi)銷小于 基于進(jìn)程的MPM, 但是也是用了很多進(jìn)程, 每個(gè)進(jìn)程有多個(gè)線程, 以獲得基于進(jìn)程的 MPM 穩(wěn)定性.
每個(gè)進(jìn)程可擁有的線程數(shù)量是固定的, 服務(wù)器會(huì)根據(jù)負(fù)載情況增 加或減少進(jìn)程數(shù)量, 一個(gè)單獨(dú)的控制進(jìn)程(父進(jìn)程)負(fù)責(zé)子進(jìn)程的建立. 每個(gè)子進(jìn)程可以建立 ThreadPerChild 數(shù)量的服務(wù)線程 和一個(gè)監(jiān)聽(tīng)線程, 該監(jiān)聽(tīng)線程 監(jiān)聽(tīng)接入請(qǐng)求并將其傳入傳遞服務(wù)線程處理和應(yīng)答.
不論Worker 模式或者 Prefork 模式, Apache 總是試圖保持一些備用(spare) 或者空閑子進(jìn)程(空閑的服務(wù)線程池) 用于迎接即將到來(lái)的請(qǐng)求, 客戶端不需要得到自己成產(chǎn)生,
設(shè)置:
<IfModule mpm_worker_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule mpm_worker_module>
----------------
StartServers
啟動(dòng)時(shí)啟動(dòng)的進(jìn)程數(shù)
MinSpareThreads
保留的最小線程數(shù)
MaxSpareThreads
保留的最大 線程數(shù),
ThreadsPerChild
每個(gè)子進(jìn)程創(chuàng)建的線程數(shù),
MaxRequestWorkers
可以啟動(dòng)工作 的最大進(jìn)程數(shù)量
MaxConnectionsPerChild
工作的繼承在處理指定次連接后 會(huì)被殺死, 0 表示永不殺死
2.2.2 Event MPM
Event 處理模塊(MPM), 在以上兩種MPM 非常繁忙的服務(wù)器應(yīng)用下都是有些不足的, HTTP 的 Keepalive 方式能減少TCP 連接數(shù)量和網(wǎng)絡(luò)負(fù)載, 但是 Keepalive 需要和服務(wù) 進(jìn)程/線程 綁定, 就會(huì)導(dǎo)致繁忙的服務(wù)器會(huì)耗光 進(jìn)程/線程.
Event MPM 可以解決上面的問(wèn)題, 它把服務(wù)進(jìn)程從連接中分離出來(lái), 在服務(wù)器處理速度很快, 具有很高的點(diǎn)擊率, 可用的線程數(shù)量就是關(guān)鍵的資源限制, 此時(shí) Event MPM 方式是最有效的, Worker MPM 方式工作的 繁忙的服務(wù)器可以承受 10k/s 訪問(wèn).
使用
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule mpm_event_module>
------------------------
END