【apche的端口和進程】
Apache默認安裝完之后監(jiān)聽的是TCP協(xié)議的80端口,如果是加密的https協(xié)議的話就是443端口。
我們可以通過命令 netstat tupln | grep 80 來查看。
Apache默認會啟動一個主進程(也叫控制進程)也多個子進程
我們可以通過命令 ps aux | grep httpd 來查看,默認會啟用多個子進程,
這些進程里面有一個主進程,怎么區(qū)分呢?
首先,主進程由root運行,其它進程是由apache用戶來運行
其次,因為主進程是第一個啟動,子進程都是由主進程來運行的,所以我們可以通過
進程的id來判斷,主進程的id是最小的
最后我們也可以通過查看 /etc/httpd/run/httpd.pid 文件來查看主進程的id
真正處理請求的是子進程。
【DSO動態(tài)加載】
apache本身是一個模塊設(shè)計的服務(wù),各個的功能,特性是獨立分開的,
這樣設(shè)計的好處在于可擴展很強,各個模塊相互依耐性較低,有利于后期的升級或者添加新功能比較方便
核心只包含主要功能,擴展功能通過模塊實現(xiàn)。不同模塊可以被靜態(tài)的編譯進程序,也可以動態(tài)加載
DSO 動態(tài)共享對象,模塊的動態(tài)加載就是通過DSO來實現(xiàn)的,動態(tài)加載指的是當(dāng)我們需要新的功能的時候,
我們把需要的功能編譯出來,通過配置文件加載進apche的服務(wù)當(dāng)中。不需要重新編譯apahce。
通過apache的apxs就可以獨立的去編譯的動態(tài)模塊,這個工具是屬于httpd-devel開發(fā)相關(guān)的軟件包中的。
可以通過http -M(httpd -l 查看靜態(tài)模塊) 查看當(dāng)前都編譯了哪些模塊,其中static為靜態(tài)編譯進apache的,shared為動態(tài)編譯進入的。
DSO的實現(xiàn)是通過so_module靜態(tài)模塊實現(xiàn)的。 mod_so.c是DSO本身的模塊
【MPM 多進程模塊】
MPM(Multi Process Modules)
因為apache本身是一個跨平臺的,但是不同操作系統(tǒng),對底層網(wǎng)絡(luò)請求的處理,操作系統(tǒng)為我們提供的接口都不同。
如果強行使用一種統(tǒng)一的方式去實現(xiàn),就沒有最大化的利用操作系統(tǒng)的最大優(yōu)勢,所以在不同平臺下使用不同的MPM
其中Linux下有 prefork 和worker Windows下有 mpm_winnt
Linux下默認的是使用prefork,我們來分析一些prefork與worker的區(qū)別
Prefork (預(yù)先生成) 是非線程,預(yù)生成進程型MPM,prefork會預(yù)先啟動一些子進程,每個子進程一個時間點只能處理一個請求,并且會根據(jù)并發(fā)請求數(shù)量動態(tài)生成更多子進程。優(yōu)勢是線程安全的
Worker worker是線程化,多進程的MPM,每個進程可以生成多個線程,每個線程處理一個請求。優(yōu)勢是不需要啟用多個子進程,這樣可以節(jié)約內(nèi)存,缺點是效率沒有prefork高。
如果要使用其他的MPM需要重新編譯Apache。