Apache自帶壓力測試工具ab,簡單易用,且能夠模擬各類條件對web服務器發起測是請求 ab工具能夠直接在web服務器本地發起測是請求,這對於須要瞭解服務器的處理性能相當重要,由於它不包括數據的網絡傳輸時間以及用戶pc本地的計算時間,從而能夠經過觀測各類時間指標判斷web服務器的性能,以便進行參數的優化調整
優化前先使用ab進行壓力測試 優化後,重啓服務,再使用ab進行壓力測試 對比兩次測試的結果,看優化效果是否明顯 爲了能更客觀的評價web服務的性能,通常優化先後都要進行屢次測試,取測試的平均值進行對比
ab[options] 網站網址 -n,-c,-t,-v
#Apac/usr/local/httpd/bin/ab -n5000 -c900 www.kgc.com/index.html
在測試時要根據狀況調整求總數與併發用戶數he工做模式介紹html
Apache做爲先今web服務器用的最爲普遍也是最穩定的開源服務器軟件。 其工做模式有許多中,源碼包安裝HTTPD時可查看httpd-mpm.cong文件,該文件位於extra/conf目錄中 目前主要有兩種模式: event模式 preork模式 worker模式 工做模式怎麼區分 prefork:一個進程中包含一個線程 worker/event:一個進程中包含多個進程
event是Apache最新的工做模式,他和worker模式很像,不一樣的是在於它解決了keep-alive長鏈接的時候佔用線程資源被浪費的問題 event工做模式在遇到某寫不兼容的模塊時,會失效,將會回退到worker模式 event工做模式須要Linux系統(Linux 2.6+)對epoll的支持,才能啓用,須要補充的是HTTPS的鏈接(SSL) event創建鏈接,保持鏈接,就像打電話說一下子掛段,再說一下子掛段,我能夠設置超時時間,超過就斷開,隨時能夠斷開會話功能。
在event工做模式中,會有一些專門的線程用來管理這些keep-alive類型的線程 當有真實請求過來的時候,將請求傳遞給服務器的線程,執行完畢後,又容許它釋放,這樣,一個線程就能處理幾個請求了,實現了異步非阻塞。這加強了在高併發場景下的請求處理 靈活控制,多個請求時,能夠把以前的進程釋放,能處理高併發
<ifMoudle mpm_event_module> StartServers 3 配置文件中,啓動3個進程 MinSpare Threads 75 最少空閒的線程數量 75 MaxSpare Threads 250 最大空閒的線程數量 250 ThreadsPerChild 25 每一個進程中默認開啓25個線程 MaxRequestWorkers 400 併發最大請求數量400個 MaxConnectionsPerChild 0 若是設置爲0.子進程將永遠不會結束,若是設置成非0值,能夠防止運行PHP致使的內存泄露
prefork是一個多路處理模塊(MPM),實現了一個進程型的,預排生的web服務器,適合於沒有線程安全庫,須要避免線程兼容性問題的系統 再要求每一個請求相互獨立的狀況下具備很好的特性。若一個請求出現問題不會影響到其餘請求 具備很強的自我調節能力,只須要不多的配置指令進行調整就能夠適合於企業應用要求 最重要的是將MaxClients設置爲一個足夠大的數值已處理潛在的請求高峯,同時又不能太大,以免所需的內存超出物理內存的大小
一個單獨的控制進程(父進程)負責產生子進程,子進程用於監聽請求並做出應答,所以在內存中會一直存在一些備用的(spare)或是空閒的子進程,用於響應新的請求,可加快響應速度 父進程一般以root身份 運行,以便綁定80端口,子進程一般以一個低特權的用戶運行,可經過配置項的User和Group配置 運行子進程的用戶必需要對網站內容有讀取權限,可是對其餘資源必須擁有儘量少的權限,以保證系統安全 編譯安裝時沒有指定工做模式,默認會使用prefork模式,可用httpd -l查看
<ifModule mpm_prefork_module> StartServers 20 最大進程數 MinSpareServers 10 最少空閒進程 MaxSpareServers 50 最多空閒進程 MaxClients 150 最多建立多少個子進程用來處理請求 MaxRequestPerChild 0 每一個進程處理的最大請求數,到請求數,進程即被銷燬,若是設置爲0,子進程永遠不會結束
可根據生產環境進行調試,以肯定合適參數 ##優化參考 <IfModule mpm prefork module> ServerLimit 1000 StartServers 10 MinSpareServers 10 MaxSpareServers 30 MaxClients 1000 MaxRequestsPerChild 5000 </IfModule>
worker也是多路處理模塊(MPM),使網路服務支持混合的多線程進程 因爲使用線程來處理請求,全部能夠處理海量請求,而系統資源的開銷小於基於進程的MPM 可是也使用了多進程,每一個進程又有多個線程,以得到基於進程的MPM的穩定性 控制該MPM的最重要的指令是:控制每一個子進程容許創建的線程數ThreadsPerChild指令和控制容許創建的總線程數的MaxClients指令
每一個進程可以擁有的線程數量是固定的,服務器會根據負載狀況增長或減小進程數量 一個單獨的控制進程(父進程)負責子進程的創建,每一個子進程可以創建ThreadsPerChild數量的服務線程和一個監聽線程,監聽線程監聽接入請求並將其傳遞給服務器進程處理和應答 Apache老是會維持一個備用(spare)或是空閒的服務器線程池,客戶端無需等待新線程或新進程的創建便可獲得服務 父進程通常都是以root身份啓動,以綁定80端口;隨後,Apache以較低權限的用戶創建子進程和線程 User和Group指令用於配置Apache子進程的運行用戶。子進程要對網頁內容擁有讀取權限,但應該儘量限制權限
參數 說明 ServerLimit 最大進程數,默認值16「」 ThreadL imit 每一個子進程的最大線程數,默認值是"64」 StartServers 服務器啓動時創建的子進程數,默認值是"3" MaxClients 容許同時接受的最大接入請求數量(最大線程數量) MinSpare Threads 最小空閒線程數,,默認值是"75" MaxSpare Threads 設置最大空閒線程數。默認值是"250" ThreadsPerChild 每一個子進程創建的常駐的執行線程數。默認值是25 MaxRequestsPerChild 設置每一個子進程在其生存期內容許伺服的最大請求數量。設置爲"0",子進程將永遠不會結束
[root@localhost httpd-2.4.29]#./configure \ --with-mpm=prefork \ ##添加工做模式此配置項 [root@localhost httpd-2.4.29]# vim /etc/httpd.conf 輸入/mpm查找此關鍵詞,將前面的#註釋刪除 Include conf/extra/httpd-mpm.conf ##定位到這行將註釋刪除,啓用功能 [root@localhost ~]# cd /usr/local/httpd/conf/extra/ [root@localhost extra]# vim httpd-mpm.conf <IfModule mpm_prefork_module> StartServers 10 ##啓動的時候建立的進程數量改成10 MinSpareServers 10 ##空閒最小改成10 MaxSpareServers 20 ##最大設爲20 MaxRequestWorkers 200 ##訪問設量爲200 MaxConnectionsPerChild 0 </IfModule> ##修改完成按Esc退出插入模式,輸入:wq保存退出 [root@localhost extra]# cd ../../bin/ [root@localhost bin]# ./apachectl stop [root@localhost bin]# ./apachectl start ##從新關閉開啓服務 [root@localhost bin]# lsof -i :80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 58933 root 3u IPv4 88357 0t0 TCP localhost.localdomain:http (LISTEN) httpd 58937 daemon 3u IPv4 88357 0t0 TCP localhost.localdomain:http (LISTEN) httpd 58938 daemon 3u IPv4 88357 0t0 TCP localhost.localdomain:http (LISTEN) httpd 58939 daemon 3u IPv4 88357 0t0 TCP localhost.localdomain:http (LISTEN) httpd 58940 daemon 3u IPv4 88357 0t0 TCP localhost.localdomain:http (LISTEN) httpd 58941 daemon 3u IPv4 88357 0t0 TCP localhost.localdomain:http (LISTEN) httpd 58942 daemon 3u IPv4 88357 0t0 TCP localhost.localdomain:http (LISTEN) httpd 58943 daemon 3u IPv4 88357 0t0 TCP localhost.localdomain:http (LISTEN) httpd 58944 daemon 3u IPv4 88357 0t0 TCP localhost.localdomain:http (LISTEN) httpd 58945 daemon 3u IPv4 88357 0t0 TCP localhost.localdomain:http (LISTEN) httpd 58946 daemon 3u IPv4 88357 0t0 TCP localhost.localdomain:http (LISTEN) ##除去一個主進程,其餘的子進程變爲10個
目錄的權限設置使用<Directory 目錄路徑>和</Directory>這對語句爲主目錄或虛擬目錄設置權限 它們是一對容器語句,必須成對出現,它們之間封裝的是具體的設置目錄權限語句,這些語句僅對被設置目錄及其子目錄起做用
參數 做用 Options 設置在特定目錄使用哪些特性 AllowOverride 容許存在於.htaccess文件中的指令類型 Require 設置目錄的訪問控制 Indexes 當用戶訪問該目錄時,但沒有指定要訪問哪一個文件,並且目錄下不存在默認網頁時,返回目錄中的文件和子目錄列表 MultiViews 內容協商的多重視圖,Apache的一個智能特性。 當訪問目錄中不存在的對象時 ExecCGI 容許在該目錄下執行CGI腳本 FollowSymLinks 在該目錄下容許文件系統使用符號鏈接 Includes 容許服務器端包含功能 IncludesNoExec 容許服務器端包含功能,但禁止執行CGI腳本 All 包含除了MultiViews以外全部特性,若是沒有Options語句,默認爲All
[root@localhost bin]# vim /etc/httpd.conf //輸入/htdocs查找此關鍵詞,找到以下字段,其中有兩個功能起到支持做用: DocumentRoot "/usr/local/httpd/htdocs" <Directory "/usr/local/httpd/htdocs"> # # Possible values for the Options directive are "None", "All", # or any combination of: # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # # Note that "MultiViews" must be named *explicitly* --- "Options All" # doesn't give it to you. # # The Options directive is both complicated and important. Please see # http://httpd.apache.org/docs/2.4/mod/core.html#options # for more information. # Options Indexes FollowSymLinks //1.Index:以列表形式展示 //2.FollowSymLinks而且支持連接性的文件 # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # AllowOverride FileInfo AuthConfig Limit # AllowOverride None # # Controls who can get stuff from this server. # Require all granted //黑白名單 </Directory> #咱們能夠先關閉防火牆,使用宿主機的瀏覽器進行驗證 [root@localhost bin]# systemctl stop firewalld.service [root@localhost bin]# setenforce 0 [root@localhost bin]# cd /usr/local/httpd/htdocs/ [root@localhost htdocs]# ls index.html [root@localhost htdocs]# cat index.html <html><body><h1>It works!</h1></body></html> [root@localhost htdocs]# ls index.html [root@localhost htdocs]# mv index.html a.html [root@localhost htdocs]# ls a.html [root@localhost htdocs]# touch b.html c.html d.html [root@localhost htdocs]# ls a.html b.html c.html d.html //此時會以文件列表的形式展示,從另外一個角度咱們能夠利用這點來作文件下載資源的提供,此時就不須要首頁識別
[root@localhost htdocs]# ln -s /usr/share/man/ ./ //把man手冊放入這個文件夾,看他能不能識別這個連接文件 [root@localhost htdocs]# ls a.html b.html c.html d.html man