原創:花括號MC(微信公衆號:huakuohao-mc)。關注JAVA基礎編程及大數據,注重經驗分享及我的成長。nginx
目前的web
服務器,apache
的httpd
與nginx
能夠說是絕代雙驕,一個是江湖老大哥,一個是後起之秀。雖然如今你們的首選是nginx
,不少項目由於各類緣由仍是會選擇使用apache
的httpd
做爲web
服務器。web
隨着最新版httpd 2.4
的發佈,event
模塊也變成了穩定版本,與nginx
的性能差距再次縮小。apache
Apache httpd
服務器有三種MPM(多路處理模塊),分別是prefork
,worker
及event
。這三種模塊性格迥異,不一樣的模塊對httpd
的性能及使用場景會產生比較大的影響。編程
查看httpd
服務器使用的哪一個模塊能夠經過以下指令 httpd -l
。從輸出能夠看出使用得是worker
模式。安全
Compiled in modules:
core.c
mod_so.c
http_core.c
worker.c
複製代碼
進程模式。每一個請求都由一個子進程來處理。線程安全。不太適合高併發服務器。bash
進程線程混合模式。父進程會建立子進程,每一個子進程會建立多個工做線程以及一個監聽線程。每個線程負責處理一個http請求。服務器
進程線程混合模式。跟
worker
模式很像,不一樣的是採用epoll
模式,在2.4以前的版本是實驗版本,如今已經穩定了。性能比worker要好不少。並在keepalive
方面作了優化。微信
worker
基本相同,這裏就不放圖了。這三種模式,在啓動的時候都會啓動固定數量的子進程。同時三種模式都會建立必定數量的空閒子進程,以便新的請求進來時,能夠直接使用。網絡
三種模式都有一些通用的參數指令,個別指令在不一樣模式下面含義有些許不一樣:併發
StartServers
:服務器啓動時創建的子進程數。
MinSpareServers
:空閒子進程的最小數量。當空閒子進程小於這個值時,父進程將會建立子進程。
MaxSpareServers
:空閒子進程的最大數量。當空閒子進程大於這個值時,父進程會殺死多餘的子進程。
MaxRequestWorkders
:容許同時接受的最大接入請求數量;若是提高該值,也須要同時提升ServerLimit
。任何超過了該值的請求數都要進入等待隊列。在以前的版本被稱爲MaxClients
。如今的版本也支持該參數。
注意: 在
worker
和event
模式下MaxRequestWorks
=ServerLimit
*ThreadsPerChild
ListenBacklog
:半連接(pending connection)隊列的最大長度。
ServerLimit
: 服務器容許配置的進程數上限。
MaxConnectionsPerChild
:每一個子進程在其生命週期內容許最大的請求數量,若是請求總數已經達到這個數值,子進程將會結束,若是設置爲0
,子進程將永遠不會結束。在以前的版本稱之爲MaxRequestsPerChild
。
建議設置爲非零,緣由:
配置樣例 prefork
模式
<IfModule prefork.c>
StartServers 5
MinSpareServers 10
MaxSpareServers 20
ServerLimit 1024
MaxRequestWorkders 1024
MaxRequestsPerChild 160
</IfModule>
複製代碼
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>
複製代碼
我把我經常使用得一些網絡運維腳本送給各位吧,有湊字數嫌疑(偷笑)。
查看狀態爲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·
Java·大數據·我的成長