亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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 組成。這些模塊大都是動態模塊,因此可以隨時加載。

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 機制,模塊化按需加載,連工作模式都可以根據自己的需要在編譯的時候指定,但是因為靈活性比較高,初學者反而不容易掌握。