Apache安裝部署及工作模式

Apache安裝部署及工作模式


新版本的httpd-2.4新增一下特性:

新增模塊:

  • mod_proxy_fcgi(可提供 fcgi 代理)
  • mod_ratelimit(限制用戶帶寬)
  • mod_request(請求模塊,對請求做過濾)

對於基於 IP 的訪問控制做了修改,不再支持 allow,deny,order 機制,而是統一使用 require 進行

還新增以下幾條新特性;

  • 1、MPM 支持在運行時裝載;不過要開啓這種特性,在編譯安裝要啓用這三種功能;

–enable-mpms-shared=all --with-mpm=event

  • 2、支持 event
  • 3、支持異步讀寫
  • 4、在每個模塊及每個目錄上指定日誌級別
  • 5、增強版的表達式分析器
  • 6、每請求配置:If, Elseif
  • 7、毫秒級別的 keepalive timeout
  • 8、基於 FQDN 的虛擬主機不再需要 NameVirtualHost 指令
  • 9、支持使用自定義變量

一、部署apache

安裝環境:

操作系統:Centos7.5,關閉selinux

檢查http是否安裝,如查安裝則卸載

1、安裝apache2.4.23

(1)下載源碼包:

httpd-2.4.23.tar.gz

apr-1.5.2.tar.gz

apr-util-1.5.4.tar.gz

zlib-1.2.8.tar.gz

pcre-8.39.tar.gz

軟件鏈接
提取碼:kon7

注:apr(Apache Portable Runtime)Apache 可移植運行庫,它是一個對操作系統調用的抽 象庫,用來實現 Apache 內部組件對操作系統的使用,提高系統的可移植性。

(2)安裝apr和apr-util

apr

[root@apache ~]# tar zxf apr-1.5.2.tar.gz 
[root@apache ~]# cd  apr-1.5.2/
[root@apache apr-1.5.2]# ./configure --prefix=/usr/local/apr
[root@apache apr-1.5.2]# make && make install

apr-util

[root@apache ~]# tar zxf apr-util-1.5.4.tar.gz 
[root@apache ~]# cd  apr-util-1.5.4/
[root@apache apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@apache apr-util-1.5.4]# make && make install
(3)安裝zlib
[root@apache ~]# tar zxf zlib-1.2.8.tar.gz 
[root@apache ~]# cd  zlib-1.2.8/
[root@apache zlib-1.2.8]# ./configure --prefix=/usr/local/zlib
[root@apache zlib-1.2.8]# make && make install
(4)安裝pcre
[root@apache ~]# tar zxf pcre-8.39.tar.gz 
[root@apache ~]# cd  pcre-8.39/
[root@apache pcre-8.39]# ./configure --prefix=/usr/local/pcre
[root@apache pcre-8.39]# make && make install
(5)安裝openssl

安裝 apache2.4.23 時提示 openssl 版本過低,centos7 自帶版本 openssl-1.0.1e

下載openssl:

[root@apache ~]# wget https://www.openssl.org/source/openssl-1.0.1u.tar.gz

安裝:

[root@apache ~]# tar zxf openssl-1.0.1u.tar.gz 
[root@apache ~]# cd  openssl-1.0.1u/
[root@apache openssl-1.0.1u]# ./config -fPIC --prefix=/usr/local/openssl enable-shared
[root@apache openssl-1.0.1u]# make && make install
[root@apache ~]# mv /usr/bin/openssl /usr/bin/openssl.1.0.1e
[root@apache ~]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
(6)安裝apache2.4.23
[root@apache httpd-2.4.23]# ./configure --prefix=/usr/local/http-2.4.23 --enable-so \
>  --enable-cgi --enable-cgid --enable-ssl --with-ssl=/usr/local/openssl \
>  --enable-rewrite --with-pcre=/usr/local/pcre --with-z=/usr/local/zlib \
>  --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util \
>  --enable-modeles=most --enable-mods-shared=most --enable-mpms-shared=all \
>  --with-mpm=event --enable-proxy --enable-proxy-fcgi --enable-expires --enable-deflate

相關參數解釋:

--enable-so:支持動態共享模塊(即打開 DSO 支持)

--enable-rewrite:支持 url 重寫

--enable-ssl:支持 ssl

--with-ssl=/usr/local/openssl:指定 ssl 安裝位置

--enable-cgi:啓用 cgi

--enable-cgid:MPM 使用的是 event 或 worker 要啓用 cgid

--enable-modules=most:明確指明要靜態編譯到 httpd 二進制文件的模塊,爲 空格分隔的模塊名列表、all 或者 most,all 表示包含所有模塊,most 表示包含大部分常用模塊

--enable-mods-shared=most:明確指明要以 DSO 方式編譯的模塊,爲空格分隔 的模塊名列表、all 或者 most,all 表示包含所有模 塊,most 表示包含大部分模塊

--enable-mpms-shared=all:啓用 MPM 所有支持的模式,這樣 event、worker、prefork 就會以 模塊化的方式安裝,要用哪個就在 httpd.conf 裏配置就好了

--with-mpm=event:指定啓用的 mpm 模式,默認使用 enevt 模式,在 apache 的早期版本 2.0 默認 prefork,2.2 版本是 worker,2.4 版本是 event

--with-pcre=/usr/local/pcre:支持 pcre

--with-z=/usr/local/zlib:使用 zlib 壓縮庫

--with-apr=/usr/local/apr:指定 apr 的安裝路徑

--with-apr-util=/usr/local/apr-util:指定 apr-util 的安裝路徑

--enable-expires:激活彧通過配置文件控制 HTTP 的“Expires:”和“Cache-Control:”頭內容,即 對網站圖片、js、css 等內容,提供客戶端瀏覽器緩存的設置。這個是 apache 調優的一個重 要選項之一

--enable-deflate提供對內容的壓縮傳輸編碼支持,一般是 html、js、css 等內容的站點。使 用此參數會打打提高傳輸速度,提升訪問者訪問的體驗。在生產環境中,這是 apache 調優 的一個重要選項之一
[root@apache httpd-2.4.23]# make && make install
(7)優化http程序執行路徑
[root@apache ~]# ln -s /usr/local/http-2.4.23/bin/* /usr/local/bin/
1)修改配置文件 httpd.conf,設置其中的 ServerName 值

例如:ServerName www.benet.com

[root@apache ~]# vim  /usr/local/http-2.4.23/conf/httpd.conf
ServerName 127.0.0.1
2)開啓 apache 服務器:
[root@apache ~]# apachectl start
3)開機後自動啓動
[root@apache ~]# cp /usr/local/http-2.4.23/bin/apachectl /etc/init.d/httpd

編輯 /etc/init.d/httpd 文件,在首行 #!/bin/sh 下面加入兩行:

[root@apache ~]# vim /etc/init.d/httpd
# chkconfig: 35 85 15
# description: apache 2.4.23

chkconfig: 35 85 15 (在 3 和 5 啓動模式下的–啓動優先級)

將 Apache 加入開機自動啓動:

[root@apache ~]# chkconfig --add httpd
[root@apache ~]# chkconfig httpd on
(8)啓動編譯好的 Apache 2.4.23:
[root@apache ~]# systemctl start httpd
[root@apache ~]# netstat -anplt | grep 80
tcp6       0      0 :::80                   :::*                    LISTEN      51792/httpd
(9)客戶端測試訪問(注意防火牆)

2、Apache的優化配置

apache 所運行的硬件環境都是對性能影響最大的因素,即使不能對硬件進行升級,也最好 給 apache 一個單獨的主機以免受到其他應用的干擾。各個硬件指標中,對性能影響最大的 是內存,對於靜態內容(圖片、javascript 文件、css 文件等),它決定了 apache 可以緩存多 少內容,它緩存的內容越多,在硬盤上讀取內容的機會就越少,大內存可以極大提高靜態站 點的速度;對動態高負載站點來說,每個請求保存的時間更多一些,apache 的 mpm 模塊會 爲每個請求派生出相應的進程或線程分別處理,而進程或線程的數量與內存的消耗近似成正 比,因此增大內存對提高動態站點的負載和運行速度也極爲有利

其次是硬盤的速度,靜態站點尤爲突出,apache 不斷的在讀取文件併發送給相應的請求, 硬盤的讀寫是極其頻繁的;動態站點也要不斷的加載 web 程序(php 等),一個請求甚至要讀 取十幾個文件才能處理完成,因此儘可能的提高硬盤速度和質量對提高 apache 的性能是有 積極意義的

最後是 cpu 和網絡,cpu 影響的是 web 程序執行速度,網絡影響流量大小

二、Apache的工作模式

Apache HTTP 服務器被設計爲一個強大的、靈活的能夠在多種平臺以及不同環境下工作的服 務器。這種模塊化的設計就叫做“多進程處理模塊”(Multi-Processing Module,MPM),也叫 做工作模式

Prefork 模式(一個非線程型的):

其主要工作方式是:

當 Apache 服務器啓動後,mpm_prefork 模塊會預先創建多個子進程(默 認爲 5 個),每個子進程只有一個線程,當接收到客戶端的請求後,mpm_prefork 模塊再將 請求轉交給子進程處理,並且每個子進程同時只能用於處理單個請求。如果當前的請求數將 超過預先創建的子進程數時,mpm_prefork 模塊就會創建新的子進程來處理額外的請求。 Apache 總是試圖保持一些備用的或者是空閒的子進程用於迎接即將到來的請求。這樣客戶 端的請求就不需要在接收後等候子進程的產生

由於在 mpm_prefork 模塊中,每個請求對應一個子進程,因此其佔用的系統資源相對其他 兩種模塊而言較多。不過 mpm_prefork 模塊的優點在於它的每個子進程都會獨立處理對應 的單個請求,這樣,如果其中一個請求出現問題就不會影響到其他請求。Prefork 在效率上 要比 Worker 要高,但是內存使用大得多不擅長處理高併發的場景

Apache 在 prefork 工作模式下影響性能的重要參數說明
# prefork MPM
<IfModule mpm_prefork_module>
    StartServers             5
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers      250
    MaxConnectionsPerChild   500
</IfModule>

StartServers:

apache 啓動時候默認開始的子進程數

MinSpareServers:

最小的閒置子進程數

MaxSpareServers:

最大的閒置子進程數

MaxRequestWorkers:

MaxRequestWorkers 設置了允許同時的最大接入請求數量 任何 超 過 MaxRequestWorkers 限 制 的 請 求 將 進 入 等 候 隊 列 , 在 apache2.3.1 以 前 的 版 本 MaxRequestWorkers 被稱爲 MaxClients,舊的名字仍舊被支持

MaxConnectionsPerChild

設置的是每個子進程可處理的請求數。每個子進程在處理了“MaxConnectionsPerChild” 個請求後將自動銷燬。0 意味着無限,即子進程永不銷燬。雖然缺省設爲 0 可以使每個 子進程處理更多的請求,但如果設成非零值也有兩點重要的好處:

1、可防止意外的內 存泄漏

2、在服務器負載下降的時侯會自動減少子進程數。因此,可根據服務器的負 載來調整這個值。在 Apache2.3.9 之前稱之爲 MaxRequestsPerChild

注意:
注1

MaxRequestWorkers 是這些指令中最爲重要的一個,設定的是 Apache 可以同時處理 的請求,是對 Apache 性能影響最大的參數。如果請求總數已達到這個值(可通過 ps -ef|grep http|wc -l 來確認),那麼後面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源 還剩下很多而 HTTP 訪問卻很慢的主要原因。雖然理論上這個值越大,可以處理的請求就越 多,建議將初始值設爲(以 Mb 爲單位的最大物理內存/2),然後根據負載情況進行動態調整。 比如一臺 4G 內存的機器,那麼初始值就是 4000/2=2000

注2

prefork 控制進程在最初建立“StartServers”個子進程後,爲了滿足 MinSpareServers 設 置的需要創建一個進程,等待一秒鐘,繼續創建兩 個,再等待一秒鐘,繼續創建四個……如 此按指數級增加創建的進程數,最多達到每秒 32 個,直到滿足 MinSpareServers 設置的值爲止。這種模式 可以不必在請求到來時再產生新的進程,從而減小了系統開銷以增加性能。 MaxSpareServers 設置了最大的空閒進程數,如果空閒進程數大於這個 值,Apache 會自動 kill 掉一些多餘進程。這個值不要設得過大,但如果設的值比 MinSpareServers 小,Apache 會自 動把其調整爲 MinSpareServers+1。如果站點負載較大,可考慮同時加大 MinSpareServers 和 MaxSpareServers

注3

ServerLimit 和 MaxClients(MaxRequestWorkers)有什麼區別呢?

是因爲在 apache1 時代,控制最大進程數只有 MaxClients 這個參數,並且這個參數最大值爲 256,並且是寫死了的,試圖設置爲超過 256 是無效的,這是由於 apache1 時代的服務器硬 件限制的。但是 apache2 時代由於服務器硬件的升級,硬件已經不再是限制,所以使用 ServerLimit 這個參數來控制最大進程數,ServerLimit 值>=MaxClient 值纔有效。ServerLimit 要放在 MaxClients 之前,值要不小於 MaxClients

注4

查看 Apache 加載的模塊

[root@apache conf]# apachectl -t -D DUMP_MODULES[root@apache conf]# apachectl -M[root@apache conf]# apachectl -l  # 小寫 L,只顯示靜態模塊

如何查看 Apache 的工作模式呢?可以使用 httpd -V 命令查看,另外使用 httpd -l 也可以查 看到

注5

如何修改 prefork 參數和啓用 prefork 模式

[root@apache ~]# vim  /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf
<IfModule mpm_prefork_module>
    StartServers             5
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers      250
    MaxConnectionsPerChild 500
</IfModule>
[root@apache ~]# vim  /usr/local/http-2.4.23/conf/httpd.conf
# 註釋掉當前的工作模式,開啓新的工作模式
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
Include conf/extra/httpd-mpm.conf

重啓服務

[root@apache ~]# systemctl restart httpd

Worker 模式(多線程多進程):

和 prefork 模式相比,worker 使用了多進程和多線程的混合模式,worker 模式也同樣會先預 派生一些子進程,然後每個子進程創建一些線程,同時包括一個監聽線程,每個請求過來會 被分配到一個線程來服務。線程比起進程會更輕量,因爲線程是通過共享父進程的內存空間, 因此,內存的佔用會減少一些,在高併發的場景下會比 prefork 有更多可用的線程,表現會 更優秀一些;另外,如果一個線程出現了問題也會導致同一進程下的線程出現問題,如果是 多個線程出現問題,也只是影響 Apache 的一部分,而不是全部。由於用到多進程多線程, 需要考慮到線程的安全了,在使用 keep-alive 長連接的時候,某個線程會一直被佔用,即使 中間沒有請求,需要等待到超時纔會被釋放(該問題在 prefork 模式下也存在)

總的來說,prefork 方式速度要稍高於 worker,然而它需要的 cpu 和 memory 資源也稍多於 woker

Apache 在 worker 工作模式下影響性能的重要參數說明
# worker MPM
<IfModule mpm_worker_module>
    StartServers             3
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   0
</IfModule>

StartServers:apache 啓動時候默認開始的子進程數

MinSpareThreads:最小空閒數量的工作線程

MaxSpareThreads:最大空閒數量的工作線程

ThreadsPerChild:每個子進程產生的線程數量

MaxRequestWorkers:與 prefork 模式相同

MaxConnectionsPerChild:與 prefork 模式相同

注意
注1

Worker 由主控制進程生成“StartServers”個子進程,每個子進程中包含固定的 ThreadsPerChild 線程數,各個線程獨立地處理請求。同樣, 爲了不在請求到來時再生成線 程,MinSpareThreads 和 MaxSpareThreads 設置了最少和最多的空閒線程數;

而 MaxRequestWorkers 設置了同時連入的 clients 最大總數。如果現有子進程中的線程總數不 能滿足負載,控制進程將派生新的子進程

MinSpareThreads 和 MaxSpareThreads 的最大缺省值分別是 75 和 250。這兩個參數對 Apache 的性能影響並不大,可以按照實際情況相應調節

注2

ThreadsPerChild 是 worker MPM 中與性能相關最密切的指令。ThreadsPerChild 的最大 缺省值是 64,如果負載較大,64 也是不夠的。這時要顯式使用 ThreadLimit 指令,它的最大 缺省值是 20000。

注3

Worker 模式下所能同時處理的請求總數是由子進程總數乘以 ThreadsPerChild 值決定 的,應該大於等於 MaxRequestWorkers。如果負載很大,現有的子進程數不能滿足時,控制 進程會派生新的子進程。默認最大的子進程總數是 16,加大時 也需要顯式聲明 ServerLimit (系統配置的最大進程數量,最大值是 20000)。需要注意的是,如果顯式聲明瞭 ServerLimit, 那麼它乘以 ThreadsPerChild的值必須大於等於MaxRequestWorkers,而且MaxRequestWorkers 必須是 ThreadsPerChild 的整數倍,否則 Apache 將會自動調節到一個相應值

注4:進程與線程的區別

線程是指進程內的一個執行單元,也是進程內的可調度實體

與進程的區別:

(1)地址空間:進程內的一個執行單元;進程至少有一個線程;它們共享進程的地址空間;而進程 有自己獨立的地址空間;

(2)資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源

(3)線程是處理器調度的基本單位,但進程不是

(4)二者均可併發執行.

進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對 應用的併發性

進程和線程的區別在於:

簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.

線程的劃分尺度小於進程,使得多線程程序的併發性高。

另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程 序的運行效率

Event模式

這是 Apache 最新的工作模式,是 worker 模式的變種,它把服務進程從連接中分離出來,一 worker 模式不同的是在於它解決了 keep-alive 長連接的時候佔用線程資源被浪費的問題,在 event 工作模式中,會有一些專門的線程用來管理這些 keep-alive 類型的線程,當有真實請求過來的時候,將請求傳遞給服務器的線程,執行完畢後,又允許它釋放。這增強了在高並 發場景下的請求處理。event 模式不能很好的支持 https 的訪問(HTTP 認證相關的問題)

三、apache 配置參數

(1)KeepAlive On/Off

KeepAlive 指的是保持連接活躍,換一句話說,如果將 KeepAlive 設置爲 On,那麼來自 同一客戶端的請求就不需要再一次連接,避免每次請求都要新建一個連接而加重服務器的負 擔。一般情況下,圖片較多的網站應該把 KeepAlive 設爲 On

(2)KeepAliveTimeOut number

如果第二次請求和第一次請求之間超過 KeepAliveTimeOut 的時間的話,第一次連接就會 中斷,再新建第二個連接。它的設置一般考慮圖片或者 JS 等文件兩次請求間隔,一般設置 爲 3-5 秒

(3)MaxKeepAliveRequests 100

一次連接可以進行的 HTTP 請求的最大請求次數。將其值設爲 0 將支持在一次連接內進 行無限次的傳輸請求。事實上沒有客戶程序在一次連接中請求太多的頁面,通常達不到這個 上限就完成連接了

(4)HostnameLookups on|off|double

如果是使用 on,那麼只有進行一次反查,如果用 double,那麼進行反查之後還要進行一次 正向解析,只有兩次的結果互相符合纔行,而 off 就是不進行域名驗證。 如果爲了安全,建議使用 double;爲了加快訪問速度,建議使用 off。 域名查找開啓這個會增加 apache 的負擔, 減慢訪問速度建議關閉

(5)timeout 5

推薦 5 這個是 apache 接受請求或者發出相應的時間超過這個時間斷開

注:以上配置項可在/usr/local/http-2.4.23/conf/extra/httpd-default.conf 設置並在 httpd.conf 文件中通過 include 選項引用

MPM 這個比較關鍵是影響併發效率的主要因素

(1)StartServers 10

設置服務器啓動時建立的子進程數量。因爲子進程數量動態的取決於負載的輕重,所以 一般沒有必要調整這個參數

(2)MinSpareServers 10

設置空閒子進程的最小數量。所謂空閒子進程是指沒有正在處理請求的子進程。如果當 前空閒子進程數少於 MinSpareServers ,那麼 Apache 將以最大每秒一個的速度產生新的子進 程。只有在非常繁忙機器上才需要調整這個參數。將此參數設的太大通常是一個壞主意

(3)MaxSpareThreads 75

設置空閒子進程的最大數量。如果當前有超過 MaxSpareServers 數量的空閒子進程,那麼 父進程將殺死多餘的子進程。只有在非常繁忙機器上才需要調整這個參數。將此參數設的太 大通常是一個壞主意。如果你將該指令的值設置爲比 MinSpareServers 小,Apache 將會自動將 其修改成”MinSpareServers+1″

(4)ServerLimit 2000

服務器允許配置的進程數上限。只有在你需要將 MaxClients 設置成高於默認值 256 的時 候才需要使用。要將此指令的值保持和 MaxClients 一樣。修改此指令的值必須完全停止服務 後再啓動才能生效,以 restart 方式重啓動將不會生效

(5)MaxClients/MaxRequestWorkers 256

用於客戶端請求的最大請求數量(最大子進程數),任何超過 MaxClients 限制的請求都 將進入等候隊列。默認值是 256,如果要提高這個值必須同時提高 ServerLimit 的值。建議將初始值設爲(以 Mb 爲單位的最大物理內存/2),然後根據負載情況進行動態調整。比如一臺 4G 內存的機器,那麼初始值就是 4000/2=2000。

(6)MaxRequestsPerChild /MaxConnectionsPerChild 0

設置的是每個子進程可處理的請求數。每個子進程在處理了“MaxRequestsPerChild”個請 求後將自動銷燬。0 意味着無限,即子進程永不銷燬。內存較大的服務器可以設置爲 0 或較 大的數字。內存較小的服務器不妨設置成 30、50、100。所以一般情況下,如果你發現服務 器的內存直線上升,建議修改該參數試試

效,以 restart 方式重啓動將不會生效

(5)MaxClients/MaxRequestWorkers 256

用於客戶端請求的最大請求數量(最大子進程數),任何超過 MaxClients 限制的請求都 將進入等候隊列。默認值是 256,如果要提高這個值必須同時提高 ServerLimit 的值。建議將初始值設爲(以 Mb 爲單位的最大物理內存/2),然後根據負載情況進行動態調整。比如一臺 4G 內存的機器,那麼初始值就是 4000/2=2000。

(6)MaxRequestsPerChild /MaxConnectionsPerChild 0

設置的是每個子進程可處理的請求數。每個子進程在處理了“MaxRequestsPerChild”個請 求後將自動銷燬。0 意味着無限,即子進程永不銷燬。內存較大的服務器可以設置爲 0 或較 大的數字。內存較小的服務器不妨設置成 30、50、100。所以一般情況下,如果你發現服務 器的內存直線上升,建議修改該參數試試

注:以上配置項可在/usr/local/http-2.4.23/conf/extra/httpd-mpm.conf 設置並在 httpd.conf 文 件中通過 include 選項引用

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