你真的瞭解 apache httpd 得多路複用嗎

原創:花括號MC(微信公衆號:huakuohao-mc)。關注JAVA基礎編程及大數據,注重經驗分享及我的成長。nginx

目前的web服務器,apachehttpdnginx能夠說是絕代雙驕,一個是江湖老大哥,一個是後起之秀。雖然如今你們的首選是nginx,不少項目由於各類緣由仍是會選擇使用apachehttpd做爲web服務器。web

隨着最新版httpd 2.4的發佈,event模塊也變成了穩定版本,與nginx的性能差距再次縮小。apache

Apache httpd 服務器有三種MPM(多路處理模塊),分別是prefork,workerevent。這三種模塊性格迥異,不一樣的模塊對httpd的性能及使用場景會產生比較大的影響。編程

查看httpd服務器使用的哪一個模塊能夠經過以下指令 httpd -l。從輸出能夠看出使用得是worker模式。安全

Compiled in modules:
    core.c
    mod_so.c
    http_core.c
    worker.c
複製代碼
MPM介紹
prefork

進程模式。每一個請求都由一個子進程來處理。線程安全。不太適合高併發服務器。bash

  • 工做原理如圖:

worker

進程線程混合模式。父進程會建立子進程,每一個子進程會建立多個工做線程以及一個監聽線程。每個線程負責處理一個http請求。服務器

  • 工做原理,如圖:

event

進程線程混合模式。跟worker模式很像,不一樣的是採用epoll模式,在2.4以前的版本是實驗版本,如今已經穩定了。性能比worker要好不少。並在keepalive方面作了優化。微信

  • 工做原理 與worker基本相同,這裏就不放圖了。

這三種模式,在啓動的時候都會啓動固定數量的子進程。同時三種模式都會建立必定數量的空閒子進程,以便新的請求進來時,能夠直接使用。網絡

通用配置

三種模式都有一些通用的參數指令,個別指令在不一樣模式下面含義有些許不一樣:併發

StartServers :服務器啓動時創建的子進程數。

MinSpareServers:空閒子進程的最小數量。當空閒子進程小於這個值時,父進程將會建立子進程。

MaxSpareServers:空閒子進程的最大數量。當空閒子進程大於這個值時,父進程會殺死多餘的子進程。

MaxRequestWorkders:容許同時接受的最大接入請求數量;若是提高該值,也須要同時提升ServerLimit。任何超過了該值的請求數都要進入等待隊列。在以前的版本被稱爲MaxClients。如今的版本也支持該參數。

注意: 在workerevent 模式下MaxRequestWorks = ServerLimit * ThreadsPerChild

ListenBacklog :半連接(pending connection)隊列的最大長度。

ServerLimit: 服務器容許配置的進程數上限。

MaxConnectionsPerChild:每一個子進程在其生命週期內容許最大的請求數量,若是請求總數已經達到這個數值,子進程將會結束,若是設置爲0,子進程將永遠不會結束。在以前的版本稱之爲MaxRequestsPerChild

建議設置爲非零,緣由:

  1. 可以防止(偶然的)內存泄漏無限進行,從而耗盡內存。
  2. 給進程一個有限壽命,從而有助於當服務器負載減輕的時候減小活動進程的數量(重生的機會)。

配置樣例 prefork模式

<IfModule prefork.c>
    StartServers      5
    MinSpareServers   10
    MaxSpareServers   20
    ServerLimit      1024
    MaxRequestWorkders  1024
    MaxRequestsPerChild  160
</IfModule>
複製代碼
worker 與 event 特有的配置參數

ThreadsPerChild:每一個子進程,產生多少線程。不能超過ThreadLimit 。

ThreadLimit:每一個子進程可配置的線程數。

AsyncRequestWorkerFactor:該參數event模式獨有。默認值爲2。可設置爲小數,例如1.5。

該參數用來調整每一個進程容許的鏈接數。只有當前鏈接數(不包括正處於closing狀態的鏈接)小於下面的表達式的值時,子進程才容許接收新鏈接。最好不要調整該值,除非你通過大量測試。 ThreadsPerChild +(AsyncRequestWorkerFactor * number of idle workers)

配置樣例 worker模式

<IfModule worker.c>
    StartServers        5
    ServerLimit         40
    MaxRequestWorkders  2560
    MinSpareThreads     10
    MaxSpareThreads     20
    ThreadsPerChild     64
    MaxRequestsPerChild  160
</IfModule>
複製代碼
web服務器經常使用運維指令

我把我經常使用得一些網絡運維腳本送給各位吧,有湊字數嫌疑(偷笑)。

查看狀態爲established 的TCP鏈接:netstat -na|grep ESTABLISHED|wc -l

統計哪一個IP地址鏈接最多: netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r

統計TCP鏈接狀態: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

結束

關於apache httpd 的配置及MPM簡介,上面的內容基本就說完了。稍微瞭解TCP及網絡編程知識的同窗可能會好奇,TCP鏈接對外提供服務的是一個固定端口,好比httpd默認是80端口,那apache httpd是如何作到同時支持多個請求的呢,也就是高併發。還有worker模式和event模式都是進程線程混合模式,爲何event模式就比worker模式優秀呢,也就是你們常常開玩笑說的,一樣是九年義務教育你爲何如此優秀。我將在下篇文章中給你們詳細說一說,下一篇文章纔是硬核乾貨知識。

·END·
 

花括號MC

Java·大數據·我的成長

微信號:huakuohao-mc
相關文章
相關標籤/搜索