文章目錄
apache 是什麼?
20世紀90年代初,國家超級計算機應用中心NCSA開發,1995年開源社區發佈apache(a patchyserver)
-
ASF: apache software foundation
-
FSF:Free Software Foundation
-
Apache 是使用最廣泛的 Web 服務器軟件。Apache 是由 Apache Software Foundation 開發和維護的,它是一個免費提供的開源軟件。它佔全球所有網絡服務器的 67%。它快速,可靠,安全。它可以通過使用擴展和模塊進行高度定製,以滿足許多不同環境的需求。大多數 WordPress 託管服務提供商使用 Apache 作爲其 Web 服務器軟件。但是,WordPress 也可以在其他 Web 服務器軟件上運行。
-
Apache Web Server 旨在創建能夠託管一個或多個基於 HTTP 的網站的 Web 服務器。值得注意的功能包括支持多種編程語言,服務器端腳本,身份驗證機制和數據庫支持。可以通過操縱代碼庫或添加多個擴展/附加組件來增強 Apache Web Server。
-
它也被 Web 託管公司廣泛用於提供共享/虛擬主機,因爲默認情況下,Apache Web Server 支持並區分駐留在同一臺機器上的不同主機。
apache 特性
- 高度模塊化:core + modules
- DSO:Dynamic Shared Object 動態加/卸載
- MPM:multi-processing module 多路處理模塊
apache 功能
- 虛擬主機:IP、Port、FQDN
- CGI:Common Gateway Interface,通用網關接口
- 反向代理
- 負載均衡
- 路徑別名
- 豐富的用戶認證機制:basic,digest
- 支持第三方模塊
httpd-2.4特性
- MPM支持運行爲DSO機制;以模塊形式按需加載
- event MPM生產環境可用
- 異步讀寫機制
- 支持每模塊及每目錄的單獨日誌級別定義
- 每請求相關的專用配置
- 增強版的表達式分析式
- 毫秒級持久連接時長定義
- 基於FQDN的虛擬主機不需要NameVirutalHost指令
- 新指令
- 支持用戶自定義變量
- 更低的內存消耗
MPM multi-processing module 工作模式
- prefork:多進程I/O模型,每個進程響應一個請求,CentOS7 默認模型
- 一個主進程:生成和回收n個子進程,創建套接字,不響應請求
- 多個子進程:工作work進程,每個子進程處理一個請求;
- 系統初始時,預先生成多個空閒進程,等待請求
-
Prefork MPM: 預派生模式,有一個主控制進程,然後生成多個子進程,每個子進程有一個獨立的線程響應用戶請求,相對比較佔用內存,但是比較穩定,可以設置最大和最小進程數,是最古老的一種模式,也是最穩定的模式,適用於訪問量不是很大的場景
- 優點:穩定
- 缺點:慢,佔用資源,不適用於高併發場景
-
worker: 複用的多進程I/O模型,多進程多線程,IIS使用此模型
- 一個主進程:生成m個子進程
- 每個子進程負責生成n個線程,每個線程響應一個請求,故能夠併發響應請求:m*n
- 比prefork模式節約資源,但一個線程出錯會影響所在進程的其他線程
-
worker MPM:是一種多進程和多線程混合的模型,有一個控制進程,啓動多個子進程,每個子進程裏面包含固定的線程,使用線程程來處理請求,當線程不夠使用的時候會再啓動一個新的子進程,然後在進程裏面再啓動線程處理請求,由於其使用了線程處理請求,因此可以承受更高的併發。
-
優點:相比prefork 佔用的內存較少,可以同時處理更多的請求
-
缺點:使用keep-alive的長連接方式,某個線程會一直被佔據,即使沒有傳輸數據,也需要一直等待到超時纔會被釋放。如果過多的線程,被這樣佔據,也會導致在高併發場景下的無服務線程可用。(該問題在prefork模式下,同樣會發生)
-
event: 事件驅動模型(worker模型的變種),CentOS8 默認模型
-
-
一個主進程:生成m個子進程,每個子進程負責生個n個線程,每個線程響應一個請求,併發響應請求:m*n,有專門的監控線程來管理這些keep-alive類型的線程,當有真實請求時,將請求傳遞給服務線程,執行完畢後,又允許釋放。這樣增強了高併發場景下的請求處理能力
-
event MPM:Apache中最新的模式,屬於事件驅動模型(epoll),每個進程響應多個請求,在現在版本里的已經是穩定可用的模式。它和worker模式很像,最大的區別在於,它解決了keep-alive場景下,長期被佔用的線程的資源浪費問題(某些線程因爲被keep-alive,空掛在哪裏等待,中間幾乎沒有請求過來,甚至等到超時)。
-
event MPM中,會有一個專門的線程來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務線程,執行完畢後,又允許它釋放。這樣增強了高併發場景下的請求處理能力
-
event只在有數據發送的時候纔開始建立連接,連接請求才會觸發工作線程,即使用了TCP的一個選項,叫做延遲接受連接TCP_DEFER_ACCEPT,加了這個選項後,若客戶端只進行TCP連接,不發送請求,則不會觸發Accept操作,也就不會觸發工作線程去幹活,進行了簡單的防攻擊(TCP連接)
-
優點:單線程響應多請求,佔據更少的內存,高併發下表現更優秀,會有一個專門的線程來管理keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務線程,執行完畢後,又允許它釋放
-
缺點:沒有線程安全控制
-
httpd-2.4 相關文件
- 配置文件
- /etc/httpd/conf/httpd.conf 主配置文件
- /etc/httpd/conf.d/*.conf 子配置文件
- /etc/httpd/conf.d/conf.modules.d/ 模塊加載的配置文件
- 檢查配置語法:httpd –t
- 查看靜態編譯的模塊:httpd -l
- 查看靜態編譯及動態裝載的模塊:httpd –M
- 服務單元文件:
- /usr/lib/systemd/system/httpd.service
- 配置文件:/etc/sysconfig/httpd
- 服務控制和啓動
- systemctl enable|disable httpd.service
- systemctl {start|stop|restart|status|reload} httpd.service
- 站點網頁文檔根目錄:/var/www/html
- 模塊文件路徑:
- /etc/httpd/modules
- usr/lib64/httpd/modules
- 主服務器程序文件: /usr/sbin/httpd
- 主進程文件: /etc/httpd/run/httpd.pid
- 日誌文件目錄:/var/log/httpd
- access_log: 訪問日誌
- error_log:錯誤日誌
- 幫助文檔包:httpd-manual
httpd配置文件的組成
主要組成:
- 全局配置:Global Environment
- 主服務器配置:Main server configuration
- 虛擬主機配置:virtual host
配置文件格式:directive value (指令 值)
- directive:不區分字符大小寫
- value:當爲路徑時,是否區分大小寫取決於文件系統
httpd 常見配置
顯示服務器版本信息
[uctOnly]|OS|Full
ServerTokens Prod[uctOnly] :Server: Apache
ServerTokens Major: Server: Apache/2
ServerTokens Minor: Server: Apache/2.0
ServerTokens Min[imal]: Server: Apache/2.0.41
ServerTokens OS: Server: Apache/2.0.41 (Unix)
ServerTokens Full (or not specified): Server: Apache/2.0.41 (Unix) PHP/4.2.2
MyMod/1.2
建議使用:ServerTokens Prod
//在遠程主機開啓相關服務,查看顯示如下
[root@node-17 ~]# curl -I 192.168.26.37
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Mon, 09 Dec 2019 08:44:32 GMT
Content-Type: text/html
Content-Length: 246
Last-Modified: Sat, 07 Dec 2019 10:41:35 GMT
Connection: keep-alive
ETag: "5deb81df-f6"
Accept-Ranges: bytes
//準備修改文件,主配置文件最好別動,手動創建一個被服務包含的子配置文件
[root@node-17 ~]# ansible 192.168.26.37 -a "/bin/echo 'servertokens prod' > /etc/httpd/conf.d/son_conf.conf"
-------------------------------------------------
//重啓httpd服務
[root@node-17 ~]# ansible 192.168.26.37 -m service -a "name=httpd state=restarted"
--------------------------------------------------
//查看顯示如下
[root@node-17 ~]# curl -I 192.168.26.37
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Mon, 09 Dec 2019 08:59:24 GMT
Content-Type: text/html
Content-Length: 246
Last-Modified: Sat, 07 Dec 2019 10:41:35 GMT
Connection: keep-alive
ETag: "5deb81df-f6"
Accept-Ranges: bytes
修改監聽的IP和Port
- 設置格式:Listen [IP:]PORT
- 省略IP表示爲0.0.0.0
- Listen指令至少一個,可重複出現多次
- Listen 80
- Listen 8080
- 修改監聽socket,重載服務進程方可生效
注意:必須有端口號設置,否則服務啓動失敗
//修改服務器端口192.168.26.37只能通過8080端口訪問
[root@node-37 ~]# vim /etc/httpd/conf/httpd.conf
//配置文件修改或添加下列內容
Listen 192.168.26.37:8080
------------------------------------------------
//測試
[root@node-17 ~]# curl -I 192.168.26.37
curl: (7) Failed connect to 192.168.26.37:80; Connection refused
------------------------------------------------
//必須使用8080端口才能連接詞IP
[root@node-17 ~]# curl -I 192.168.26.37:8080
HTTP/1.1 200 OK
Date: Mon, 09 Dec 2019 09:39:35 GMT
Server: Apache
Last-Modified: Sat, 07 Dec 2019 07:39:53 GMT
ETag: "f6-5991844a8a4fe"
Accept-Ranges: bytes
Content-Length: 246
Content-Type: text/html; charset=UTF-8
持久連接
- 定義:連接建立,每個資源獲取完成後不會斷開連接,而是繼續等待其它的請求完
成,默認關閉持久連接 - 斷開條件:時間限制:以秒爲單位, 默認5s,httpd-2.4 支持毫秒級
- 副作用:對併發訪問量大的服務器,持久連接會使有些請求得不到響應
- 折衷:使用較短的持久連接時間
- 設置格式
- KeepAlive On|Off
- KeepAliveTimeout 15 #連接持續15s,可以以ms爲單位,默認值爲5s
- MaxKeepAliveRequests 500 #持久連接最大接收的請求數,默認值100
- 測試方法
telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
Host: WEB_SERVER_IP
- 測試實例
//編輯之前創建的子配置文件
[root@node-37 ~]# vim /etc/httpd/conf.d/son_conf.conf
servertokens prod
//開啓持久連接
keepalive on
//設置連接爲60秒,默認爲5秒
keepalivetimeout 100
-----------------------------------------------
telnet 192.168.26.37:8080
date
MPM (Multi-Processing Module) 多路處理模塊
httpd 支持三種MPM工作模式:prefork、worker、event
- httpd-2.4不支持同時編譯多個模塊,所以只能編譯時選定一個
- 查詢當前MPM模式
[root@node-37 ~]# httpd -M | grep mpm
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::20c:29ff:fe63:1feb. Set the 'ServerName' directive globally to suppress this message
mpm_prefork_module (shared)
-
切換正在使用的MPM模式
-
注意不要同時啓用多個模塊,否則會報錯
AH00534: httpd: Configuration error: More than one MPM loaded. -
範例:查看各個版本默認的MPM模式
/ Centos6 默認的模式
[root@Centos6 ~]#httpd -v
Server version: Apache/2.2.15 (Unix) / 默認使用的版本
Server built: Jun 19 2018 15:45:13
[root@Centos6 ~]#httpd -M |grep mpm
httpd: apr_sockaddr_info_get() failed for Centos6.localdomain
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
mpm_prefork_module (static)
/ Centos7 默認模式
[root@Centos7 ~]# httpd -v / 默認使用的版本
Server version: Apache/2.4.6 (CentOS)
Server built: Aug 8 2019 11:41:18
[root@Centos7 ~]# httpd -M | grep mpm
mpm_prefork_module (shared)
/ Centos8 默認模式
[root@Centos8 ~]#httpd -v
Server version: Apache/2.4.37 (centos) / 默認使用的版本
Server built: Oct 7 2019 21:42:02
[root@Centos8 ~]#httpd -M | grep mpm
mpm_event_module (shared)
- 示例:修改Centos7模式
//編輯修改文件啓用prefork模式,如下圖
[root@node-37 ~]# vim /etc/httpd/conf.modules.d/00-mpm.conf
查看模塊
- 查看靜態編譯的模塊 httpd -l
- 查看靜態編譯及動態裝載的模塊 httpd -M
- 動態模塊加載:不需重啓即生效
- 動態模塊路徑:/usr/lib64/httpd/modules/
切換正在使用的httpd模式
centos6 httpd-2.2 MPM設置
修改文件
/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker
HTTPD=/usr/sbin/httpd.event
默認爲prefork模式
配置後重啓httpd server生效
------------------------------------
centos7 httpd-2.4 MPM設置
修改文件 /etc/httpd/conf.modules.d/00-mpm.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule mpm_event_module modules/mod_mpm_event.so
prefork默認設置
vim /etc/httpd/conf/httpd.conf / Centos6 httpd-2.2版本
vim /usr/share/doc/httpd-2.4.6/httpd-mpm.conf / Centos7 httpd-2.4版本
<IfModule prefork.c>
StartServers 8 / 啓動開啓的進程數
MinSpareServers 5 / 最少空閒進程數
MaxSpareServers 20 / 最大空閒進程數
ServerLimit 256 / 最多進程數,不能超過MaxClient,最大能設置爲20000
MaxClients 256 / 最大併發數
MaxRequestsPerChild 4000 / 子進程最多能處理的請求,達到設置值子進程被父進程終止,釋放內存
/ 從 httpd.2.3.9開始被MaxConnectionsPerChild代替
</IfModule>
worker和event 模式相關的配置
vim /etc/httpd/conf/httpd.conf / Centos6 httpd-2.2版本
vim /usr/share/doc/httpd-2.4.6/httpd-mpm.conf / Centos7 httpd-2.4版本
<IfModule mpm_worker_module>
StartServers 3 #服務開啓時默認進程數
MinSpareThreads 75 #最小線程數
MaxSpareThreads 220 #最大線程數
ThreadsPerChild 25 #
MaxRequestWorkers 400 #最大併發數
MaxConnectionsPerChild 0 #無限制永不釋放
</IfModule>
-
啓動時開啓3個進程,每個進程開啓75個線程,共225個線程,但最多空閒220個線程,需要結束1個進程共75個線程,故開啓服務後實際只能開到2個進程共150個線程
-
示例修改啓動進程以及線程數量
/ MPM各個模塊相關設置文件在httpd-mpm.conf文件裏面
locate httpd-mpm.conf
//編輯修改MPM模塊配置文件
vim /usr/share/doc/httpd-2.4.6/httpd-mpm.conf
<IfModule mpm_prefork_module>
StartServers 100
MinSpareServers 50
MaxSpareServers 60
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule>
-----------------------------------------
//需在主配置文件加載這個httpd-mpm.conf配置文件,因爲服務默認不加載這個文件
vim /etc/httpd/conf/httpd.conf
//在主配置文件中添加文件路徑
Include /usr/share/doc/httpd-2.4.6/httpd-mpm.conf
//重啓服務
systemctl restart httpd
//查看得,生效
[root@Centos7 httpd]# pstree
systemd─┬─agetty
├─auditd───{auditd}
├─crond
├─dbus-daemon
├─httpd───98*[httpd]
DSO(Dynamic Shared Object):動態加載模塊
- 加載動態模塊配置文件
//編輯配置文件查看得
vim /etc/http/conf/httpd.conf
ServerRoot "/etc/httpd" //動態加載模塊默認地址
Include conf.modules.d/*.conf
- 配置指定模塊加載格式:
LoadModule <mod_name> <mod_path> - 模塊文件路徑使用相對路徑:
相對於ServerRoot(默認/etc/httpd) - 範例:取消加載模塊auth_basic_module
[root@Centos7 httpd]# vim /etc/httpd/conf.modules.d/00-base.conf
#LoadModule auth_basic_module modules/mod_auth_basic.so / 註釋即可
[root@Centos7 httpd]# httpd -t
Syntax OK
[root@Centos7 httpd]# systemctl restart httpd
[root@Centos7 httpd]# httpd -M | grep auth_basic