Web 服務器:APACHE HTTPD
剛入門 Web 的小伙伴很容易迷失在 Apache、Tomcat、Httpd、Nginx 這些陌生詞匯中,所以在開始本章節的內容前我們先來認識下它們。
-
Apache:全球最權威的軟件開源協會,很多公司會把自己內部的一些系統開源并提交申請給 Apache,讓 Apache 統一來管理這些開源項目為全世界的軟件做貢獻,同時也提升了公司的知名度和一些商業的戰略價值。尷尬的一點是早期的 Http Server 就叫做 Apache,后來的版本改名為 Httpd 了,所以很多人習慣說 Apache 服務器,其實默認指的是 Httpd;
-
Httpd:Apache 旗下的 Web 服務器,它只提供靜態資源的訪問;
-
Tomcat:Apache 旗下的另一個開源項目,區別于 Httpd 的是它支持動態內容服務;
-
Nginx:Apache 的另一個開源服務器,但是更多時候拿他來作為代理服務器。Nginx 的功能非常強大,遠超了 Http 服務器的范疇,更像是一個網絡管理工具。
1. Httpd 簡介
Httpd 是 C 語言編寫的遵從 Http 協議的服務器,是一個高度模塊化軟件,由 Server 和 Module 組成。這些模塊大都是動態模塊,因此可以隨時加載。
- 源碼開源地址:https://github.com/apache/httpd ;
- 官網地址:https://httpd.apache.org;
Httpd 作為起步比較早的一個 Web 開源項目,代碼的穩定性/社區/文檔 都是比較可靠的,他支持的功能非常豐富,并且可以按需地引入自己所需要的模塊。
Httpd 一般比較的對象是 Nginx 服務器,他們兩個是靜態資源服務器的首選:
- Nginx 輕量且并發能力高于 Httpd;
- Nginx 能夠實現負載均衡;
- Httpd 支持的功能模塊比較豐富;
- Httpd 的
rewrite
功能強于 Nginx。
當然,也有的網站架構同時用到了 Nginx 和 Httpd ,用 Nginx 作為負載均衡,將流量分發到后面的 Httpd Web服務端。
2. Httpd 的工作模型
對于請求 Httpd 有 3 種處理模型,MPM(Mulit Path Modules,多路徑處理模塊)它們會影響到 Httpd 的速度和可伸縮性。在編譯的時候可以根據需要使用 --with-mpm
選項來指定 Httpd 的工作方式,默認是 prefork
模式。
工作模式 | 說明 |
---|---|
prefork |
服務器啟動時會生成多個進程,并且每一個進程處理一個請求,這種模式并發能力較差。 |
worker |
服務啟動的時候也是會生成多個進程,但是每個進程又會生成多個線程,讓線程來負責處理請求。這種模式會比prefork并發能力好些。 |
event |
基于事件的驅動,一個進程處理多個請求,這種模式的并發處理能力最強。 |
可以通過 httpd -V
命令查看當前的工作模型:
Tips:比較舊的版本需要用
apachectl -V
命令來查看當前工作模型。
$ 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)
不同的工作模式,對應著不同的配置。
prefork
<IfModule prefork.c>
StartServers 5 # 啟動 apache 時啟動的 httpd 進程個數。
MinSpareServers 5 # 服務器保持的最小空閑進程數。
MaxSpareServers 10 # 服務器保持的最大空閑進程數。
MaxClients 150 # 最大并發連接數。
MaxRequestsPerChild 1000 # 每個子進程被請求服務多少次后被 kill 掉。0表示不限制,推薦設置為1000。
</IfModule>
worker
<IfModule worker.c>
StartServers 2 # 啟動 apache 時啟動的 httpd 進程個數。
MaxClients 150 # 最大并發連接數。
MinSpareThreads 25 # 服務器保持的最小空閑線程數。
MaxSpareThreads 75 # 服務器保持的最大空閑線程數。
ThreadsPerChild 25 # 每個子進程的產生的線程數。
MaxRequestsPerChild 0 # 每個子進程被請求服務多少次后被 kill 掉。0表示不限制,推薦設置為1000。
</IfModule>
event
<IfModule perchild.c>
NumServers 5 #服務器啟動時啟動的子進程數
StartThreads 5 #每個子進程啟動時啟動的線程數
MinSpareThreads 5 #內存中的最小空閑線程數
MaxSpareThreads 10 #最大空閑線程數
MaxThreadsPerChild 2000 #每個線程最多被請求多少次后退出。0不受限制。
MaxRequestsPerChild 10000 #每個子進程服務多少次后被重新 fork。0表示不受限制。
</IfModule>
2.1 工作模型切換
prefork
模式效率比較高,但要比 worker
使用內存更大,根據自己的需求選擇合適的工作模式,假如要切換工作模式可以通過下面的方法。我們前面提到,工作模式需要編譯的時候指定,下面操作生效的前提是編譯的時候選擇了所有模式 --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 對應的環境和 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 服務:
[root@localhost bin]# service httpd start
Httpd 啟動后默認進入的是歡迎界面,我們的 Html 工程可以放在 /var/www/html
,寫個 demo 的 index.html 。
<html>
<head></head>
<body>hello</body>
</html>
4. Httpd 常用命令
- httpd -v:查看 httpd 的版本號;
- httpd -l:查看編譯進 httpd 程序的靜態模塊;
- httpd -M:查看已經編譯進 httpd 程序的靜態模塊和已經加載的動態模塊。
5. 小結
Httpd 是上面幾種服務器誕生最早的一個,所以它的代碼經過長時間的修改和生產實際相對來說成熟很多,功能也很豐富,有強大的 rewrite
機制,模塊化按需加載,連工作模式都可以根據自己的需要在編譯的時候指定,但是因為靈活性比較高,初學者反而不容易掌握。