Web 服務(wù)器:APACHE HTTPD
剛?cè)腴T Web 的小伙伴很容易迷失在 Apache、Tomcat、Httpd、Nginx 這些陌生詞匯中,所以在開始本章節(jié)的內(nèi)容前我們先來認(rèn)識下它們。
-
Apache:全球最權(quán)威的軟件開源協(xié)會,很多公司會把自己內(nèi)部的一些系統(tǒng)開源并提交申請給 Apache,讓 Apache 統(tǒng)一來管理這些開源項目為全世界的軟件做貢獻,同時也提升了公司的知名度和一些商業(yè)的戰(zhàn)略價值。尷尬的一點是早期的 Http Server 就叫做 Apache,后來的版本改名為 Httpd 了,所以很多人習(xí)慣說 Apache 服務(wù)器,其實默認(rèn)指的是 Httpd;
-
Httpd:Apache 旗下的 Web 服務(wù)器,它只提供靜態(tài)資源的訪問;
-
Tomcat:Apache 旗下的另一個開源項目,區(qū)別于 Httpd 的是它支持動態(tài)內(nèi)容服務(wù);
-
Nginx:Apache 的另一個開源服務(wù)器,但是更多時候拿他來作為代理服務(wù)器。Nginx 的功能非常強大,遠(yuǎn)超了 Http 服務(wù)器的范疇,更像是一個網(wǎng)絡(luò)管理工具。
1. Httpd 簡介
Httpd 是 C 語言編寫的遵從 Http 協(xié)議的服務(wù)器,是一個高度模塊化軟件,由 Server 和 Module 組成。這些模塊大都是動態(tài)模塊,因此可以隨時加載。
- 源碼開源地址:https://github.com/apache/httpd ;
- 官網(wǎng)地址:https://httpd.apache.org;
Httpd 作為起步比較早的一個 Web 開源項目,代碼的穩(wěn)定性/社區(qū)/文檔 都是比較可靠的,他支持的功能非常豐富,并且可以按需地引入自己所需要的模塊。
Httpd 一般比較的對象是 Nginx 服務(wù)器,他們兩個是靜態(tài)資源服務(wù)器的首選:
- Nginx 輕量且并發(fā)能力高于 Httpd;
- Nginx 能夠?qū)崿F(xiàn)負(fù)載均衡;
- Httpd 支持的功能模塊比較豐富;
- Httpd 的
rewrite
功能強于 Nginx。
當(dāng)然,也有的網(wǎng)站架構(gòu)同時用到了 Nginx 和 Httpd ,用 Nginx 作為負(fù)載均衡,將流量分發(fā)到后面的 Httpd Web服務(wù)端。
2. Httpd 的工作模型
對于請求 Httpd 有 3 種處理模型,MPM(Mulit Path Modules,多路徑處理模塊)它們會影響到 Httpd 的速度和可伸縮性。在編譯的時候可以根據(jù)需要使用 --with-mpm
選項來指定 Httpd 的工作方式,默認(rèn)是 prefork
模式。
工作模式 | 說明 |
---|---|
prefork |
服務(wù)器啟動時會生成多個進程,并且每一個進程處理一個請求,這種模式并發(fā)能力較差。 |
worker |
服務(wù)啟動的時候也是會生成多個進程,但是每個進程又會生成多個線程,讓線程來負(fù)責(zé)處理請求。這種模式會比prefork并發(fā)能力好些。 |
event |
基于事件的驅(qū)動,一個進程處理多個請求,這種模式的并發(fā)處理能力最強。 |
可以通過 httpd -V
命令查看當(dāng)前的工作模型:
Tips:比較舊的版本需要用
apachectl -V
命令來查看當(dāng)前工作模型。
$ httpd -V
Server version: Apache/2.4.18 (Unix)
Server built: Feb 18 2020 02:28:26
Server's Module Magic Number: 20120211:52
Server loaded: APR 1.5.2, APR-UTIL 1.5.4
Compiled using: APR 1.5.2, APR-UTIL 1.5.4
Architecture: 64-bit
Server MPM: event
threaded: yes (fixed thread count)
forked: yes (variable process count)
不同的工作模式,對應(yīng)著不同的配置。
prefork
<IfModule prefork.c>
StartServers 5 # 啟動 apache 時啟動的 httpd 進程個數(shù)。
MinSpareServers 5 # 服務(wù)器保持的最小空閑進程數(shù)。
MaxSpareServers 10 # 服務(wù)器保持的最大空閑進程數(shù)。
MaxClients 150 # 最大并發(fā)連接數(shù)。
MaxRequestsPerChild 1000 # 每個子進程被請求服務(wù)多少次后被 kill 掉。0表示不限制,推薦設(shè)置為1000。
</IfModule>
worker
<IfModule worker.c>
StartServers 2 # 啟動 apache 時啟動的 httpd 進程個數(shù)。
MaxClients 150 # 最大并發(fā)連接數(shù)。
MinSpareThreads 25 # 服務(wù)器保持的最小空閑線程數(shù)。
MaxSpareThreads 75 # 服務(wù)器保持的最大空閑線程數(shù)。
ThreadsPerChild 25 # 每個子進程的產(chǎn)生的線程數(shù)。
MaxRequestsPerChild 0 # 每個子進程被請求服務(wù)多少次后被 kill 掉。0表示不限制,推薦設(shè)置為1000。
</IfModule>
event
<IfModule perchild.c>
NumServers 5 #服務(wù)器啟動時啟動的子進程數(shù)
StartThreads 5 #每個子進程啟動時啟動的線程數(shù)
MinSpareThreads 5 #內(nèi)存中的最小空閑線程數(shù)
MaxSpareThreads 10 #最大空閑線程數(shù)
MaxThreadsPerChild 2000 #每個線程最多被請求多少次后退出。0不受限制。
MaxRequestsPerChild 10000 #每個子進程服務(wù)多少次后被重新 fork。0表示不受限制。
</IfModule>
2.1 工作模型切換
prefork
模式效率比較高,但要比 worker
使用內(nèi)存更大,根據(jù)自己的需求選擇合適的工作模式,假如要切換工作模式可以通過下面的方法。我們前面提到,工作模式需要編譯的時候指定,下面操作生效的前提是編譯的時候選擇了所有模式 --enable-mpms-shared=all
:
vi /etc/httpd/conf.modules.d/00-mpm.conf
#LoadModule mpm_event_module modules/mod_mpm_event.so
//將注釋去掉,或者修改成需要的工作模型
3. Httpd 安裝
安裝模式有 2 種,手動離線安裝和 yum 安裝,由于 httpd 是 C 程序,如果是手動安裝的話要先安裝 C 對應(yīng)的環(huán)境和 httpd 依賴的一些包。yum 的安裝方式相對比較簡單。
3.1 yum 安裝 Httpd
yum install httpd.x86_64
3.2 Httpd 的主要配置
/etc/httpd/conf/httpd.conf
:主配置文件;/etc/httpd/conf.modules.d/*.conf
:模塊配置文件;/etc/httpd/conf.d/*.conf
:輔助配置文件;/var/log/httpd/access.log
:訪問日志;/var/log/httpd/error_log
:錯誤日志;/var/www/html/
:用戶的 html 項目代碼。
3.3 啟動
添加 Httpd 開機啟動:
[root@localhost bin]# cp /usr/local/httpd/bin/apachectl /etc/rc.d/init.d/httpd
啟動 Httpd 服務(wù):
[root@localhost bin]# service httpd start
Httpd 啟動后默認(rèn)進入的是歡迎界面,我們的 Html 工程可以放在 /var/www/html
,寫個 demo 的 index.html 。
<html>
<head></head>
<body>hello</body>
</html>
4. Httpd 常用命令
- httpd -v:查看 httpd 的版本號;
- httpd -l:查看編譯進 httpd 程序的靜態(tài)模塊;
- httpd -M:查看已經(jīng)編譯進 httpd 程序的靜態(tài)模塊和已經(jīng)加載的動態(tài)模塊。
5. 小結(jié)
Httpd 是上面幾種服務(wù)器誕生最早的一個,所以它的代碼經(jīng)過長時間的修改和生產(chǎn)實際相對來說成熟很多,功能也很豐富,有強大的 rewrite
機制,模塊化按需加載,連工作模式都可以根據(jù)自己的需要在編譯的時候指定,但是因為靈活性比較高,初學(xué)者反而不容易掌握。