Linux下apache性能配置調優

Apache 性能配置優化

###httpd 相關查看命令瞭解
查看當前安裝模塊mpm(多路處理器)
[root@localhost ~]# httpd -l
查看httpd進程數(即各個mpm模式下Apache能夠處理的併發請求數)
[root@localhost ~]# ps -ef | grep httpd | wc -l
得到的結果數字就是表示可以同時併發的進程數據,一個父進程,5個子進程。apache默認是開啓5個子進程
查看Apache的併發請求數及其TCP連接狀態
[root@localhost ~]# netstat -n | awk '/^tcp/ { S[$NF]} END {for(a in S) print a, S[a]}'
    ESTABLISHED
---
-        CLOSED:無連接是活動的或正在進行
-        LISTEN:服務器在等待進入呼叫
-        SYN_RECV:一個連接請求已經到達,等待確認
-        SYN_SENT:應用已經開始,打開一個連接
-        ESTABLISHED:正常數據傳輸狀態
-        FIN_WAIT1:應用說它已經完成
-        FIN_WAIT2:另一邊已同意釋放
-        ITMED_WAIT:等待所有分組死掉
-        CLOSING:兩邊同時嘗試關閉
-        TIME_WAIT:另一邊已初始化一個釋放
-        LAST_ACK:等待所有分組死掉
查看請求80服務的client ip按照連接數排序。
[root@localhost ~]# netstat -nat|grep ":80"|awk '{print $5}' |awk -F: '{print $1}' | sort| uniq -c|sort -n
查看apache詳細鏈接情況
[root@localhost ~]# netstat -aptol
檢測某一臺服務器的端口是否開啓狀態
[root@localhost ~]# nc -v -w 10 -z 172.20.206.147 25801
驗證apache2配置是否正確
[root@localhost ~]# httpd -t
###apache模塊啓用
模塊介紹:Apache 各個模塊功能 基本(B)模塊默認包含,必須明確禁用;擴展(E)/實驗(X)模塊默認不包含,必須明確啓用。
        模塊名稱    狀態    簡要描述
        mod_actions (B) 基於媒體類型或請求方法,爲執行CGI腳本而提供
        mod_alias (B) 提供從文件系統的不同部分到文檔樹的映射和URL重定向
        mod_asis (B) 發送自己包含HTTP頭內容的文件
        mod_auth_basic (B) 使用基本認證
        mod_authn_default (B) 在未正確配置認證模塊的情況下簡單拒絕一切認證信息
        mod_authn_file (B) 使用純文本文件爲認證提供支持
        mod_authz_default (B) 在未正確配置授權支持模塊的情況下簡單拒絕一切授權請求
        mod_authz_groupfile (B) 使用純文本文件爲組提供授權支持
        mod_authz_host (B) 供基於主機名、IP地址、請求特徵的訪問控制
        mod_authz_user (B) 基於每個用戶提供授權支持
        mod_autoindex (B) 自動對目錄中的內容生成列表,類似於"ls"或"dir"命令
        mod_cgi (B) 在非線程型MPM(prefork)上提供對CGI腳本執行的支持
        mod_cgid (B) 在線程型MPM(worker)上用一個外部CGI守護進程執行CGI腳本
        mod_dir (B) 指定目錄索引文件以及爲目錄提供"尾斜槓"重定向
        mod_env (B) 允許Apache修改或清除傳送到CGI腳本和SSI頁面的環境變量
        mod_filter (B) 根據上下文實際情況對輸出過濾器進行動態配置
        mod_imagemap (B) 處理服務器端圖像映射
        mod_include (B) 實現服務端包含文檔(SSI)處理
        mod_isapi (B) 僅限於在Windows平臺上實現ISAPI擴展
        mod_log_config (B) 允許記錄日誌和定製日誌文件格式
        mod_mime (B) 根據文件擴展名決定應答的行爲(處理器/過濾器)和內容(MIME類型/語言/字符集/編碼)
        mod_negotiation (B) 提供內容協商支持
        mod_nw_ssl (B) 僅限於在NetWare平臺上實現SSL加密支持
        mod_setenvif (B) 根據客戶端請求頭字段設置環境變量
        mod_status (B) 生成描述服務器狀態的Web頁面
        mod_userdir (B) 允許用戶從自己的主目錄中提供頁面(使用"/~username")
        mod_auth_digest (X) 使用MD5摘要認證(更安全,但是隻有最新的瀏覽器才支持)
        mod_authn_alias (E) 基於實際認證支持者創建擴展的認證支持者,併爲它起一個別名以便於引用
        mod_authn_anon (E) 提供匿名用戶認證支持
        mod_authn_dbd (E) 使用SQL數據庫爲認證提供支持
        mod_authn_dbm (E) 使用DBM數據庫爲認證提供支持
        mod_authnz_ldap (E) 允許使用一個LDAP目錄存儲用戶名和密碼數據庫來執行基本認證和授權
        mod_authz_dbm (E) 使用DBM數據庫文件爲組提供授權支持
        mod_authz_owner (E) 基於文件的所有者進行授權
        mod_cache (E) 基於URI鍵的內容動態緩衝(內存或磁盤)
        mod_cern_meta (E) 允許Apache使用CERN httpd元文件,從而可以在發送文件時對頭進行修改
        mod_charset_lite (X) 允許對頁面進行字符集轉換
        mod_dav (E) 允許Apache提供DAV協議支持
        mod_dav_fs (E) 爲mod_dav訪問服務器上的文件系統提供支持
        mod_dav_lock (E) 爲mod_dav鎖定服務器上的文件提供支持
        mod_dbd (E) 管理SQL數據庫連接,爲需要數據庫功能的模塊提供支持
        mod_deflate (E) 壓縮發送給客戶端的內容
        mod_disk_cache (E) 基於磁盤的緩衝管理器
        mod_dumpio (E) 將所有I/O操作轉儲到錯誤日誌中
        mod_echo (X) 一個很簡單的協議演示模塊
        mod_example (X) 一個很簡單的Apache模塊API演示模塊
        mod_expires (E) 允許通過配置文件控制HTTP的"Expires:"和"Cache-Control:"頭內容
        mod_ext_filter (E) 使用外部程序作爲過濾器
        mod_file_cache (X) 提供文件描述符緩存支持,從而提高Apache性能
        mod_headers (E) 允許通過配置文件控制任意的HTTP請求和應答頭信息
        mod_ident (E) 實現RFC1413規定的ident查找
        mod_info (E) 生成Apache配置情況的Web頁面
        mod_ldap (E) 爲其它LDAP模塊提供LDAP連接池和結果緩衝服務
        mod_log_forensic (E) 實現"對比日誌",即在請求被處理之前和處理完成之後進行兩次記錄
        mod_logio (E) 對每個請求的輸入/輸出字節數以及HTTP頭進行日誌記錄
        mod_mem_cache (E) 基於內存的緩衝管理器
        mod_mime_magic (E) 通過讀取部分文件內容自動猜測文件的MIME類型
        mod_proxy (E) 提供HTTP/1.1的代理/網關功能支持
        mod_proxy_ajp (E) mod_proxy的擴展,提供Apache JServ Protocol支持
        mod_proxy_balancer (E) mod_proxy的擴展,提供負載平衡支持
        mod_proxy_connect (E) mod_proxy的擴展,提供對處理HTTP CONNECT方法的支持
        mod_proxy_ftp (E) mod_proxy的FTP支持模塊
        mod_proxy_http (E) mod_proxy的HTTP支持模塊
        mod_rewrite (E) 一個基於一定規則的實時重寫URL請求的引擎
        mod_so (E) 允許運行時加載DSO模塊
        mod_speling (E) 自動糾正URL中的拼寫錯誤
        mod_ssl (E) 使用安全套接字層(SSL)和傳輸層安全(TLS)協議實現高強度加密傳輸
        mod_suexec (E) 使用與調用web服務器的用戶不同的用戶身份來運行CGI和SSI程序
        mod_unique_id (E) 爲每個請求生成唯一的標識以便跟蹤
        mod_usertrack (E) 使用Session跟蹤用戶(會發送很多Cookie),以記錄用戶的點擊流
        mod_version (E) 提供基於版本的配置段支持
        mod_vhost_alias (E) 提供大批量虛擬主機的動態配置支持
###性能調優,模塊啓用/關閉
    (1)啓用壓縮
        LoadModule deflate_module modules/mod_deflate.so
    (2)啓用重寫
        LoadModule rewrite_module modules/mod_rewrite.so  
    (3)啓用默認擴展,支持在這裏進行修改httpd主要配置
        Include conf/extra/httpd-default.conf  
    (4)提供文件描述符緩存支持,從而提高Apache性能
        LoadModule file_cache_module modules/mod_file_cache.so
    (5)啓用基於URI鍵的內容動態緩衝(內存或磁盤)  
        LoadModule cache_module modules/mod_cache.so  
    (6)啓用基於磁盤的緩衝管理器
        LoadModule cache_disk_module modules/mod_cache_disk.so  
    (7)基於內存的緩衝管理器
        LoadModule socache_memcache_module modules/mod_socache_memcache.so 
    (8)屏蔽所有不必要的模塊
        #LoadModule authn_file_module modules/mod_authn_file.so  
        #LoadModule authn_dbm_module modules/mod_authn_dbm.so  
        #LoadModule authn_anon_module modules/mod_authn_anon.so  
        #LoadModule authn_dbd_module modules/mod_authn_dbd.so  
        #LoadModule authn_socache_module modules/mod_authn_socache.so  
        #LoadModule authn_core_module modules/mod_authn_core.so  
        #LoadModule authz_host_module modules/mod_authz_host.so  
        #LoadModule authz_groupfile_module modules/mod_authz_groupfile.so  
        #LoadModule authz_user_module modules/mod_authz_user.so  
        #LoadModule authz_dbm_module modules/mod_authz_dbm.so  
        #LoadModule authz_owner_module modules/mod_authz_owner.so  
        #LoadModule authz_dbd_module modules/mod_authz_dbd.so  
        LoadModule authz_core_module modules/mod_authz_core.so  
        LoadModule access_compat_module modules/mod_access_compat.so  
        #LoadModule auth_basic_module modules/mod_auth_basic.so  
        #LoadModule auth_form_module modules/mod_auth_form.so  
        #LoadModule auth_digest_module modules/mod_auth_digest.so 
    (9)已經過時屏蔽
        #LoadModule autoindex_module modules/mod_autoindex.so
    (10)用於定義缺省文檔index.php、index.jsp等
        LoadModule dir_module modules/mod_dir.so
    (11)用於定義記錄文件格式
        LoadModule log_config_module modules/mod_log_config.so
    (12)定義文件類型的關聯
        LoadModule mime_module modules/mod_mime.so
    (13)減少10%左右的重複請求
        LoadModule expires_module modules/mod_expires.so  
    (14)允許apache修改或清除傳遞到cgi或ssi頁面的環境變量
        LoadModule env_module modules/mod_env.so
    (15)根據客戶端請求頭字段設置環境變量,如果不需要則屏蔽掉
        #LoadModule setenvif_module modules/mod_setenvif.so
    (16)生成描述服務器狀態的頁面
        #LoadModule status_module modules/mod_status.so
    (17)別名
        LoadModule alias_module modules/mod_alias.so
    (18)url地址重寫模塊
        LoadModule rewrite_module modules/mod_rewrite.so
    (19)jk_mod 負載均衡調度模塊
        LoadModule    jk_module modules/mod_jk.so 
    (20)過濾模塊,使用緩存必須啓用過濾模塊
        LoadModule filter_module modules/mod_filter.so 
    (21)關閉服務器版本信息
        LoadModule version_module modules/mod_version.so
    (22)自動修正用戶輸入的url錯誤 
        LoadModule speling_module modules/mod_speling.so
###apache2 擴展配置文件說明
httpd-autoindex.conf            自動索引配置
httpd-dav.conf                  WebDAV配置
httpd-default.conf              Apache的默認配置
httpd-info.conf                 mod_status, mod_info模塊配置
httpd-languages.conf            Apache多語言配置支持
httpd-manual.conf               在網站上提供Apache手冊
httpd-mpm.conf                  多路處理模塊配置文件
httpd-multilang-errordoc.conf   實現多語言的錯誤信息
httpd-ssl.conf                  SSL配置
httpd-userdir.conf              配置用戶目錄
httpd-vhosts.conf               虛擬主機配置
###性能指標計算方法
提供下面這個公式,以供大家在平時或者日常需要進行的性能測試中作爲一個參考。
(1) 計算平均的併發用戶數:C = nL/T

  公式(1)中,C是平均的併發用戶數;n是login session的數量;L是login session的平均長度;T指考察的時間段長度。

(2) 併發用戶數峯值:C’ ≈ C+3根號C

  公式(2)則給出了併發用戶數峯值的計算方式中,其中,C’指併發用戶數的峯值,C就是公式(1)中得到的平均的併發用戶數。該公式的得出是假設用戶的loginsession產生符合泊松分佈而估算得到的。

實例:
假設有一個OA系統,該系統有3000個用戶,平均每天大約有400個用戶要訪問該系統,對一個典型用戶來說,一天之內用戶從登錄到退出該系統的平均時間爲4小時,在一天的時間內,用戶只在8小時內使用該系統。
則根據公式(1)和公式(2),可以得到:

C = 400*4/8 = 200

C’≈200+3*根號200 = 242

F=VU * R / T

其中F爲吞吐量,VU表示虛擬用戶個數,R表示每個虛擬用戶發出的請求數,T表示性能測試所用的時間

R = T / TS。
影響和評估性能的幾個關鍵指標
從上面的公式一節中我們還得到了一個名詞“吐吞量”。和吞吐量相關的有下面這些概念,記錄下來以供參考。

吞吐量:
指在一次性能測試過程中網絡上傳輸的數據量的總和。
對於交互式應用來說,吞吐量指標反映的是服務器承受的壓力,在容量規劃的測試中,吞吐量是一個重點關注的指標,因爲它能夠說明系統級別的負載能力,另外,在性能調優過程中,吞吐量指標也有重要的價值。

吞吐率:
單位時間內網絡上傳輸的數據量,也可以指單位時間內處理客戶請求數量。它是衡量網絡性能的重要指標,通常情況下,吞吐率用“字節數/秒”來衡量,當然,你可以用“請求數/秒”和“頁面數/秒”來衡量。
其實,不管是一個請求還是一個頁面,它的本質都是在網絡上傳輸的數據,那麼來表示數據的單位就是字節數。

事務:
就是用戶某一步或幾步操作的集合。不過,我們要保證它有一個完整意義。比如用戶對某一個頁面的一次請求,用戶對某系統的一次登錄,淘寶用戶對商品的一次確認支付過程。這些我們都可以看作一個事務。
那麼如何衡量服務器對事務的處理能力。又引出一個概念—-TPS

TPS (Transaction Per second):
每秒鐘系統能夠處理事務或交易的數量,它是衡量系統處理能力的重要指標。

點擊率(Hit Per Second):
點擊率可以看做是TPS的一種特定情況。點擊率更能體現用戶端對服務器的壓力。TPS更能體現服務器對客戶請求的處理能力。

每秒鐘用戶向web服務器提交的HTTP請求數。這個指標是web 應用特有的一個指標;web應用是“請求-響應”模式,用戶發一個申請,服務器就要處理一次,所以點擊是web應用能夠處理的交易的最小單位。
如果把每次點擊定義爲一個交易,點擊率和TPS就是一個概念。容易看出,點擊率越大。對服務器的壓力也越大,點擊率只是一個性能參考指標,重要的是分析點擊時產生的影響。

需要注意的是,這裏的點擊不是指鼠標的一次“單擊”操作,因爲一次“單擊”操作中,客戶端可能向服務器發現多個HTTP請求。

吞吐量指標的作用:
用戶協助設計性能測試場景,以及衡量性能測試場景是否達到了預期的設計目標:在設計性能測試場景時,吞吐量可被用戶協助設計性能測試場景,根據估算的吞吐量數據,可以對應到測試場景的事務發生頻率,事務發生次數等;
另外,在測試完成後,根據實際的吞吐量可以衡量測試是否達到了預期的目標。
用於協助分析性能瓶頸:吞吐量的限制是性能瓶頸的一種重要表現形式,因此,有針對性地對吞吐量設計測試,可以協助儘快定位到性能冰晶所在位置。

平均相應時間:
也稱爲系統響應時間,它一般指在指定數量的VU情況下,每筆交易從mouse 的click到IE的數據刷新與展示之間的間隔,比如說:250個VU下每筆交易的響應時間不超過2秒。
當然,響應時間也不能一概而論,對於實時交易如果銀行櫃檯操作、超市收銀員(邪惡的笑。。。)的操作、證交所交易員的操作來說這些操作的響應時間當然是越快越好,而對於一些企業級的如:
與銀行T+1交易間的數據跑批、延時交易、T+1報表等,你要求它在2秒內響應,它也做不到啊。就好比你有個1MB的帶寬,你傳的東西是超過4MB,你要它在2秒內跑完理論速度也做不到啊,對吧,所以有些報表或者數據,
光前面傳輸時間就不止兩秒了。

###apache2自帶的壓力測試工具ab
 ab最常用的語法格式是這樣的
[root@localhost ~]# ab -n XXX -c YYY -k http://hostname.port/path/filename
    -n XXX:表示最多進行XXX次測試。也就是下載filename文件XXX次。
    -c YYY:客戶端併發連接個數。
    -k:啓用HTTP KeepAlive功能。默認不啓用KeepAlive功能。
ab必須安裝在客戶端上,並且客戶端機器配置性能要高些。
比如我們要對http://hostname:port/file.com下載10000次進行測試,併發訪問爲60個,啓用HTTP KeepAlive功能,則訪問指令爲
[root@localhost ~]# ab -n 10000 -c 60 -k http://hostname:port/file.htm
Java的壓力測試工具Jmeter
Jmeter 是apache開發的基於Java的壓力測試工具。

###apache多路處理器MPM
目前apache2.4版本已經event MPM納入正式版,不再是實驗狀態。安裝時,apache已經自動將event MPM一起安裝進去,通過apachectl -l可以查看到event.c模塊。由此可以看到,event MPM已經成爲apache默認的MPM工作模式。
vim /etc/httpd/conf/httpd.conf

Include conf.modules.d/*.conf

(1)啓用MPM
vim /etc/httpd/conf.modules.d/00-mpm.conf

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

(2)配置MPM參數
1、選擇合適的MPM(Multi -Processing Modules, 多處理模塊)
Unix/Linux平臺,有3中PMP:event,prefork及worker。在全部平臺中,MPM 都可以構建爲靜態模塊。在構建時選擇一種 MPM,鏈接到服務器中。如果要改變 MPM,必須重新構建。要求更高伸縮性的站點可以選擇使用線程的 MPM,即worker 或 event;
要求可靠性或者與舊軟件兼容的站點可以使用prefork。

查看當前服務器使用的是哪種MPM
# httpd -l
Compiled in modules:

  core.c
  prefork.c
  http_core.c
  mod_so.c

如上,根據帶背景色內容可推斷出來使用的prefork MPM
####prefork:
實現非線程、預派生的web服務器。每個服務器進程響應進入的請求,父進程處理服務器池大小。適合需要兼容非線程安全的類庫的站點。因爲使用的是進程,所以,如果某個請求出現故障,不會影響其它請求,用於隔離每個請求的最好的MPM。
該MPM自我調節性強,極少需要調整其配置指令。最重要的是,MaxRequestWorkers要足夠大,以處理儘可能多的請求,但同時也不能太大,確保有足夠的物理內存來處理請求。
####工作原理:
單個控制進程負責啓動子進程,子進程負責監聽連接請求並在請求到達時進行除處理。Apache httpd總是儘量保持空閒,爲處理進入的請求做好準備。按這種方式,客戶端請求被處理之前,客戶端無需等待服務器派生一個新的子進程。
爲了綁定到80端口,Unix下父進程通常以root身份啓動,子進程則以更少權限的用戶身份,由Apache httpd啓動。User 和 Group 指令用於設置Apache httpd子進程的權限。
當遇到極大的併發問題時,該MPM使用mpm-accept mutex 來序列化即將到達連接的訪問。可通過Mutex進行配置該mutext的配置。
參考連接:https://httpd.apache.org/docs/2.4/en/mod/prefork.html

####worker:
實現多進程,多線程混合服務器。相比基於進程的服務器,worker使用線程服務器請求,可處理大量請求,同時消耗更少的內存。同時,擁有多進程處理方式,讓其仍擁有有基於進程服務器的穩定性。
用於控制MPM最重要的指令爲ThreadsPerChild和MaxRequestWorkers,其中,ThreadsPerChild控制每個子進程使用的線程數量,MaxRequestWorkers控制線程的最大總數
####工作原理:
同prefork,單個控制進程負責啓動子進程,每個子進程創建由ThreadsPerChild指定的固定數量的線程,以及用於負責監聽連接請求,並在請求到達時將其傳遞給服務器線程的監聽線程。
參考連接:https://httpd.apache.org/docs/2.4/en/mod/worker.html

####event:
基於worker,利用主線程來處理新請求,以便允許更多的併發請求。單個控制進程(父進程)負責啓動子進程。每個子進程創建一個由ThreadsPerChild指定的固定數量的服務器線程和一個監聽線程,監聽連接,當請求到達時,傳遞給worker線程進行處理。可在編譯腳本時,使用--with-mpm=event選項來使用event MPM:./configure --with-mpm=event,其它MPM以此類推,不再贅述。
工作原理:
該MPM盡力彌補HTTP中的“keep alvie”問題。客戶端完成第一次請求後,保持連接爲open,再次發送請求時,使用相同的socket,這樣在建立TCP連接時節約了極大的開銷。然而,Apache HTTP 服務器通常保持整個子進程、線程等待來子客戶端的數據,這給服務器自身帶來了不利。爲了解決這個問題,針對每個進程,MPM使用一個專用的監聽線程來處理監聽socket。
這種模式下,不再需要mpm-accept Mutex,單個進程或線程可處理的總的連接數由AsyncRequestWorkerFactor指定
參考連接:https://httpd.apache.org/docs/2.4/en/mod/event.html

2、優化prefork
Apache httpd自我調節性強,所以大多數站點不需要調整其默認值。如果有需要可以調整其配置如下:

# vim /etc/httpd/conf.modules.d/00-mpm.conf

<IfModule mpm_prefork_module>
    StartServers                5                          #apache啓動時候默認開始的進程數

    MinSpareServers             5                          #最小的閒置進程數

    MaxSpareServers             10                         #最大的閒置進程數

    ServerLimit                 256                        #最大的進程總數(參考,實際看MaxClients)

    MaxClients                  256                        #同時處理的進程總數,即最大併發數

    MaxRequestsPerChild        4000                        #每個進程處理的最大請求數
</IfModule>

說明:

StartServers: Apache服務器啓動時建立的初始服務器子進程數,由於進程數量根據負載動態控制的,所以很少需要調整該參數的值。

MinSpareServers:空閒服務器子進程的最小數,所謂空閒服務器子進程是指沒有正在處理請求的子進程。如果當前空閒子進程數少於MinSpareServers ,那麼Apache將創建新的子進程:創建一個,等待1s,然後創建2個,等待1秒,接着創建4個……,直到每秒創建32個子進程。當滿足MinSpareServers設置時停止創建。只有在非常繁忙的機器上才需要調整這個參數。將此參數設的太大通常是一個壞主意。

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

MaxRequestWorkers: 可同時處理的最大請求數,超過MaxRequestWorkers限制的連接將要排隊,排隊的數量可達到基於ListenBacklog指令的某個數,一旦某個請求結束後,子進程變獲得自由,開始處理下一個連接。針對非線程服務器,比如prefork,MaxRequestWorkers同時也是同一時刻,允許的最大子進程數。針對線程服務器,比如event或wroker,該參數限制了服務器可獲得的最大線程總數,默認值爲ServerLimit x ThreadsPerChild。如果要增加它的值,則都必須提升ServerLimit。

如果服務器內存較小,可能需要減少 MaxRequestWorkers 防止抖動(反覆交換內存到磁盤)。關於更多進程調優信息參考performance hints 文檔。

附:查看Apache進程數
# ps -ef|grep httpd|wc -l
21

MaxConnectionsPerChild: 每個服務器子進程被終止前可處理的最大連接數(每個進程在處理了指定次數的連接,子進程將會被父進程終止,這時候子進程佔用的內存就會釋放),設置爲0表示無限制,即不終止進程。內存較大的服務器可以設置爲0(不推薦)或較大的數字。內存較小的服務器可以設置比較小的值,以防內存溢出,還可以在服務器負載下降的時侯會自動減少子進程數。一般情況下,如果你發現服務器的內存直線上升,建議修改該參數試試
注:original文件夾是配置文件的源文件備份,而真正要配置的是conf目錄下的httpd.conf文件以及extra目錄的額外擴展配置。
https://httpd.apache.org/docs/2.4/en/mod/mpm_common.html

3、優化worker
生產環境中,建議大家選擇worker模式
# vim /etc/httpd/conf.modules.d/00-mpm.conf

<IFModule mpm_worker_module>
    StartServers             3     //創建子進程的初始數量
    
    MaxClients               2000  //最大併發數

    ServerLimit              25    //服務器允許配置的進程數上限
    
    MinSpareThreads          75    //最小空閒線程的數量

    MaxSpareThreads          250     //最大空閒線程的數量
    
    ThreadLimit              200     //進程生命週期內,爲ThreadsPerChild設置最大配置值
    
    ThreadsPerChild          25      //每個子進程創建的線程數量

    MaxRequestWorkers        400     //最大工作線程的數量

    MaxConnectionsPerChild   1000    //每個子進程的最大連接數,0是不限制
</IfModule>

ServerLimit:對活動子進程數的硬限制(hard limit),值必須大於等於MaxConnectionsPerChild  
MaxRequestWorkers:對於prefork MPM, ServerLimit設置整個Apache httpd生命週期內,MaxRequestWorker的最大可配置值。對於worker和event MPM,結合ThreadLimit設置MaxRequestWorkers的最大可配置
需要注意的是,如果ServerLimit設置的值遠高於實際需要的值,將分配額外的共享內存。如果ServerLimit和MaxRequestWorkers設置的值大於服務器處理能力,那麼可能會導致服務器無法啓動或者不穩定。
針對prefork MPM,如果需要設置MaxRequestWorkers值高於256,那麼需要用到該指令,不要設置該參數的值大於MaxRequestWorkers
針對worker和event MPM,如果MaxRequestWorkers和ThreadsPerChild設置要求多餘16個服務器進程(默認)時使用該選項。不要設置該參數的值大於MaxRequestWorkers 和ThreadsPerChild設置要求的服務器進程數(MaxRequestWorkers = ServerLimit x ThreadsPerChild)。
注意:Apache編譯時,內部有一個硬限制 ServerLimit 20000(針對prefork MPM 200000)。如果需要增加超過硬限制的值,需要修改源文件中的MAX_SERVER_LIMIT並重新構建服務器
ThreadLimit:在整個Apache httpd進程生命週期內,爲ThreadsPerChild設置最大配置值,對服務器線程數量的硬限制,必須大於等於ThreadsPerChild,如果比ThreadsPerChild設置的值高很多,將會分配額外未使用的內存;如果ThreadLimit 和ThreadsPerChild設置的值大於服務器處理能力,那麼可能會導致服務器無法啓動或者不穩定。
針對mpm_winnt,默認值爲1920,其它 64
注意:Apache在編譯時,內部有一個硬限制ThreadLimit 20000(對於event,ThreadLimit 100000,對於mpm_winnt,15000),如果想增加超過該硬限制,則需在源文件中修改MAX_THREAD_LIMIT,並重新構建服務器。
注意:要使上述兩個參數配置(ThreadLimit和ServerLimit),生效需要完全停止服務器,然後重啓服務器

StartServers:     同prefork,Apache服務器啓動時建立的初始服務器子進程數,由於進程數量根據負載動態控制的,所以很少需要調整該參數的值。
MinSpareThreads: 空閒服務器線程的最小數。如果當前服務器空閒線程數少於MinSpareThreads,那麼Apache將創建新的子進程,直到線程數大於該數值。
MaxSpareThreads: 空閒服務器線程的最大數,如果當前有超過MaxSpareServers數量的空閒子進程,那麼父進程將會殺死多餘的子進程,直到空閒線程數小於該值。
ThreadsPerChild:每個子進程創建的線程數。子進程在啓動時創建這些線程,且不再創建新的線程。
MaxRequestWorkers: 可同時處理的最大請求數,超過MaxRequestWorkers限制的連接將要排隊,數量可達到基於ListenBacklog指令的某個數,一旦某個請求結束後,子進程變獲得自由,開始處理下一個連接。針對線程服務器,比如event或wroker,該參數限制了服務器可獲得的最大線程總數,默認值爲ServerLimit x ThreadsPerChild。如果要增加它的值,則都必須提升ServerLimit。

測試時,可以通過查看日誌文件/var/log/apache2/error.log,如果發現如下內容,就應該增大MaxClients了:
[error] server reached MaxClients setting,consider raising the MaxClients setting
MaxConnectionsPerChild:同prefork,每個服務器子進程自動終止前可處理的最大連接數(每個進程在處理了指定次數的連接,子進程將會被父進程終止,這時候子進程佔用的內存就會釋放),設置爲0表示無限制,即不終止進程。
內存較大的服務器可以設置爲0(不推薦)或較大的數字。內存較小的服務器可以設置比較小的值,以防內存溢出,還可以在服務器負載下降的時侯會自動減少子進程數。一般情況下,如果你發現服務器的內存直線上升,建議修改該參數試試

https://httpd.apache.org/docs/2.4/en/mod/mpm_common.html

 4、優化event

vim /etc/httpd/conf.modules.d/00-mpm.conf

    StartServers             3

    MinSpareThreads         75

    MaxSpareThreads        250

    ThreadsPerChild         25

    MaxRequestWorkers      400

    MaxConnectionsPerChild 10000  
</IfModule>  

參考連接:https://httpd.apache.org/docs/2.4/en/mod/mpm_common.html


###計算event的相關參數
(1):計算服務器進程的平均內存
[root@localhost ~]# ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}'

(2):計算正在通訊傳輸過程中的進程的平均內存,最好在一天之內不同的時間段內運行以下代碼
[root@localhost ~]# ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'

通過上面兩個指令計算出平均進程所使用的內存大小 ,再通過以下公式計算
MaxRequestWorkers(MaxClients) =  (Total RAM - RAM used for Linux, MySQL, etc.) / Average httpd process size.
      1、StartServers 30% of MaxRequestWorkers
      2、MinSpareThreads 5% of MaxRequestWorkers
      3、MaxSpareThreads10% of MaxRequestWorkers
      4、ServerLimit == MaxRequestWorkers
      5、MaxConnectionsPerChild 10000 (as conservative alternative to address possible problem with memory leaky apps)
###event MPM 與worker MPM區別
可以支持比worker更高的併發數,主要安裝在類unix/linux上的工作模式。event mpm是worker mpm的變種,但是具有比worker MPM更好的併發性能。在event mpm模式下,ssl是不被支持的,他會被切換到worker mpm下處理。event mpm在apache2.4版本時才被從實驗狀態轉化成標準應用。

###apache 緩存設置
apache涉及的緩存模塊有mod_cache、mod_disk_cache、mod_file_cache、mod_mem_cache。如果要使用緩存必須啓用這四個緩存模塊。
同時修改緩存設置後,必須重啓apache,刷新緩存,否則用戶訪問頁面不是最新頁面。

mod_cache、mod_disk_cache、mod_mem_cache、mod_file_cache關係
- apache緩存分爲硬盤緩存和內存緩存
- mod_disk_cache mod_mem_cache 都依賴於mod_cache
- mod_file_cache是結合mod_cache使用,可以用於指定幾個頻繁訪問,但是變化不大的文件
配置硬盤緩存和內存緩存的緩存配置
<IfModule mod_cache.c>  
   #設置緩存過期時間,默認一小時  
   CacheDefaultExpire 3600  
   #設置緩存最大失效時間,默認最大一天  
   CacheMaxExpire 86400 CacheLastModifiedFactor 0.1 CacheIgnoreHeaders Set-Cookie CacheIgnoreCacheControl Off <IfModule mod_disk_cache.c>  
   #啓用緩存,並設定硬盤緩存目錄(url路徑)  
   CacheEnable disk /  
   #設定apache訪問用戶的緩存路徑,需要進行授權配置,如linux設置爲777  
   CacheRoot /home/apache/cache  
   #緩存目錄深度  
   CacheDirLevels 5  
   #緩存目錄名稱字符串長度  
   CacheDirLength 5  
   #緩存文件最大值  
    CacheMaxFileSize 1048576  
   #緩存文件最小值   
   CacheMinFileSize 10 </IfModule> <IfModule mod_mem_cache.c>  

   #緩存路徑  
   CacheEnable mem /  

   #緩存對象最大個數  
   MCacheMaxObjectCount 20000  

   #單個緩存對象最大大小  
   MCacheMaxObjectSize 1048576  

   #單個緩存對象最小大小   
   MCacheMinObjectSize 10  

   #在緩衝區最多能夠放置多少的將要被緩存對象的尺寸  
   MCacheMaxStreamingBuffer 65536  

   #清除緩存所使用的算法,默認是 GDSF,還有一個是LRU  
   MCacheRemovalAlgorithm GDSF  

   #緩存數據最多能使用的內存  
   MCacheSize 131072 </IfModule> </IfModule>
###文件緩存的應用
1、緩存文件:如果你的網站有幾個文件的訪問非常頻繁而又不經常變動,則可以在 Apache 啓動的時候就把它們的內容緩存到內存中(當然要啓用內存緩存系統),使用的是 mod_file_cache 模塊,有多個文件可以用空格格開,具體如下:
<IfModule mod_file_cache.c>  
     MMapFile /var/html/js/jquery.js  
</IfModule>  

2、緩存句柄:
<IfModule mod_file_cache.c>  
  CacheFile /usr/local/apache2/htdocs/index.html  
</IfModule>

###apache啓用服務端圖片壓縮
對於靜態的html 文件,在apache 可加載mod_deflate.so 模塊,把內容壓縮後輸出,可節約大量的傳輸帶寬。
打開httpd.conf文件,找到:
#LoadModule deflate_module modules/mod_deflate.so
將前面的“#”去掉,變成:

LoadModule deflate_module modules/mod_deflate.so
然後在最後一行的LoadModule處,加入如下的幾行:
<IfModule mod_deflate.c>
 
DeflateCompressionLevel 7
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php
AddOutputFilter DEFLATE css js
 
</IfModule>

####設定壓縮率,壓縮率1 -9, 6是建議值,不能太高,消耗過多的內存,影響服務器性能  
DeflateCompressionLevel 6  

AddOutputFilterByType DEFLATE text/plain  
AddOutputFilterByType DEFLATE text/html  
AddOutputFilterByType DEFLATE text/php  
AddOutputFilterByType DEFLATE text/xml  
AddOutputFilterByType DEFLATE text/css  
AddOutputFilterByType DEFLATE text/javascript  
AddOutputFilterByType DEFLATE application/xhtml+xml  
AddOutputFilterByType DEFLATE application/xml  
AddOutputFilterByType DEFLATE application/rss+xml  
AddOutputFilterByType DEFLATE application/atom_xml  
AddOutputFilterByType DEFLATE application/x-javascript  
AddOutputFilterByType DEFLATE application/x-httpd-php  
AddOutputFilterByType DEFLATE application/x-httpd-fastphp  
AddOutputFilterByType DEFLATE application/x-httpd-eruby  
AddOutputFilterByType DEFLATE image/svg+xml  
AddOutputFilterByType DEFLATE application/javascript  

####插入過濾器  
SetOutputFilter DEFLATE  

####排除不需要壓縮的文件  
SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary  
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip don’t-vary  
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary  
SetEnvIfNoCase Request_URI \.avi$ no-gzip dont-vary  
SetEnvIfNoCase Request_URI \.mov$ no-gzip dont-vary  
SetEnvIfNoCase Request_URI \.mp3$ no-gzip dont-vary  
SetEnvIfNoCase Request_URI \.mp4$ no-gzip dont-vary  
SetEnvIfNoCase Request_URI \.rm$ no-gzip dont-vary  
</ifmodule>

###Apache超時與持久連接設置
在HTTP 1.0中和Apache服務器的一次連接只能發出一次HTTP請求,而KeepAlive參數支持HTTP 1.1版本的一次連接,多次傳輸功能,這樣就可以在一次連接中發出多個HTTP請求。從而避免對於同一個客戶端需要打開不同的連接。很多請求通過同一個 TCP連接來發送,可以節約網絡和系統資源。
/usr/share/doc/httpd-2.4.6/httpd-default.conf
cp -r /usr/share/doc/httpd-2.4.6/httpd-default.conf /etc/httpd/conf.modules.d/

(1)keepAlive啓用場景
    如果有較多的js,css,圖片訪問,則需要開啓長鏈接
    如果內存較少,大量的動態頁面請求,文件訪問,則關閉長鏈接,節省內存,提高apache訪問的穩定性
    如果內存充足,cpu較好,服務器性能優越,則是否開啓長鏈接對訪問性能都不會產生影響
(2)keepAlive配置
    在Apache的配置文件httpd.conf中,設置:
    1、Timeout  60                默認爲60s修改爲30s
    2、KeepAlive on               設置爲on狀態,該參數爲是否保持活連接,目前網站中一個頁面一般會包含多個文件,所以相應用戶訪問時會有多個請求,因此開啓可以提高服務器性能。
    4、KeepAliveTimeout   5       默認爲5s,該參數爲活連接的超時時間,一般只要設置成小於Timeout即可。
    5、MaxKeepAliveRequests 100   如果設置爲0表示無限制,把MaxKeepAliveRequests設置的儘量大,可以在一次連接中進行更多的HTTP請求。但在我們的測試中還發現,把 MaxKeepAliveRequests設置成1000,則評測的客戶端容易出現“Send requesttimed out”的錯誤,所以具體數值還要根據自己的情形來設置。

    
###問題集錦
1、加載
LoadModule authz_core_module modules/mod_authz_core.so  
Invalid command 'Require', perhaps misspelled or defined by a module not included in the server configuration`

2、配置信息後面不能跟隨註釋,註釋必須另起一行
CacheDefaultExpire takes one argument, The default time in seconds to cache a document

3、關鍵字錯誤 AddOutputFileByType 應該是
AddOutputFitlerByType  
Invalid command 'AddOutputFileByType', perhaps misspelled or defined by a module not included in the server configuration

4、啓用
LoadModule setenvif_module modules/mod_setenvif.so  
Invalid command 'SetEnvIfNoCase', perhaps misspelled or defined by a module not included in the server configuration

5、ifModule註釋不能跟在配置參數後面,否則會導致配置解析失敗
AH00526: Syntax error on line 558 of /usr/local/cp-httpd-2.4.18/conf/httpd.conf:
CacheDefaultExpire takes one argument, The default time in seconds to cache a document

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