博主QQ:819594300javascript
博客地址:http://zpf666.blog.51cto.com/php
有什麼疑問的朋友能夠聯繫博主,博主會幫大家解答,謝謝支持!1、 安裝apache2.4.23css
新版本的httpd-2.4新增如下特性;html
①新增模塊;java
mod_proxy_fcgi(可提供fcgi代理)mysql
mod_ratelimit(限制用戶帶寬)linux
mod_request(請求模塊,對請求作過濾)nginx
mod_remoteip(匹配客戶端的IP地址)web
②對於基於IP的訪問控制作了修改,再也不支持allow,deny,order機制,而是統一使用require進行。sql
③還新增如下幾條新特性;
1、MPM支持在運行時裝載;不過要開啓這種特性,在編譯安裝要啓用這三種功能;
--enable-mpms-shared=all --with-mpm=event
2、支持event
3、支持異步讀寫
4、在每一個模塊及每一個目錄上指定日誌級別
5、加強版的表達式分析器
6、每請求配置:<If>,<Elseif>
7、毫秒級別的keepalivetimeout
8、基於FQDN的虛擬主機再也不須要NameVirtualHost指令
9、支持使用自定義變量
安裝環境:操做系統:Centos7.2,關閉selinux
檢查httpd包是否安裝,若是安裝了要則卸載
上圖所示沒有安裝過httpd,這下面開始安裝工做:
安裝apache2.4.23
須要下載下列所示的幾個源碼包:
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
注:apr(Apache Portable Runtime)Apache可移植運行庫,它是一個對操做系統調用的抽象庫,用來實現Apache內部組件對操做系統的使用,提升系統的可移植性。
安裝apr和apr-util:
安裝zlib:
安裝pcre:
安裝openssl:
說明:安裝apache2.4.23時會提示openssl版本太低,是由於centos7自帶的版本openssl-1.0.1e,咱們須要本身去下載openssl。
下載openssl:
#wget https://www.openssl.org/source/openssl-1.0.1u.tar.gz
下面開始安裝openssl:
安裝apache2.4.23:
相關參數解釋以下:
--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二進制文件的模塊<MODULE-LIST>爲空格分隔的模塊名列表、all或者mostall表示包含全部模塊most表示包含大部分經常使用模塊
--enable-mods-shared=most 明確指明要以DSO方式編譯的模塊<MODULE-LIST>爲空格分隔的模塊名列表、all或者mostall表示包含全部模 塊most表示包含大部分模塊
--enable-mpms-shared=all 啓用MPM全部支持的模式這樣event、worker、prefork就會以模塊化的方式安裝要用哪一個就在 httpd.conf 裏配置就行了。
--with-mpm=event 指定啓用的mpm模式默認使用enevt模式在apache的早期版本2.0默認prefork,2.2版本是worker2.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調優的一個重要選項之一。
優化http程序執行路徑:
修改配置文件httpd.conf,設置其中的ServerName值:
例如:ServerName www.benet.com
開啓apache服務器:
設置開機後自動啓動:
編輯 /etc/init.d/httpd 文件,在首行 #!/bin/sh 下面加入兩行:
將 Apache 加入開機自動啓動:
啓動編譯好的 Apache 2.4.23:
(注意:若是狀態不是active(running),則重啓一下httpd服務便可)
如下是用service的方式開啓httpd服務。
查看一下httpd狀態:
下面解決這個問題:
lynx安裝上了,再次查看httpd狀態:
上圖報錯說:請求的URL /服務器狀態這個服務器上不存在。(即server-status不存在),下面繼續解決問題。
返回了狀態碼是404:意思是請求被拒絕
這樣就看能夠看到httpd的狀態了。
客戶端測試訪問(注意防火牆):
先開啓httpd服務例外:
在一臺客戶機上訪問測試:
上圖顯示訪問成功!
2、 Apache的優化配置:
apache所運行的硬件環境都是對性能影響最大的因素,即便不能對硬件進行升級,也最好給apache一個單獨的主機以避免受到其餘應用的干擾。各個硬件指標中,對性能影響最大的是內存,對於靜態內容(圖片、javascript文件、css文件等),它決定了apache能夠緩存多少內容,它緩存的內容越多,在硬盤上讀取內容的機會就越少,大內存能夠極大提升靜態站點的速度;對動態高負載站點來講,每一個請求保存的時間更多一些,apache的mpm模塊會爲每一個請求派生出相應的進程或線程分別處理,而進程或線程的數量與內存的消耗近似成正比,所以增大內存對提升動態站點的負載和運行速度也極爲有利
其次是硬盤的速度,靜態站點尤其突出,apache不斷的在讀取文件併發送給相應的請求,硬盤的讀寫是極其頻繁的;動態站點也要不斷的加載web程序(php等),一個請求甚至要讀取十幾個文件才能處理完成,所以儘量的提升硬盤速度和質量對提升apache的性能是有積極意義的。
最後是cpu和網絡,cpu影響的是web程序執行速度,網絡影響流量大小。
1、apache的工做模式:
ApacheHTTP服務器被設計爲一個強大的、靈活的可以在多種平臺以及不一樣環境下工做的服務器。這種模塊化的設計就叫作「多進程處理模塊」(Multi-Processing Module,MPM),也叫作工做模式。
Prefork模式(一個非線程型的):
其主要工做方式是:當Apache服務器啓動後,mpm_prefork模塊會預先建立多個子進程(默認爲5個),每一個子進程只有一個線程,當接收到客戶端的請求後,mpm_prefork模塊再將請求轉交給子進程處理,而且每一個子進程同時只能用於處理單個請求。若是當前的請求數將超過預先建立的子進程數時,mpm_prefork模塊就會建立新的子進程來處理額外的請求。Apache老是試圖保持一些備用的或者是空閒的子進程用於迎接即將到來的請求。這樣客戶端的請求就不須要在接收後等候子進程的產生。
因爲在mpm_prefork模塊中,每一個請求對應一個子進程,所以其佔用的系統資源相對其餘兩種模塊而言較多。不過mpm_prefork模塊的優勢在於它的每一個子進程都會獨立處理對應的單個請求,這樣,若是其中一個請求出現問題就不會影響到其餘請求。Prefork在效率上要比Worker要高,可是內存使用大得多不擅長處理高併發的場景。
Apache在prefork工做模式下影響性能的重要參數說明:
每一個配置項解釋以下:
<IfModulempm_prefork_module>
StartServers 5
#apache啓動時候默認開始的子進程數
MinSpareServers 5
#最小的閒置子進程數
MaxSpareServers 10
#最大的閒置子進程數
MaxRequestWorkers 250
#MaxRequestWorkers設置了容許同時的最大接入請求數量。任何超過MaxRequestWorkers限制的請求將進入等候隊列,在apache2.3.1之前的版本MaxRequestWorkers被稱爲MaxClients,舊的名字仍舊被支持。
MaxConnectionsPerChild 500
#設置的是每一個子進程可處理的請求數。每一個子進程在處理了「MaxConnectionsPerChild」個請求後將自動銷燬。0意味着無限,即子進程永不銷燬。雖然缺省設爲0可使每一個子進程處理更多的請求,但若是設成非零值也有兩點重要的好處:一、可防止意外的內存泄漏。二、在服務器負載降低的時侯會自動減小子進程數。所以,可根據服務器的負載來調整這個值。在Apache2.3.9以前稱之爲MaxRequestsPerChild。
</IfModule>
注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。
(建議StartServers的值和MinSpareServers的值相等)
注3:ServerLimit和MaxClients(MaxRequestWorkers)有什麼區別呢?
是由於在apache1時代,控制最大進程數只有MaxClients這個參數,而且這個參數最大值爲256,而且是寫死了的,試圖設置爲超過256是無效的,這是因爲apache1時代的服務器硬件限制的。可是apache2時代因爲服務器硬件的升級,硬件已經再也不是限制,因此使用ServerLimit這個參數來控制最大進程數,ServerLimit值>=MaxClient值纔有效。ServerLimit要放在MaxClients以前,值要不小於MaxClients。
注4:查看Apache加載的模塊
(static的是靜態模塊,shared的是動態模塊)
或
(同上也有static和shared之分)
或
(只能查看編譯到二進制文件中的靜態模塊)
注5:如何查看Apache的工做模式呢?可使用httpd -V 命令查看,另外使用httpd -l 也能夠查看到(通常都用httpd -V)
注6:如何修改prefork參數和啓用prefork模式(httpd默認的模式是event模式)
①經過httpd-mpm.conf定義模塊的配置信息
②修改httpd的主配置文件
③重啓httpd服務,讓修改的配置生效
注意:在實際生產環境中,建議使用優雅啓動,由於沒有」service httpd reload」,等效做用的是「service httpd graceful」
或
④驗證模式是否更改成prefork
Worker模式(多線程多進程):
和prefork模式相比,worker使用了多進程和多線程的混合模式,worker模式也一樣會先預派生一些子進程,而後每一個子進程建立一些線程,同時包括一個監聽線程,每一個請求過來會被分配到一個線程來服務。線程比起進程會更輕量,由於線程是經過共享父進程的內存空間,所以,內存的佔用會減小一些,在高併發的場景下會比prefork有更多可用的線程,表現會更優秀一些;另外,若是一個線程出現了問題也會致使同一進程下的線程出現問題,若是是多個線程出現問題,也只是影響Apache的一部分,而不是所有。因爲用到多進程多線程,須要考慮到線程的安全了,在使用keep-alive長鏈接的時候,某個線程會一直被佔用,即便中間沒有請求,須要等待到超時纔會被釋放(該問題在prefork模式下也存在)
總的來講,prefork方式速度要稍高於worker,然而它須要的cpu和memory資源也稍多於woker。
Apache在worker工做模式下影響性能的重要參數說明:
每一個配置項解釋以下:
<IfModulempm_worker_module>
StartServers 3
#apache啓動時候默認開始的子進程數
MinSpareThreads 75
#最小空閒數量的工做線程
MaxSpareThreads 250
#最大空閒數量的工做線程
ThreadsPerChild 25
#每一個子進程產生的線程數量
MaxRequestWorkers 400
#與prefork模式相同
MaxConnectionsPerChild 0
#與prefork模式相同
</IfModule>
注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:進程與線程的區別
線程是指進程內的一個執行單元,也是進程內的可調度實體。
一個程序至少有一個進程,一個進程至少有一個線程.
線程的劃分尺度小於進程,使得多線程程序的併發性高。
另外,進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存,從而極大地提升了程序的運行效率。
線程在執行過程當中與進程仍是有區別的,每一個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。可是線程不可以獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分能夠同時執行。但操做系統並無將多個線程看作多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。
進程是具備必定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程本身基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),可是它可與同屬一個進程的其餘的線程共享進程所擁有的所有資源.
一個線程能夠建立和撤銷另外一個線程;同一個進程中的多個線程之間能夠併發執行.
總結進程與線程的區別:
(1)地址空間:進程內的一個執行單元;進程至少有一個線程;它們共享進程的地址空間;而進程有本身獨立的地址空間;
(2)資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
(3)線程是處理器調度的基本單位,但進程不是.
(4)兩者都可併發執行.
進程和線程都是由操做系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性。
進程和線程的區別在於:
簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.
線程的劃分尺度小於進程,使得多線程程序的併發性高。
另外,進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存,從而極大地提升了程序的運行效率。
Event模式:
這是Apache最新的工做模式,是worker模式的變種(升級版),它把服務進程從鏈接中分離出來,與worker模式不一樣的是在於它解決了keep-alive長鏈接的時候佔用線程資源被浪費的問題,在event工做模式中,會有一些專門的線程用來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務器的線程,執行完畢後,又容許它釋放。這加強了在高併發場景下的請求處理。event模式不能很好的支持https的訪問(HTTP認證相關的問題)。
(prefork、worker和event三種模式之間的轉換,請參考prefork模式的注6,轉換方法都是同樣的。)
2、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。因此通常狀況下,若是你發現服務器的內存直線上升,建議修改該參數試試。
注:以上配置項可在/usr/local/http-2.4.23/conf/extra/httpd-mpm.conf設置並在httpd.conf文件中經過include選項引用
3、開啓apache的Gzip(deflate)功能
gzip能夠極大的加速網站,有時壓縮比率高到80%,最少都有40%以上,仍是至關不錯的。在Apache2以後的版本,模塊名不叫gzip,而叫mod_deflate
未使用Gzip:
開啓使用Gzip:
若是要開啓moddeflate的話,必定要打開下面二個模塊:
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
設置壓縮比率,取值範圍在 1(最低) 到9(最高)之間,不建議設置過高,雖然有很高的壓縮率,可是佔用更多的CPU資源。
mod_deflate模塊檢查及安裝:
看到到沒有有多是沒有啓動,去httpd.conf配置文件看一下是否有deflate_module這個模塊。
如今兩個必須有的模塊都有了。
若是沒有安裝,則按下面幾種方法解決:
a.編譯時安裝方法
編譯的時候跟上--enable-deflate便可實現安裝
b.DSO方式安裝
①先切到apache源碼包mod_deflate所在的目錄下
②以DSO的方式編譯安裝到apache中
注意:安裝mod_deflate模塊須要加參數「-I」,除此以外的其餘的模塊都不須要「-I」。
③檢查mod_deflate和mod_headers是否安裝,成功安裝這裏會顯示出該文件
④成功安裝完畢後,要優雅啓動httpd服務
apxs命令參數說明:
-c 此選項表示須要執行編譯操做。
-i 此選項表示須要執行安裝操做,以安裝一個或多個動態共享對象到服務器的modules目錄中。
-a 此選項自動增長一個LoadModule行到httpd.conf文件中,以啓用此模塊,或者,若是此行已經存在,則啓用之。
-I 此選項直接傳遞到給鏈接命令,用於增長自定義的庫文件。
額外說明個參數:
-A 與 -a 選項相似,可是它增長的LoadModule命令有一個井號前綴(#),即此模塊已經準備就緒但還沒有啓用。
注:若是的其餘httpd版本實驗環境下(如httpd2.2.17)
#/usr/local/http2.2/bin/apxs -c -i -a /root/httpd-2.2.17/modules/metadata/mod_deflate.c
#/usr/local/http2.2/bin/apxs -c -i -a/root/httpd-2.2.17/modules/metadata/mod_headers.c
若是重啓的時候出現錯誤:
引用出現的錯誤:
Cannotload /usr/local/apache/modules/mod_deflate.so into server: /usr/local/apache/modules/mod_deflate.so:undefined symbol: inflateEnd
則解決辦法以下:
須要在
LoadModuledeflate_module modules/mod_deflate.so 的前面加載zlib.so
這裏須要注意的是LoadModule deflate_module須要放在LoadModulephp5_module以後
說明以下:
LoadFile/usr/lib/libz.so(x64系統中該庫文件位於/usr/lib64目錄下,能夠軟連接到/usr/lib下。注:若是在本實驗環境下(即httpd2.4.24)ln -s /usr/local/zlib/lib/libz.so /usr/lib/)
LoadModuledeflate_module modules/mod_deflate.so
從新啓動httpd:
#/usr/local/http2.4.23/bin/apachectl graceful #優雅啓動httpd服務
附:安裝一個沒有模塊怎麼安裝?
修改Apache配置文件開啓gzip壓縮傳輸:
①httpd.conf修改、增長配置參數:
說明:打開httpd.conf後,先將上面兩行配置前面的#號去掉,這樣apache就會啓用這兩個模塊,其中mod_deflate是壓縮模塊,就是對要傳輸到客戶端的代碼進行gzip壓縮;mod_headers模塊的做用是告訴瀏覽器頁面使用了gzip壓縮,若是不開啓mod_headers那麼瀏覽器就會對gzip壓縮過的頁面進行下載,而沒法正常顯示。
②在httpd.conf中加入如下代碼,能夠加到任何空白地方,不瞭解apache的話,若是擔憂加錯地方,就放到http.conf文件的最後一行。
注意:在添加代碼前最好先查一查要添加的那兩個代碼,必定保證是存在的。
每行意思解釋以下:
<IfModule mod_deflate.c>
DeflateCompressionLevel6 #壓縮程度的等級,預設能夠採用 6 這個數值,以維持耗用處理器效能與網頁壓縮質量的平衡。
SetOutputFilterDEFLATE #設置輸出過濾器,對輸出啓用壓縮,必須的,就像一個開關同樣,告訴apache對傳輸到瀏覽器的內容進行壓縮
#AddOutputFilterByTypeDEFLATE text/html text/plain text/xml application/x-javascriptapplication/x-httpd-php
#AddOutputFilterByType DEFLATE p_w_picpath/*
AddOutputFilterByType DEFLATE text/* #設置對文件是文本的內容進行壓縮,例如text/html text/css text/plain等.
AddOutputFilterByTypeDEFLATE application/ms* application/vnd* application/postscriptapplication/javascript application/x-javascript #對javascript文件進行壓縮
AddOutputFilterByTypeDEFLATE application/x-httpd-php application/x-httpd-fastphp #對php類型的文件進行壓縮.
SetEnvIfNoCaseRequest_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary #設置不對後綴gif,jpg,jpeg,png的圖片文件進行壓縮。注:?:表示不會捕獲 ( )裏內容了
SetEnvIfNoCaseRequest_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
#同上,就是設置不對exe,tgz,gz等的文件進行壓縮
SetEnvIfNoCaseRequest_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary #同上就是設置不對pdf,avi,mp3等的文件進行壓縮
</IfModule>
設置日誌輸出!
每行意思解釋以下:
DeflateFilterNoteInput input_info#聲明輸入流的byte數量
DeflateFilterNoteOutput output_info#聲明輸出流的byte數量
DeflateFilterNoteRatio ratio_info#聲明壓縮的百分比
LogFormat'"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate#聲明日誌格式
CustomLoglogs/deflate_log.log deflate
修改完成後保存退出並重啓httpd服務(優雅啓動):
使用谷歌瀏覽器測試訪問,以下圖顯示結果:(提示:在訪問測試頁以前按F12鍵):
在index.html裏面加點數據,增大它的文件大小,另外再傳一個測試圖片:
正式開始測試:
在谷歌瀏覽器,按F12:
查看日誌:
注:圖片是不須要啓用GZip壓縮的,,若是不設置SetEnvIfNoCaseRequest_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary ,則從GZip檢測結果來看,壓縮後的圖片體積居然大過原體積!這就解釋了爲何圖片不用啓用GZip壓縮的緣由了!(其實有些圖片壓縮仍是會變小的,大多數反而壓縮了會變大)
能夠檢測了幾個門戶網站的圖片,還有Google、baidu的圖片,通通都沒有啓用圖片GZip壓縮,只是啓用了html、css、js等文件的GZip壓縮,這就更加說明了GZip壓縮不適用於圖片上。另外,除了圖片以外,flash的swf文件也是不用啓用GZip壓縮的。
4、配置mod_expires模塊
這個很是有用的優化,mod_expires能夠減小20-30%左右的重複請求,讓重複的用戶對指定的頁面請求結果都CACHE在本地,根本不向服務器發出請求。但要注意更新快的文件不要這麼作。
這個模塊控制服務器應答時的Expires頭內容和Cache-Control頭的max-age指令。有效期(expiration date)能夠設置爲相對於源文件的最後修改時刻或者客戶端的訪問時刻。
未啓用expire的效果:
啓用expire緩存:
①mod_expires的安裝配置:
啓用expires_module
②添加Expires配置規則
③優雅啓動服務
④驗證
ExpiresDefault 和ExpiresByType 指令一樣可以用易懂的語法格式進行定義:
ExpiresDefault"<base> [plus] {<num><type>}"
ExpiresByTypetype/encoding "<base> [plus] {<num><type>}"
其中<base>是下列之一:
access
now (等價於'access')
modification
plus關鍵字是可選的。<num>必須是整數,<type>是下列之一:
years
months
weeks
days
hours
minutes
seconds
例如,下列3個指令都表示文檔默認的有效期是一個月:
ExpiresDefault"access plus 1 month"
ExpiresDefault"access plus 4 weeks"
ExpiresDefault"access plus 30 days"
有效期能夠經過增長"<num><type>"子句進一步調整:
ExpiresByTypetext/html "access plus 1 month 15 days 2 hours"
ExpiresByTypep_w_picpath/gif "modification plus 5 hours 3 minutes"
注意,若是你使用基於最後修改日期的設置,"Expires:"頭將不會 被添加到那些並不是來自於磁盤文件的內容。這是由於這些內容並不存在"最後修改時間"的屬性。
#GIF有效期爲1個月(秒數)
ExpiresByTypep_w_picpath/gif A2592000
ExpiresByTypep_w_picpath/jpeg A2592000
ExpiresByTypep_w_picpath/png A2592000
ExpiresByTypep_w_picpath/x-icon A2592000
ExpiresByTypeapplication/x-javascript A604800
ExpiresByTypetext/plain A604800
#HTML文檔的有效期是最後修改時刻後的一星期
ExpiresByTypetext/html M604800
</IfModule>
"M"表示源文件的最後修改時刻,"A"表示客戶端對源文件的訪問時刻。後面的時間則以秒計算。
有關 Apache Expires Module 的介紹,能夠參閱其官方文檔:
http://httpd.apache.org/docs/2.4/mod/mod_expires.html
5、Apache禁止目錄遍歷
將Options Indexes FollowSymLinks中的Indexes 去掉,就能夠禁止 Apache 顯示該目錄結構。Indexes 的做用就是當該目錄下沒有 index.html文件時,就顯示目錄結構。
咱們先來看看什麼是目錄遍歷:
遍歷目錄就是把/usr/local/http-2.4.23/htdocs目錄下的文件和子目錄全是顯示出來,這樣作是很不安全的。
6、apache隱藏版本信息
測試默認 apache 的狀態信息:
①主配置中啓用httpd-default.conf
去掉484行的註釋「#」:
②修改httpd-default.conf
改爲下圖所示的配置:
③優雅啓動httpd服務
④測試隱藏版本號後 apache 的狀態信息(仍是能看見是apache,可是apache的版本看不見了)
⑤若是須要完全將版本之類的信息進行改頭換面,你就須要在編譯以前作準備或者進行重新編譯了。在從新編譯時,修改源碼包下include目錄下的ap_release.h文件
#define AP_SERVER_BASEVENDOR "Apache Software Foundation"#服務的供應商名稱
#define AP_SERVER_BASEPROJECT "Apache HTTPServer" #服務的項目名稱
#define AP_SERVER_BASEPRODUCT "Apache" #服務的產品名
#define AP_SERVER_MAJORVERSION_NUMBER 2 #主要版本號
#define AP_SERVER_MINORVERSION_NUMBER 4 #小版本號
#define AP_SERVER_PATCHLEVEL_NUMBER 23 #補丁級別
#define AP_SERVER_DEVBUILD_BOOLEAN 0 #
上述列出的行,已經給出了註釋,你們能夠修改爲本身想要的,而後編譯安裝以後,對方就完全不知道你的版本號了。
7、Apache日誌切割
爲何要分割日誌?
隨着網站的訪問愈來愈大,WebServer產生的日誌文件也會愈來愈大,若是不對日誌進行分割,那麼只能一次將大的日誌(如Apache的日誌)整個刪除,這樣也丟失了不少對網站比較寶貴的信息,由於這些日誌能夠用來進行訪問分析、網絡安全監察、網絡運行情況監控等,所以管理好這些海量的日誌對網站的意義是很大的。
方法1:使用rotatelogs(apache自帶的工具)每隔一天記錄一個日誌
編輯Apache的主配置文件,更改內容以下:
註釋掉以下兩行:
而後再添加以下兩行:
截圖中內容以下:
ErrorLog"|/usr/local/http-2.4.23/bin/rotatelogs -l logs/error_%Y%m%d.log86400"
CustomLog"|/usr/local/http-2.4.23/bin/rotatelogs -l logs/access_%Y%m%d.log86400" combined
注:其中86400爲輪轉的時間單位爲秒
驗證:查看logs目錄下的日誌文件
注:優雅啓動後會當即產生error日誌,可是要一臺客戶機訪問一下這臺web服務器,纔會產生access日誌。
說明:因爲apache自帶的日誌輪詢工具rotatelogs,聽說在進行日誌切割時容易丟日誌,所以咱們一般使用cronolog進行日誌輪詢。
方法二、使用 cronolog 爲每一天創建一個新的日誌
安裝cronolog程序:
同上一種方法所示,註釋掉276和305兩行:
添加以下兩行:
說明:若是Apache中有多個虛擬主機,最好每一個虛擬主機中放置一個這樣的代碼,並將日誌文件名改爲不一樣的名字。
擴展:
①這個保證了天天一個文件夾文件夾下每一個小時產生一個log
②按天輪詢(生產環境常見用法,推薦使用):
③按小時輪詢(生產環境較常見用法):
注意:第一種方法和第二種方法這兩個管道日誌文件程序(即「|」)還有一點不一樣之處是使用cronolog 時若是日誌是放在某個不存在的路徑則會自動建立目錄,而使用 rotatelogs 時不能自動建立,這一點要特別注意。
7、配置防盜鏈
說明:有時候,你的網站莫名其妙的訪問量變大,不要高興的太早,有多是被別人盜鏈了。
舉個例子:好比你搭了個discuz論壇,裏面有些熱點圖片、視頻;而後別人將他網站上訪問圖片的地址重定向到你的discuz上,這樣他的服務器就能夠空閒出來了;也就是說別人訪問他網站的圖片視頻,消耗的確是你服務器的資源;
解決這個問題的方法是配置下防盜鏈,讓外來的盜不了鏈。
方法1:Apache 防盜鏈的第一種實現方法,能夠用rewrite實現。
首先要確認 Apache 的rewrite module可用:
從上圖能夠看出沒有rewrite module模塊,有兩種緣由,一是沒有下載安裝,二就是沒有啓用,咱們先去看看httpd主配置文件裏面有沒有rewrite module這塊模塊,是否是沒啓動,若是有啓動便可。
(去掉158行的註釋「#」便可)
而後在找到本身網站對應的配置的地方(如在主配置文件中或虛擬主機中),加入下列代碼:
截圖中內容以下:
RewriteEngineOn
RewriteCond%{HTTP_REFERER} !^$
RewriteCond%{HTTP_REFERER} !benet\.com/.*$ [NC]
RewriteCond%{HTTP_REFERER} !www\.benet\.com/.*$ [NC]
RewriteRule.*\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png[R,NC,L]
注:相關選項的解釋
1.RewriteEngine On #啓用rewrite,要想rewrite起做用,必需要寫上
2.RewriteCond test-string condPattern #寫在RewriteRule以前,能夠有一或N條,用於測試rewrite的匹配條件,具體怎麼寫,後面會詳細說到。
3.RewriteRule Pattern Substitution #規則
4.%{HTTP_REFERER}:服務器變量,HTTPReferer是header的一部分,當瀏覽器向web服務器發送請求的時候,通常會帶上Referer,告訴服務器我是從哪一個頁面連接過來的,服務器藉此能夠得到一些信息用於處理。好比從我主頁上連接到一個朋友那裏,他的服務器就可以從HTTP Referer中統計出天天有多少用戶點擊我主頁上的連接訪問他的網站。
5.[ NC]指的是不區分大小寫,[R]強制重定向 redirect
6.字母L表示若是能匹配本條規則,那麼本條規則是最後一條(Last),忽略以後的規則
防盜鏈配置的說明:
1. 紅色部分: 表示本身的信任站點。對個人站點來講,設置爲 http://www.benet.com 和 http://benet.com
2. 綠色部分: 要保護文件的擴展名(以|分開)。以這些爲擴展名的文件,必須經過紅色標註的網址引用,才能夠訪問。
3. 藍色部分: 定義被盜鏈時替代的圖片,讓全部盜鏈 jpg、gif、swf 等文件的網頁,顯示網頁文檔根目錄下的about/ nolink.png 文件。注意:替換顯示的圖片不要放在設置防盜鏈的目錄中,而且該圖片文件體積越小越好。固然你也能夠不設置替換圖片,而是使用下面的語句便可:RewriteRule .*\.(gif|jpg|png)$ - [F]
注:[F] (強制URL爲被禁止的forbidden),強制當前URL爲被禁止的,即,當即反饋一個HTTP響應代碼403(被禁止的)。
注:
RewriteCond%{HTTP_REFERER}!^$
上面這一行意在容許空「HTTP_REFERER」的訪問,即容許用戶在瀏覽器地址欄中直接輸入圖片地址時圖片文件的顯示。
RewriteCond %{HTTP_REFERER} !benet\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !www\.benet\.com/.*$ [NC]
設置容許訪問的HTTP來源,包括網站自身。
RewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png[R,NC,L]
將不知足referer條件的訪問重定向至nolink.png。nolink.png位於容許「盜鏈」的目錄about中,要至關注意,否則,警告信息和圖片將沒法在對方網站上顯示。
注意:測試時要清除濟瀏覽器緩存
如今開始測試:
①在httpd主配置文件末尾新加入了那五行,保存退出,要優雅啓動
②準備兩張測試圖片
③在httpdB的首頁上盜鏈(即作超連接)httpdA網站的paoche.jpg資源
④修改httpdB和客戶機的hosts文件
⑤在一臺客戶機上進行測試
實驗成功了,須要注意的是,若是是在實驗環境下,不要忘記開啓兩臺web服務器的80端口例外。
方法2:經過判斷瀏覽器頭信息來阻止某些請求,即利用SetEnvIfNoCase和access。
說明:這個方法能夠經過阻止某些機器人或蜘蛛爬蟲抓取你的網站來節省你的帶寬流量。
語法: SetEnvIfNoCase attribute regex [!]env-variable[=value][[!]env-variable[=value]] ...
SetEnvIfNoCase當知足某個條件時,爲變量賦值,即根據客戶端請求屬性設置環境變量。
注:Referer :指明瞭請求當前資源原始資源的URL,使用referer是能夠防盜鏈。
而後在找到本身網站對應的配置的地方(如在主配置文件中或虛擬主機中),加入下列代碼:
截圖中內容以下:
SetEnvIfNoCaseReferer "^$" local_ref
SetEnvIfNoCaseReferer "www.benet.com/.*$" local_ref
SetEnvIfNoCaseReferer "benet.com/.*$" local_ref
<filesmatch"\.(mp3|mp4|zip|rar|jpg|gif)">
方法一:
Order Deny,Allow
Allow from env=local_ref
Deny from all
方法二:
Order Allow,Deny
Allow from env=local_ref
#2.4版本以上,接着新添加以下內容:
截圖中內容以下:
Require alldenied
Require env local_ref
</filesmatch>
下面開始測試:
①修改完了httpd主配置文件,要優雅啓動:
②在一臺客戶機上測試(先清除客戶機的瀏覽器緩存,再測試)
3、fcgi模式編譯安裝LAMP+xcache
php的工做模式:
php在lamp環境下共有三種工做模式:CGI模式、apache模塊、FastCGI模式。CGI模式下運行PHP,性能不是很好。做爲apache的模塊方式運行,在之前的課程中編譯安裝lamp已經介紹過了。FastCGI的方式和apache模塊的不一樣點在於:FastCGI方式PHP是一處獨立的進程,全部PHP子進程都由PHP的一個叫做php-fpm的組件負責管理;而apache模塊化方式運行的PHP,則是apache負責調用PHP完成工做。PHP的FastCGI方式性能要比apache模塊化方式強不少,今天咱們以FastCGI方式編譯安裝lamp。
FastCGI工做機制:
首先客戶端發起請求,請求分爲2種,一種是靜態請求它能夠直接由Apache直接響應返回;另外一種是動態的請求,如其中包含中php或者Perl這種腳本解釋性語言,則由Apache服務器經過fastcgi協議調用php服務器執行並返回給Apache由Apache返回解釋執行後的結果,若是這個過程當中涉及到對數據的操做,此時php服務器還會還會經過mysql協議調用mysql服務器。
編譯環境及各軟件版本:
Linux |
Web服務器 |
Php |
Mysql數據庫 |
xcache |
Centos7.2 |
Httpd-2.4.23 |
php-5.4.26 |
Mysql5.7 |
xcache-3.1.0 |
主機規劃
至少3臺主機,操做系統都是centos7.2.網段在192.168.1.0,
網關192.168.1.1
分配以下:
1臺httpd服務器(192.168.1.7)
1臺php服務器(192.168.1.8)
1臺mysql服務器(192.168.1.9)
編譯安裝LAMP:
編譯安裝apache(請參考前面apache的安裝)
編譯安裝mysql(請參考mysql安裝)
FastCGI方式安裝php
下面安裝php服務器:
1、解決依賴關係
安裝libmcrypt:
2、編譯安裝php
上面截圖的內容以下:
./configure--prefix=/usr/local/php5.6 --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd--with-mysqli=mysqlnd --with-openssl --enable-fpm --enable-sockets --enable-sysvshm--enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir--with-zlib --with-libxml-dir=/usr --enable-xml --with-mhash--with-mcrypt=/usr/local/libmcrypt --with-config-file-path=/etc--with-config-file-scan-dir=/etc/php.d --with-bz2--enable-maintainer-zts &&make && make install
相關選項的解釋:
--prefix=/usr/local/php5.6 //安裝位置
--with-mysql=mysqlnd //支持mysql
--with-pdo-mysql=mysqlnd //支持pdo模塊
--with-mysqli=mysqlnd //支持mysqli模塊
注:上面的三選項的做用:數據庫與php不在一個服務器上,指定此種方式,安裝數據庫鏈接驅動
--with-openssl //支持openssl模塊
--enable-fpm //支持fpm模式
--enable-sockets //啓用socket支持
--enable-sysvshm //啓用系統共享內存支持
--enable-mbstring //多字節字串、像咱們的中文就是多字節字串
--with-freetype-dir //支持freetype、就要裝freetype-devel、跟字體相關的、字體解析工具
--with-jpeg-dir
--with-png-dir
注:上面的二選項的做用:處理jpeg、png圖片的、php能夠動態生成jpeg圖片
--with-zlib //是個壓縮庫、在互聯網傳輸時用來壓縮傳輸的
--with-libxml-dir=/usr //這個libxml是用來解析xml的、指定/usr下
--enable-xml //支持xml的
--with-mhash //支持mhash
--with-mcrypt=/usr/local/libmcrypt //libmcrypt-devel這個程序包所指定的
--with-config-file-path=/etc //指定配置文件的存放路徑的
--with-config-file-scan-dir=/etc/php.d //配置文件掃描路徑
--with-bz2 //支持BZip2
爲了支持apache的worker或event這兩個MPM,編譯時使用了--enable-maintainer-zts選項
說明:若是使用PHP5.3以上版本,爲了連接MySQL數據庫,能夠指定mysqlnd,這樣在本機就不須要先安裝MySQL或MySQL開發包了。mysqlnd從php5.3開始可用,能夠編譯時綁定到它(而不用和具體的MySQL客戶端庫綁定造成依賴),但從PHP 5.4開始它就是默認設置了。
3、提供php配置文件
4、爲php-fpm提供腳本
5、提供php-fpm配置文件並編輯
啓動php-fpm服務:
在該主機上新建虛擬主機目錄用於存放網頁文件:
至此php安裝配置完畢,下面配置apache經過fastcgi協議調用php。
6、配置apache(切換到apache主機上操做)
說明:在Apache2.4之後已經專門有一個模塊針對FastCGI的實現,此模塊爲mod_proxy_fcgi.so,它實際上是做爲mod_proxy.so模塊的擴充,所以,這兩個模塊都要加載。
下面這兩行去掉註釋「#」便可:
創建一個目錄做爲虛擬主機的家目錄:
編輯主配置文件httpd.conf,開啓虛擬主機:
去掉下面這一行的註釋「#」:
同時定位 AddType;添加下面兩行:讓apache能識別php格式的頁面:
而且定位至DirectoryIndex:支持php格式的主頁(添加index.php(最好添加在最前面)
配置虛擬主機支持使用fcgi:
截圖的內容以下:
<VirtualHost*:80>
ServerAdmin webmaster@benet.com
DocumentRoot "/var/www/benet"
ServerName www.benet.com
ServerAlias benet.com
ErrorLog"logs/benet.com-error_log"
CustomLog"logs/benet.com-access_log" common
ProxyRequests Off
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://192.168.1.8:9000/var/www/benet/$1
#<LocationMatch"^(.*\.php(/.*)?)$">
#ProxyPassfcgi://192.168.1.8:9000/var/www/benet
#</LocationMatch>
<Directory"/var/www/benet">
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
注意:本配置文件下面的那個虛擬主機實例刪除掉。
上面的配置項解釋以下:
ProxyRequests off #關閉正向代理
ProxyPassMatch #把以.php結尾的文件請求發送到php-fpm進程,php-fpm至少須要知道運行的目錄和URI,因此這裏直接在fcgi://192.168.1.8:9000後指明瞭這兩個參數,其它的參數的傳遞已經被mod_proxy_fcgi.so進行了封裝,不須要手動指定。
特別注意的是,紅色字體部分須要與<VirtualHost >中的 DocumentRoot 後的路徑一致,ProxyPassMatch只有知足特定正則模式的內容纔會匹配並執行此規則,這裏的模式是,^/(.*\.php(/.*)?)$
從網站(虛擬主機<VirtualHost >的根目錄開始,匹配任何以 .php 結尾,或者在 .php 以後緊跟一個 / 再跟別的內容的路徑。
^(caret) 和 $ (dollar)標誌要匹配的路徑的開始和結束
()括號裏的內容能夠用 $1 來表示,以方便後面引用它。
fcgi://192.168.1.81:9000經過 mod_proxy_fcgi 來轉發的代理,使用 fastCGI 協議,轉到 PHP-FPM 監聽的端口。
/path/to/your/documentroot/
很是重要!必須與虛擬主機的路徑匹配,且必須是對應 php 文件在操做系統中的絕對路徑。不然會找不到文件。
$1能夠從原始請求擴展成整個請求路徑的變量,這裏指代前面( ) 裏面匹配的那個路徑(uri)
補充:Apache httpd 2.4之前的版本中,要麼把PHP做爲Apache的模塊運行,要麼添加一個第三方模塊支持PHP-FPM實現。
優雅啓動httpd服務:
下面測試LAMP環境:
先在mysql主機上建立用於php服務器鏈接的mysql帳戶:
Mysql服務器防火牆上開啓3306端口例外:
在php服務器上的/var/www/benet目錄下建立.php的測試頁:
不要忘記web服務器也要開啓80端口例外:
在客戶機上訪問php測試頁:
如今客戶機的hosts文件裏面添加映射關係:
能夠看到上面兩個測試頁說明apache、php、mysql之間能夠協同工做了。
7、壓力測試
網站性能壓力測試是服務器網站性能調優過程當中必不可缺乏的一環。只有讓服務器處在高壓狀況下,才能真正體現出軟件、硬件等各類設置不當所暴露出的問題。
性能測試工具目前最多見的有如下幾種:ab、http_load、webbench、siege。今天咱們專門來介紹ab。
ab是apache自帶的壓力測試工具。ab很是實用,它不只能夠對apache服務器進行網站訪問壓力測試,也能夠對或其它類型的服務器進行壓力測試。好比nginx、tomcat、IIS等。
下面咱們開始介紹有關ab命令的使用:
1.ab的原理
2.ab的安裝
3.ab參數說明
4.ab性能指標
5.ab實際使用
6.測試nginx性能
1)ab的原理
ab是apachebench命令的縮寫。
ab的原理:ab命令會建立多個併發訪問線程,模擬多個訪問者同時對某一URL地址進行訪問。它的測試目標是基於URL的,所以,它既能夠用來測試apache的負載壓力,也能夠測試nginx、lighthttp、tomcat、IIS等其它Web服務器的壓力。
ab命令對發出負載的計算機要求很低,它既不會佔用很高CPU,也不會佔用不少內存。但卻會給目標服務器形成巨大的負載,其原理相似CC***。本身測試使用也須要注意,不然一次上太多的負載。可能形成目標服務器資源耗完,嚴重時甚至致使死機。
2)ab的安裝
ab的安裝很是簡單,若是是源碼安裝apache的話,那就更簡單了。apache安裝完畢後ab命令存放在apache安裝目錄的bin目錄下。以下:
注意1:若是apache是經過yum的RPM包方式安裝的話,ab命令默認存放在/usr/bin目錄下。
注意2:注意:若是不想安裝apache可是又想使用ab命令的話,咱們能夠直接安裝apache的工具包httpd-tools。以下:
yum-y install httpd-tools
查看ab是否安裝成功,能夠切換到上述目錄下,使用ab –V命令進行檢測。以下:
上圖顯示檢測結果報錯了,如下是解決辦法:
①先用find命令查看一下
②在搜索庫文件的文件裏添加libssl.so.1.0.0的路徑
③執行ldconfig命令使其修改生效
如今咱們再來次查看檢測一次:
從上圖看,問題已經解決了,能夠查看到了。
3)ab參數說明
有關ab命令的使用,咱們能夠經過幫助命令進行查看。以下:
下面咱們對這些參數,進行相關說明。以下:
-n:在測試會話中所執行的請求個數(即總請求數)。
-c:一次產生的請求個數(即併發用戶數)。
下面開始進行壓力測試:
上圖中的這部分數據用於描述每一個請求處理時間的分佈狀況,好比以上測試,80%的請求處理時間都不超過63ms,這個處理時間是指前面的Time per request,即對於單個用戶而言,平均每一個請求的處理時間。
繼續壓力測試
咱們再來進行一次壓力測試,此時併發用戶數爲1000,其餘條件不變,查看兩次測試結果的吞吐量差異。
4)ab性能指標
在進行性能測試過程當中有幾個指標比較重要:
1、吞吐率(Requests per second)
服務器併發處理能力的量化描述,單位是reqs/s,指的是在某個併發用戶數下單位時間內處理的請求數。某個併發用戶數下單位時間內能處理的最大請求數,稱之爲最大吞吐率。
記住:吞吐率是基於併發用戶數的。這句話表明了兩個含義:
a、吞吐率和併發用戶數相關
b、不一樣的併發用戶數下,吞吐率通常是不一樣的
計算公式:總請求數/處理完成這些請求數所花費的時間,即
Requestper second=Complete requests/Time taken for tests
必需要說明的是,這個數值表示當前機器的總體性能,值越大越好。
2、併發鏈接數(The number of concurrent connections)
併發鏈接數指的是某個時刻服務器所接受的請求數目,簡單的講,就是一個會話。
3、併發用戶數(Concurrency Level)
要注意區分這個概念和併發鏈接數之間的區別,一個用戶可能同時會產生多個會話,也即鏈接數。
4、用戶平均請求等待時間(Time per request)
計算公式:處理完成全部請求數所花費的時間/(總請求數/併發用戶數),即:
Timeper request=Time taken for tests/(Complete requests/ConcurrencyLevel)
5、服務器平均請求等待時間(Time per request:across all concurrentrequests)
計算公式:處理完成全部請求數所花費的時間/總請求數,即:
Timetaken for/testsComplete requests
能夠看到,它是吞吐率的倒數。
同時,它也等於用戶平均請求等待時間/併發用戶數,即
Timeper request/Concurrency Level
8、CentOS7.2下安裝php加速軟件Xcache(在php主機上完成下面的操做)
事先說明一下:
php安裝目錄:/usr/local/php5.6
php.ini配置文件路徑:/etc/php.ini
php網頁根目錄:/var/www/benet
1)安裝xcache
wgethttp://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz
#下載
2)建立xcache緩存文件
3)拷貝xcache後臺管理程序到網站根目錄
4)配置php支持xcache
在最後一行添加如下內容:
將xcache目錄拷貝到apache主機的網頁文檔目錄下:
5)測試
重啓php-fpm:
瀏覽器打開網站根目錄下面的xcache:
警告的緣由就是:沒有設定系統的timezone。
說明:從PHP 5.1.0,當對使用date() 等函數時,若是 timezone 設置不正確,在每一次調用時間函數時,都會產生 E_NOTICE 或者 E_WARNING 信息。而又在 PHP 5.1.0 中,date.timezone 這個選項,默認狀況下是關閉的,不管用什麼PHP 命令都是格林威治標準時間,可是PHP 5.3 中好像若是沒有設置也會強行拋出了這個錯誤的,解決此問題,只要本地化一下就好了。
解決辦法以下:
①進入php.ini配置文件
②修改第913行,去掉註釋「#」,並在後面加上PRC
③重啓php-fpm
再次瀏覽驗證一下:
上圖能夠看出,警告信息已經被解決掉了。
至此,Linux下安裝php加速軟件Xcache教程完成。
下面執行ab壓力測試:
執行第一次壓力測試:
執行第二次壓力測試:
查看xcache的命中率:
多瀏覽不少次下面的網頁:
而後去看命中率:
9、部署bbs論壇
①Discuz的程序文件解壓,而且將upload中全部文件放置到網站目錄(php服務器的操做)
②設置php-fpm的服務用戶爲下面文件的屬主或者對其設置寫權限,不然安裝時會報錯
③修改php.ini文件
④重啓php-fpm
web服務器也須要有靜態文件(apache服務器上操做):
設置httpd的服務用戶對指定文件也須要有寫權限:
在數據庫服務器上建立bbs數據庫及受權賬戶:
都置完成以後,在客戶機上輸入
http://www.benet.com/bbs/install便可安裝
出現上面這種狀況是因爲php服務器安裝了discuz以後致使程序發生變化從而致使動態服務器和靜態服務器的程序不一致,只須要手動把bbs服務器的文件和web服務器進行一次同步便可,若是想實現自動同步,須要使用其餘服務,如initory+rsync、sersync等工具。
使用以下命令進行同步:
動態服務器和靜態服務器同步文件以後,再次訪問bbs的網址就正常了: