Linux進階-淺談apache

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章