Linux 詳解Apache 2.4web服務(wù)器

2018-07-31 14:44 更新

防偽碼我若不勇敢誰替我堅(jiān)強(qiáng)。

一、 安裝apache2.4.23

新版本的httpd-2.4新增以下特性
新增模塊
mod_proxy_fcgi(可提供fcgi代理
mod_ratelimit限制用戶帶寬
mod_request請求模塊對請求做過濾
mod_remoteip匹配客戶端的IP地址
對于基于IP的訪問控制做了修改不再支持allow,deny,order機(jī)制而是統(tǒng)一使用require進(jìn)行

還新增以下幾條新特性

1、MPM支持在運(yùn)行時裝載;不過要開啟這種特性在編譯安裝要啟用這三種功能
--enable-mpms-shared=all  --with-mpm=event
2、支持event
3、支持異步讀寫
4、在每個模塊及每個目錄上指定日志級別
5、增強(qiáng)版的表達(dá)式分析器
6、每請求配置<If>, <Elseif>
7、毫秒級別的keepalive timeout
8、基于FQDN的虛擬主機(jī)不再需要NameVirtualHost指令
9、支持使用自定義變量

安裝環(huán)境操作系統(tǒng)Centos7.2關(guān)閉selinux

檢查httpd包是否安裝如查安裝則卸載

1
[root@www ~]# rpm -q httpd



1、安裝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可移植運(yùn)行庫它是一個對操作系統(tǒng)調(diào)用的抽象庫用來實(shí)現(xiàn)Apache內(nèi)部組件對操作系統(tǒng)的使用提高系統(tǒng)的可移植性。

安裝apr和apr-util

1
2
3
4
[root@www ~]# tar zxf apr-1.5.2.tar.gz 
[root@www ~]# cd apr-1.5.2/
[root@www apr-1.5.2]# ./configure --prefix=/usr/local/apr
[root@www apr-1.5.2]# make&& make install


1
2
3
4
[root@www ~]# tar zxf apr-util-1.5.4.tar.gz 
[root@www ~]# cd apr-util-1.5.4/
[root@www apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@www apr-util-1.5.4]# make&& make install


 

安裝zlib

1
2
3
4
[root@www ~]# tar zxf zlib-1.2.8.tar.gz 
[root@www ~]# cd zlib-1.2.8/
[root@www zlib-1.2.8]# ./configure --prefix=/usr/local/zlib
[root@www zlib-1.2.8]# make&& make install


安裝pcre

1
2
3
4
[root@www ~]# tar zxf pcre-8.39.tar.gz 
[root@www ~]# cd pcre-8.39/
[root@www pcre-8.39]# ./configure --prefix=/usr/local/pcre
[root@www pcre-8.39]# make&& make install


安裝openssl

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

下載openssl

1
2
3
4
5
#wget  https://www.openssl.org/source/openssl-1.0.1u.tar.gz
[root@www ~]# tar zxf openssl-1.0.1u.tar.gz 
[root@www ~]# cd openssl-1.0.1u/
[root@www openssl-1.0.1u]# ./config -fPIC --prefix=/usr/local/openssl enable-shared
[root@www openssl-1.0.1u]# make&& make install


1
2
[root@www ~]# mv /usr/bin/openssl /usr/bin/openssl.1.0.1e
[root@www ~]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl


安裝apache2.4.23

1
2
3
4
[root@www ~]# tar zxf httpd-2.4.23.tar.gz 
[root@www ~]# cd httpd-2.4.23/
[root@www 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-modules=most --enable-mods-shared=most --enable-mpms-shared=all --with-mpm=event --enable-proxy --enable-proxy-fcgi --enable-expires --enable-deflate


相關(guān)參數(shù)解釋

--enable-so支持動態(tài)共享模塊即打開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:明確指明要靜態(tài)編譯到httpd二進(jìn)制文件的模塊<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模式默認(rèn)使用enevt模式在apache的早期版本2.0默認(rèn)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:”頭內(nèi)容即對網(wǎng)站圖片、js、css等內(nèi)容提供客戶端瀏覽器緩存的設(shè)置。這個是apache調(diào)優(yōu)的一個重要選項(xiàng)之一。

--enable-deflate:提供對內(nèi)容的壓縮傳輸編碼支持一般是html、js、css等內(nèi)容的站點(diǎn)。使用此參數(shù)會打打提高傳輸速度提升訪問者訪問的體驗(yàn)。在生產(chǎn)環(huán)境中這是apache調(diào)優(yōu)的一個重要選項(xiàng)之一。

1
[root@www httpd-2.4.23]# make&& make install



優(yōu)化http程序執(zhí)行路徑

1
[root@www httpd-2.4.23]# ln -s /usr/local/http-2.4.23/bin/* /usr/local/bin/



修改配置文件httpd.conf設(shè)置其中的ServerName值

例如ServerName www.benet.com

開啟apache服務(wù)器

1
# /usr/local/http-2.4.23/bin/apachectl start



開機(jī)后自動啟動

1
2
[root@ww
w httpd-2.4.23]# cp /usr/local/http-2.4.23/bin/apachectl /etc/init.d/httpd


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

1
2
3
[root@www httpd-2.4.23]# vi /etc/init.d/httpd
# chkconfig: 35 85 15
# description: apache 2.4.23


將 Apache 加入開機(jī)自動啟動

1
2
[root@www httpd-2.4.23]# chkconfig --add httpd
[root@www httpd-2.4.23]# chkconfig httpd on


啟動編譯好的 Apache 2.4.23

1
2
3
[root@www httpd-2.4.23]# service  httpd start
[root@www httpd-2.4.23]# netstat -anplt | grep 80
tcp6       0      0 :::80                   :::*       LISTEN      4807/httpd


客戶端測試訪問注意防火墻

二、 Apache的優(yōu)化配置

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

其次是硬盤的速度靜態(tài)站點(diǎn)尤為突出apache不斷的在讀取文件并發(fā)送給相應(yīng)的請求硬盤的讀寫是極其頻繁的動態(tài)站點(diǎn)也要不斷的加載web程序(php等)一個請求甚至要讀取十幾個文件才能處理完成因此盡可能的提高硬盤速度和質(zhì)量對提高apache的性能是有積極意義的。 

最后是cpu和網(wǎng)絡(luò)cpu影響的是web程序執(zhí)行速度網(wǎng)絡(luò)影響流量大小。    

 

1、apache的工作模式

Apache HTTP服務(wù)器被設(shè)計(jì)為一個強(qiáng)大的、靈活的能夠在多種平臺以及不同環(huán)境下工作的服務(wù)器。這種模塊化的設(shè)計(jì)就叫做“多進(jìn)程處理模塊”Multi-Processing ModuleMPM也叫做工作模式。

Prefork模式一個非線程型的

其主要工作方式是當(dāng)Apache服務(wù)器啟動后mpm_prefork模塊會預(yù)先創(chuàng)建多個子進(jìn)程(默認(rèn)為5個)每個子進(jìn)程只有一個線程當(dāng)接收到客戶端的請求后mpm_prefork模塊再將請求轉(zhuǎn)交給子進(jìn)程處理并且每個子進(jìn)程同時只能用于處理單個請求。如果當(dāng)前的請求數(shù)將超過預(yù)先創(chuàng)建的子進(jìn)程數(shù)時mpm_prefork模塊就會創(chuàng)建新的子進(jìn)程來處理額外的請求。Apache總是試圖保持一些備用的或者是空閑的子進(jìn)程用于迎接即將到來的請求。這樣客戶端的請求就不需要在接收后等候子進(jìn)程的產(chǎn)生。

由于在mpm_prefork模塊中每個請求對應(yīng)一個子進(jìn)程因此其占用的系統(tǒng)資源相對其他兩種模塊而言較多。不過mpm_prefork模塊的優(yōu)點(diǎn)在于它的每個子進(jìn)程都會獨(dú)立處理對應(yīng)的單個請求這樣如果其中一個請求出現(xiàn)問題就不會影響到其他請求。Prefork在效率上要比Worker要高但是內(nèi)存使用大得多不擅長處理高并發(fā)的場景。

Apache在prefork工作模式下影響性能的重要參數(shù)說明

1
2
3
4
5
6
7
8
9
10
11
12
13
# prefork MPM
<IfModule mpm_prefork_module>
StartServers             5
#apache啟動時候默認(rèn)開始的子進(jìn)程數(shù)
MinSpareServers          5
#最小的閑置子進(jìn)程數(shù)
MaxSpareServers         10
#最大的閑置子進(jìn)程數(shù)
MaxRequestWorkers      250
#MaxRequestWorkers設(shè)置了允許同時的最大接入請求數(shù)量。任何超過MaxRequestWorkers限制的請求將進(jìn)入等候隊(duì)列在apache2.3.1以前的版本MaxRequestWorkers被稱為MaxClients舊的名字仍舊被支持。
MaxConnectionsPerChild   500
#設(shè)置的是每個子進(jìn)程可處理的請求數(shù)。每個子進(jìn)程在處理了“MaxConnectionsPerChild”個請求后將自動銷毀。0意味著無限即子進(jìn)程永不銷毀。雖然缺省設(shè)為0可以使每個子進(jìn)程處理更多的請求但如果設(shè)成非零值也有兩點(diǎn)重要的好處1、可防止意外的內(nèi)存泄漏。2、在服務(wù)器負(fù)載下降的時侯會自動減少子進(jìn)程數(shù)。因此可根據(jù)服務(wù)器的負(fù)載來調(diào)整這個值。在Apache2.3.9之前稱之為MaxRequestsPerChild。
</IfModule>


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

注2prefork 控制進(jìn)程在最初建立“StartServers”個子進(jìn)程后為了滿足MinSpareServers設(shè)置的需要創(chuàng)建一個進(jìn)程等待一秒鐘繼續(xù)創(chuàng)建兩 個再等待一秒鐘繼續(xù)創(chuàng)建四個……如此按指數(shù)級增加創(chuàng)建的進(jìn)程數(shù)最多達(dá)到每秒32個直到滿足MinSpareServers設(shè)置的值為止。這種模式 可以不必在請求到來時再產(chǎn)生新的進(jìn)程從而減小了系統(tǒng)開銷以增加性能。MaxSpareServers設(shè)置了最大的空閑進(jìn)程數(shù)如果空閑進(jìn)程數(shù)大于這個 值A(chǔ)pache會自動kill掉一些多余進(jìn)程。這個值不要設(shè)得過大但如果設(shè)的值比MinSpareServers小Apache會自動把其調(diào)整為 MinSpareServers+1。如果站點(diǎn)負(fù)載較大可考慮同時加大MinSpareServers和MaxSpareServers。  

注3ServerLimit和MaxClientsMaxRequestWorkers有什么區(qū)別呢

是因?yàn)樵赼pache1時代控制最大進(jìn)程數(shù)只有MaxClients這個參數(shù)并且這個參數(shù)最大值為256并且是寫死了的試圖設(shè)置為超過256是無效的這是由于apache1時代的服務(wù)器硬件限制的。但是apache2時代由于服務(wù)器硬件的升級硬件已經(jīng)不再是限制所以使用ServerLimit這個參數(shù)來控制最大進(jìn)程數(shù)ServerLimit值>=MaxClient值才有效。ServerLimit要放在MaxClients之前值要不小于MaxClients。

注4查看Apache加載的模塊

1
2
3
4
5
[root@www ~]#apachectl -t -D DUMP_MODULES
[root@www ~]# apachectl-M
[root@www ~]# apachectl–l


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

注5如何修改prefork參數(shù)和啟用prefork模式

1
2
3
4
1.[root@www ~]# vi /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf
2.[root@www ~]# vi /usr/local/http-2.4.23/conf/httpd.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
Include conf/extra/httpd-mpm.conf


3.重啟httpd服務(wù)

Worker模式(多線程多進(jìn)程)

和prefork模式相比worker使用了多進(jìn)程和多線程的混合模式worker模式也同樣會先預(yù)派生一些子進(jìn)程然后每個子進(jìn)程創(chuàng)建一些線程同時包括一個監(jiān)聽線程每個請求過來會被分配到一個線程來服務(wù)。線程比起進(jìn)程會更輕量因?yàn)榫€程是通過共享父進(jìn)程的內(nèi)存空間因此內(nèi)存的占用會減少一些在高并發(fā)的場景下會比prefork有更多可用的線程表現(xiàn)會更優(yōu)秀一些另外如果一個線程出現(xiàn)了問題也會導(dǎo)致同一進(jìn)程下的線程出現(xiàn)問題如果是多個線程出現(xiàn)問題也只是影響Apache的一部分而不是全部。由于用到多進(jìn)程多線程需要考慮到線程的安全了在使用keep-alive長連接的時候某個線程會一直被占用即使中間沒有請求需要等待到超時才會被釋放該問題在prefork模式下也存在

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

Apache在worker工作模式下影響性能的重要參數(shù)說明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# worker MPM
<IfModule mpm_worker_module>
StartServers             3
#apache啟動時候默認(rèn)開始的子進(jìn)程數(shù)
MinSpareThreads         75
#最小空閑數(shù)量的工作線程
MaxSpareThreads        250
#最大空閑數(shù)量的工作線程
ThreadsPerChild         25
#每個子進(jìn)程產(chǎn)生的線程數(shù)量
MaxRequestWorkers      400
#與prefork模式相同
MaxConnectionsPerChild   0
#與prefork模式相同
</IfModule>


注1Worker 由主控制進(jìn)程生成“StartServers”個子進(jìn)程每個子進(jìn)程中包含固定的ThreadsPerChild線程數(shù)各個線程獨(dú)立地處理請求。同樣 為了不在請求到來時再生成線程MinSpareThreads和MaxSpareThreads設(shè)置了最少和最多的空閑線程數(shù)

而MaxRequestWorkers 設(shè)置了同時連入的clients最大總數(shù)。如果現(xiàn)有子進(jìn)程中的線程總數(shù)不能滿足負(fù)載控制進(jìn)程將派生新的子進(jìn)程 

MinSpareThreads和 MaxSpareThreads的最大缺省值分別是75和250。這兩個參數(shù)對Apache的性能影響并不大可以按照實(shí)際情況相應(yīng)調(diào)節(jié) 。

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

注3Worker模式下所能同時處理的請求總數(shù)是由子進(jìn)程總數(shù)乘以ThreadsPerChild 值決定的應(yīng)該大于等于MaxRequestWorkers。如果負(fù)載很大現(xiàn)有的子進(jìn)程數(shù)不能滿足時控制進(jìn)程會派生新的子進(jìn)程。默認(rèn)最大的子進(jìn)程總數(shù)是16加大時 也需要顯式聲明ServerLimit系統(tǒng)配置的最大進(jìn)程數(shù)量最大值是20000。需要注意的是如果顯式聲明了ServerLimit那么它乘以 ThreadsPerChild的值必須大于等于MaxRequestWorkers而且MaxRequestWorkers必須是ThreadsPerChild的整數(shù)倍否則 Apache將會自動調(diào)節(jié)到一個相應(yīng)值。

注4進(jìn)程與線程的區(qū)別

線程是指進(jìn)程內(nèi)的一個執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實(shí)體.
與進(jìn)程的區(qū)別:
(1)地址空間:進(jìn)程內(nèi)的一個執(zhí)行單元;進(jìn)程至少有一個線程;它們共享進(jìn)程的地址空間;而進(jìn)程有自己獨(dú)立的地址空間;
(2)資源擁有:進(jìn)程是資源分配和擁有的單位,同一個進(jìn)程內(nèi)的線程共享進(jìn)程的資源
(3)線程是處理器調(diào)度的基本單位,但進(jìn)程不是.
(4)二者均可并發(fā)執(zhí)行.

進(jìn)程和線程都是由操作系統(tǒng)所體會的程序運(yùn)行的基本單元系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對應(yīng)用的并發(fā)性。

進(jìn)程和線程的區(qū)別在于

簡而言之,一個程序至少有一個進(jìn)程,一個進(jìn)程至少有一個線程. 
線程的劃分尺度小于進(jìn)程使得多線程程序的并發(fā)性高。 
另外進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元而多個線程共享內(nèi)存從而極大地提高了程序的運(yùn)行效率。 

Event模式

這是Apache最新的工作模式是worker模式的變種它把服務(wù)進(jìn)程從連接中分離出來一worker模式不同的是在于它解決了keep-alive長連接的時候占用線程資源被浪費(fèi)的問題在event工作模式中會有一些專門的線程用來管理這些keep-alive類型的線程當(dāng)有真實(shí)請求過來的時候?qū)⒄埱髠鬟f給服務(wù)器的線程執(zhí)行完畢后又允許它釋放。這增強(qiáng)了在高并發(fā)場景下的請求處理。event模式不能很好的支持https的訪問HTTP認(rèn)證相關(guān)的問題。

2、apache配置參數(shù)

1KeepAlive On/Off
  KeepAlive指的是保持連接活躍換一句話說如果將KeepAlive設(shè)置為On那么來自同一客戶端的請求就不需要再一次連接避免每次請求都要新建一個連接而加重服務(wù)器的負(fù)擔(dān)。一般情況下圖片較多的網(wǎng)站應(yīng)該把KeepAlive設(shè)為On。

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

3MaxKeepAliveRequests 100
  一次連接可以進(jìn)行的HTTP請求的最大請求次數(shù)。將其值設(shè)為0將支持在一次連接內(nèi)進(jìn)行無限次的傳輸請求。事實(shí)上沒有客戶程序在一次連接中請求太多的頁面通常達(dá)不到這個上限就完成連接了。

4HostnameLookups on|off|double
如果是使用on那么只有進(jìn)行一次反查如果用double那么進(jìn)行反查之后還要進(jìn)行一次正向解析只有兩次的結(jié)果互相符合才行而off就是不進(jìn)行域名驗(yàn)證。
如果為了安全建議使用double為了加快訪問速度建議使用off。

域名查找開啟這個會增加apache的負(fù)擔(dān), 減慢訪問速度建議關(guān)閉

5timeout 5

推薦5 這個是 apache接受請求或者發(fā)出相應(yīng)的時間超過這個時間斷開

注以上配置項(xiàng)可在/usr/local/http-2.4.23/conf/extra/httpd-default.conf設(shè)置并在httpd.conf文件中通過include選項(xiàng)引用

MPM這個比較關(guān)鍵是影響并發(fā)效率的主要因素

1StartServers        10
  設(shè)置服務(wù)器啟動時建立的子進(jìn)程數(shù)量。因?yàn)樽舆M(jìn)程數(shù)量動態(tài)的取決于負(fù)載的輕重,所以一般沒有必要調(diào)整這個參數(shù)。

2MinSpareServers     10
  設(shè)置空閑子進(jìn)程的最小數(shù)量。所謂空閑子進(jìn)程是指沒有正在處理請求的子進(jìn)程。如果當(dāng)前空閑子進(jìn)程數(shù)少于MinSpareServers ,那么Apache將以最大每秒一個的速度產(chǎn)生新的子進(jìn)程。只有在非常繁忙機(jī)器上才需要調(diào)整這個參數(shù)。將此參數(shù)設(shè)的太大通常是一個壞主意。

3MaxSpareThreads     75
  設(shè)置空閑子進(jìn)程的最大數(shù)量。如果當(dāng)前有超過MaxSpareServers數(shù)量的空閑子進(jìn)程,那么父進(jìn)程將殺死多余的子進(jìn)程。只有在非常繁忙機(jī)器上才需要調(diào)整這個參數(shù)。將此參數(shù)設(shè)的太大通常是一個壞主意。如果你將該指令的值設(shè)置為比MinSpareServers小,Apache將會自動將其修改成”MinSpareServers+1″。

4ServerLimit       2000
  服務(wù)器允許配置的進(jìn)程數(shù)上限。只有在你需要將MaxClients設(shè)置成高于默認(rèn)值256的時候才需要使用。要將此指令的值保持和MaxClients一樣。修改此指令的值必須完全停止服務(wù)后再啟動才能生效以restart方式重啟動將不會生效。

5MaxClients/MaxRequestWorkers         256
  用于客戶端請求的最大請求數(shù)量最大子進(jìn)程數(shù)任何超過MaxClients限制的請求都將進(jìn)入等候隊(duì)列。默認(rèn)值是256如果要提高這個值必須同時提高ServerLimit的值。建議將初始值設(shè)為(以Mb為單位的最大物理內(nèi)存/2),然后根據(jù)負(fù)載情況進(jìn)行動態(tài)調(diào)整。比如一臺4G內(nèi)存的機(jī)器那么初始值就是4000/2=2000。

6MaxRequestsPerChild /MaxConnectionsPerChild 0
  設(shè)置的是每個子進(jìn)程可處理的請求數(shù)。每個子進(jìn)程在處理了“MaxRequestsPerChild”個請求后將自動銷毀。0意味著無限即子進(jìn)程永不銷毀。內(nèi)存較大的服務(wù)器可以設(shè)置為0或較大的數(shù)字。內(nèi)存較小的服務(wù)器不妨設(shè)置成30、50、100。所以一般情況下如果你發(fā)現(xiàn)服務(wù)器的內(nèi)存直線上升建議修改該參數(shù)試試。

注以上配置項(xiàng)可在/usr/local/http-2.4.23/conf/extra/httpd-mpm.conf設(shè)置并在httpd.conf文件中通過include選項(xiàng)引用

3、開啟apache的Gzipdeflate功能

gzip可以極大的加速網(wǎng)站有時壓縮比率高到80%,最少都有40%以上還是相當(dāng)不錯的。在Apache2之后的版本模塊名不叫g(shù)zip,而叫mod_deflate

未使用Gzip

開啟使用Gzip

如果要開啟deflate的話,一定要打開下面二個模塊

LoadModule deflate_module modules/mod_deflate.so

LoadModule headers_module modules/mod_headers.so

設(shè)置壓縮比率,取值范圍在 1(最低) 到 9(最高)之間,不建議設(shè)置太高,雖然有很高的壓縮率,但是占用更多的CPU資源.

mod_deflate模塊檢查及安裝

1
2
[root@www ~]# /usr/local/http-2.4.23/bin/apachectl -M | grep deflate
 deflate_module (shared)


如果沒有安裝

a.編譯時安裝方法

 編譯的時候跟上--enable-deflate即可實(shí)現(xiàn)安裝
b.DSO方式安裝

1
2
3
4
[root@www ~]# cd /root/httpd-2.4.23/modules/filters/ #切到apache源碼包mod_deflate所在的目錄下# /usr/local/http-2.4.23/bin/apxs
-c -i -a mod_deflate.c  #以dso的方式編譯安裝到apache中
# /usr/local/http2.2/bin/apxs -c -i -a /root/httpd-2.2.17/modules/metadata/mod_headers.c#以dso的方式編譯安裝到apache中[root@www filters]# ll /usr/local/http-2.4.23/modules/mod_deflate.so  
#檢查mod_deflate是否安裝成功安裝這里會顯示出該文件

-rwxr-xr-x. 1 root root 98144 Oct 22 23:14 /usr/local/http-2.4.23/modules/mod_deflate.so

apxs命令參數(shù)說明 
-i  此選項(xiàng)表示需要執(zhí)行安裝操作以安裝一個或多個動態(tài)共享對象到服務(wù)器的modules目錄中。 
-a  此選項(xiàng)自動增加一個LoadModule行到httpd.conf文件中以啟用此模塊或者如果此行已經(jīng)存在則啟用之。 
-c  此選項(xiàng)表示需要執(zhí)行編譯操作。

如果重啟的時候出現(xiàn)錯誤

引用

Cannot load /usr/local/apache/modules/mod_deflate.so into server: /usr/local/apache/modules/mod_deflate.so: undefined symbol: inflateEnd

需要在 LoadModule deflate_module  modules/mod_deflate.so 的前面加載zlib.so

這里需要注意的是LoadModule deflate_module需要放在LoadModule php5_module之后

引用

LoadFile /usr/lib/libz.so(x64系統(tǒng)中該庫文件位于/usr/lib64目錄下可以軟鏈接到/usr/lib下

LoadModule deflate_module     modules/mod_deflate.so

 

重新啟動httpd:

1
# /usr/local/http2.4.23/bin/apachectl graceful  #優(yōu)雅啟動httpd服務(wù)


修改Apache配置文件開啟gzip壓縮傳輸

http.conf修改、增加配置參數(shù)

1
2
LoadModule deflate_module     modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so


打開httpd.conf后先將上面兩行配置前面的#號去掉這樣apache就會啟用這兩個模塊其中mod_deflate是壓縮模塊就是對要傳輸?shù)娇蛻舳说拇a進(jìn)行g(shù)zip壓縮mod_headers模塊的作用是告訴瀏覽器頁面使用了gzip壓縮如果不開啟mod_headers那么瀏覽器就會對gzip壓縮過的頁面進(jìn)行下載而無法正常顯示。

在httpd.conf中加入以下代碼可以加到任何空白地方不了解apache的話如果擔(dān)心加錯地方就放到http.conf文件的最后一行

注在添加代碼前最好先查一查要添加的代碼是否存在

1
2
3
4
5
6
7
8
9
10
11
12
13
<IfModule mod_deflate.c>
        DeflateCompressionLevel 9# 壓縮程度的等級預(yù)設(shè)可以采用 6 這個數(shù)值以維持耗用處理器效能與網(wǎng)頁壓縮質(zhì)量的平衡。
        SetOutputFilter DEFLATE   #設(shè)置輸出過濾器對輸出啟用壓縮必須的就像一個開關(guān)一樣告訴apache對傳輸?shù)綖g覽器的內(nèi)容進(jìn)行壓縮
        #AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript application/x-httpd-php
        #AddOutputFilterByType DEFLATE image/*
        AddOutputFilterByType DEFLATE text/*#設(shè)置對文件是文本的內(nèi)容進(jìn)行壓縮例如text/html  text/css  text/plain等.
        AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript  #對javascript文件進(jìn)行壓縮
        AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp #對php類型的文件進(jìn)行壓縮.
        SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary  #設(shè)置不對后綴gifjpgjpegpng的圖片文件進(jìn)行壓縮。注?:表示不會捕獲 ( )里內(nèi)容了
  
        SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary#同上就是設(shè)置不對exetgzgz等的文件進(jìn)行壓縮
        SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary #同上就是設(shè)置不對pdfavimp3等的文件進(jìn)行壓縮
</IfModule>


#設(shè)置日志輸出

1
2
3
4
5
DeflateFilterNote Input input_info#聲明輸入流的byte數(shù)量
DeflateFilterNote Output output_info#聲明輸出流的byte數(shù)量
DeflateFilterNote Ratio ratio_info#聲明壓縮的百分比
LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate#聲明日志格式
CustomLog logs/deflate_log.log deflate


修改完成后保存退出并重啟httpd服務(wù)

使用谷歌瀏覽器測試訪問如下圖顯示結(jié)果提示在訪問測試頁之前按F12鍵

查看日志

1
2
3
[root@www htdocs]# cat ../logs/deflate_log.log
"GET /test.html HTTP/1.1" 6421/19949 (32%)
"GET /test1.html HTTP/1.1" 1360/4266 (31%)


注圖片是不需要啟用GZip壓縮的從GZip檢測結(jié)果來看壓縮后的圖片體積竟然大過原體積這就解釋了為什么圖片不用啟用GZip壓縮的原因了

      可以檢測了幾個門戶網(wǎng)站的圖片還有Google、baidu的圖片統(tǒng)統(tǒng)都沒有啟用圖片GZip壓縮只是啟用了html、css、js等文件的GZip壓縮這就更加說明了GZip壓縮不適用于圖片上。另外除了圖片之外flash的swf文件也是不用啟用GZip壓縮的。

 

4、配置mod_expires模塊

這個非常有用的優(yōu)化mod_expires可以減少20-30%左右的重復(fù)請求讓重復(fù)的用戶對指定的頁面請求結(jié)果都CACHE在本地根本不向服務(wù)器發(fā)出請求。但要注意更新快的文件不要這么做。

這個模塊控制服務(wù)器應(yīng)答時的Expires頭內(nèi)容和Cache-Control頭的max-age指令。有效期(expiration date)可以設(shè)置為相對于源文件的最后修改時刻或者客戶端的訪問時刻。

未啟用expire的效果

1
2
3
4
5
6
7
8
9
10
[root@www htdocs]# curl -I 192.168.31.83/12.png
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 15:52:37 GMT
Server: Apache/2.4.23 (Unix)
Last-Modified: Sun, 23 Oct 2016 15:34:10 GMT
ETag: "8c9f-53f8a01b18080"
Accept-Ranges: bytes
Content-Length: 35999
Vary: Accept-Encoding
Content-Type: image/png


 

啟用expire緩存

mod_expires的安裝配置

啟用expires_module

LoadModule expires_module modules/mod_expires.so

然后添加Expires配置規(guī)則

1
2
3
4
5
6
7
8
9
10
11
12
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "now plus 1 month"
ExpiresByType application/x-javascript "now plus 5 day"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/bmp "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType image/png "access plus 1 minutes"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresDefault "now plus 0 minutes"
</IfModule>


驗(yàn)證

1
2
3
4
5
6
7
8
9
10
11
12
[root@www htdocs]# curl -I 192.168.31.83/12.png
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 16:00:57 GMT
Server: Apache/2.4.23 (Unix)
Last-Modified: Sun, 23 Oct 2016 15:34:10 GMT
ETag: "8c9f-53f8a01b18080"
Accept-Ranges: bytes
Content-Length: 35999
Cache-Control: max-age=60
Expires: Tue, 25 Oct 2016 16:01:57 GMT
Vary: Accept-Encoding
Content-Type: image/png


 

ExpiresDefault 和ExpiresByType 指令同樣能夠用易懂的語法格式進(jìn)行定義

ExpiresDefault "<base> [plus] {<num><type>}"
ExpiresByType type/encoding "<base> [plus] {<num><type>}"

其中<base>是下列之一

access

now (等價于'access ')

modification

plus 關(guān)鍵字是可選的。<num>必須是整數(shù)<type>是下列之一

years

months

weeks

days

hours

minutes

seconds

例如下列3個指令都表示文檔默認(rèn)的有效期是一個月

1
2
3
4
5
6
ExpiresDefault "access plus 1 month"ExpiresDefault "access plus 4 weeks"ExpiresDefault "access plus 30 days"
有效期可以通過增加"<num><type>"子句進(jìn)一步調(diào)整
ExpiresByType text/html "access plus 1 month 15 days 2 hours"ExpiresByType image/gif "modification plus 5 hours 3 minutes"
注意如果你使用基于最后修改日期的設(shè)置"Expires:"頭將不會 被添加到那些并非來自于磁盤文件的內(nèi)容。這是因?yàn)檫@些內(nèi)容并不存在"最后修改時間"的屬性。
# GIF有效期為1個月秒數(shù)ExpiresByType image/gif A2592000 ExpiresByType image/jpeg A2592000 ExpiresByType image/png A2592000 ExpiresByType image/x-icon A2592000 ExpiresByType
application/x-javascript A604800 ExpiresByType text/plain A604800 # HTML文檔的有效期是最后修改時刻后的一星期 ExpiresByType text/html M604800 </IfModule>


"M"表示源文件的最后修改時刻"A"表示客戶端對源文件的訪問時刻。后面的時間則以秒計(jì)算。

有關(guān) Apache Expires Module 的介紹可以參閱其官方文檔:

http://httpd.apache.org/docs/2.4/mod/mod_expires.html

 

4、Apache禁止目錄遍歷

將Options Indexes FollowSymLinks中的Indexes 去掉就可以禁止 Apache 顯示該目錄結(jié)構(gòu)。Indexes 的作用就是當(dāng)該目錄下沒有 index.html文件時就顯示目錄結(jié)構(gòu)。

5、apache 隱藏版本信息

測試默認(rèn) apache 的狀態(tài)信息

1
2
3
4
5
6
7
8
9
10
11
[root@www htdocs]# curl -I 192.168.31.83
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 16:09:09 GMT
Server: Apache/2.4.23 (Unix)
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Cache-Control: max-age=0
Expires: Tue, 25 Oct 2016 16:09:09 GMT
Content-Type: text/html


1、主配置中啟用httpd-default.conf

1
Include conf/extra/httpd-default.conf


2、修改httpd-default.conf

文件/usr/local/http-2.4.23/conf/extra/httpd-default.conf

找到

1
2
3
4
5
ServerTokens Full
ServerSignature On
改成
ServerTokens Prod
ServerSignature off


重啟 apache 測試

測試隱藏版本號后 apache 的狀態(tài)信息

[

1
2
3
4
5
6
7
8
9
10
11
root@www htdocs]# curl -I 192.168.31.83
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 16:14:32 GMT
Server: Apache
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Cache-Control: max-age=0
Expires: Tue, 25 Oct 2016 16:14:32 GMT
Content-Type: text/html


如果你需要徹底將版本之類的信息進(jìn)行改頭換面你就需要在編譯之前做準(zhǔn)備或者進(jìn)行從新編譯了。在重新編譯時修改源碼包下include目錄下的ap_release.h文件

1
2
3
4
5
6
7
8
9
#define AP_SERVER_BASEVENDOR "Apache Software Foundation" #服務(wù)的供應(yīng)商名稱
#define AP_SERVER_BASEPROJECT "Apache HTTP Server"  #服務(wù)的項(xiàng)目名稱
#define AP_SERVER_BASEPRODUCT
"Apache"        #服務(wù)的產(chǎn)品名
#define AP_SERVER_MAJORVERSION_NUMBER 2  #主要版本號
#define AP_SERVER_MINORVERSION_NUMBER 4  #小版本號
#define AP_SERVER_PATCHLEVEL_NUMBER 23  #補(bǔ)丁級別
#define
AP_SERVER_DEVBUILD_BOOLEAN  0  #


上述列出的行已經(jīng)給出了注釋大家可以修改成自己想要的然后編譯安裝之后對方就徹底不知道你的版本號了。

 

6、Apache日志切割

為什么要分割日志
隨著
網(wǎng)站的訪問越來越大WebServer產(chǎn)生的日志文件也會越來越大如果不對日志進(jìn)行分割那么只能一次將大的日志(如Apache的日志)整個刪除這樣也丟失了很多對網(wǎng)站比較寶貴的信息因?yàn)檫@些日志可以用來進(jìn)行訪問分析、網(wǎng)絡(luò)安全監(jiān)察、網(wǎng)絡(luò)運(yùn)行狀況監(jiān)控等因此管理好這些海量的日志對網(wǎng)站的意義是很大的。 

方法1:使用rotatelogsapache自帶的工具每隔一天記錄一個日志

輯Apache的主配置文件更改內(nèi)容如下
注釋掉如下兩行

1
2
ErrorLog logs/error_log
CustomLog logs/access_log common

然后添加如下兩行

1
2
ErrorLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/error_%Y%m%d.log 86400"
CustomLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined


注其中86400為輪轉(zhuǎn)的時間單位為秒

驗(yàn)證查看logs目錄下的日志文件

1
2
[root@www ~]# ls /usr/local/http-2.4.23/logs/
access_20161026.log  access_log  deflate_log.log  error_20161026.log  error_log  httpd.pid


由于apache自帶的日志輪詢工具rotatelogs據(jù)說在進(jìn)行日志切割時容易丟日志因此我們通常使用cronolog進(jìn)行日志輪詢。

方法2、使用 cronolog 為每一天建立一個新的日志

安裝cronolog程序

下載cronolog  

1
2
3
[root@www ~]# tar zxf cronolog-1.6.2.tar.gz
[root@www ~]# cd cronolog-1.6.2/
[root@www cronolog-1.6.2]# ./configure && make && make install


 

主配置文件中的使用方法

1
2
ErrorLog "|/usr/local/sbin/cronolog logs/error-%Y%m%d.log"
CustomLog "|/usr/local/sbin/cronolog logs/access-%Y%m%d.log" combined


如果Apache中有多個虛擬主機(jī)最好每個虛擬主機(jī)中放置一個這樣的代碼并將日志文件名改成不同的名字。

擴(kuò)展

這個保證了每天一個文件夾文件夾下每個小時產(chǎn)生一個log

CustomLog "|/usr/local/sbin/cronolog logs /%Y%m%d/access_log.%H" combined

 

按天輪詢生產(chǎn)環(huán)境常見用法推薦使用
CustomLog "|/usr/local/sbin/cronolog logs/access_www_%Y%m%d.log" combined


按小時輪詢生產(chǎn)環(huán)境較常見用法
CustomLog "|/usr/local/sbin/cronolog logs /access_www_ %Y%m%d%H.log" combined

 

驗(yàn)證查看logs目錄下的日志文件

[

1
2
root@www ~]# ls /usr/local/http-2.4.23/logs/
access-20161026.log  access_log  deflate_log.log  error-20161026.log  error_log  httpd.pid


注意

這兩個管道日志文件程序還有一點(diǎn)不同之處是使用 cronolog 時如果日志是放在某個不存在的路徑則會自動創(chuàng)建目錄而使用 rotatelogs 時不能自動創(chuàng)建這一點(diǎn)要特別注意

 

7、配置防盜鏈

有時候你的網(wǎng)站莫名其妙的訪問量變大不要高興的太早有可能是被別人盜鏈了。

舉個例子比如你搭了個discuz論壇里面有些熱點(diǎn)圖片、視頻然后別人將他網(wǎng)站上訪問圖片的地址重定向到你的discuz上這樣他的服務(wù)器就可以空閑出來了也就是說別人訪問他網(wǎng)站的圖片視頻消耗的確是你服務(wù)器的資源

解決這個問題的方法是配置下防盜鏈讓外來的盜不了鏈

方法1Apache 防盜鏈的第一種實(shí)現(xiàn)方法可以用rewrite實(shí)現(xiàn)。

首先要確認(rèn) Apache 的rewrite module可用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@www ~]# apachectl -M | grep rewrite
rewrite_module (shared)
打開 httpd.conf確保有這么一行配置:
LoadModule rewrite_module modules/mod_rewrite.so
然后在找到自己網(wǎng)站對應(yīng)的配置的地方如在主配置文件中或虛擬主機(jī)中加入下列代碼
ServerName www.benet.com
#防盜鏈配置
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !benet\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !benet\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !www\.benet\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !www\.benet\.com/.*$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png [R,NC,L]


注相關(guān)選項(xiàng)的解釋

1.RewriteEngine On #啟用rewrite要想rewrite起作用必須要寫上

2.RewriteCond test-string condPattern #寫在RewriteRule之前可以有一或N條用于測試rewrite的匹配條件具體怎么寫后面會詳細(xì)說到。

3.RewriteRule Pattern Substitution #規(guī)則

4. %{HTTP_REFERER}服務(wù)器變量HTTPReferer是header的一部分當(dāng)瀏覽器向web服務(wù)器發(fā)送請求的時候一般會帶上Referer告訴服務(wù)器我是從哪個頁面鏈接過來的服務(wù)器藉此可以獲得一些信息用于處理。比如從我主頁上鏈接到一個朋友那里他的服務(wù)器就能夠從HTTP Referer中統(tǒng)計(jì)出每天有多少用戶點(diǎn)擊我主頁上的鏈接訪問他的網(wǎng)站。

5.[ NC]指的是不區(qū)分大小寫,[R]強(qiáng)制重定向 redirect

6.字母L表示如果能匹配本條規(guī)則那么本條規(guī)則是最后一條(Last)忽略之后的規(guī)則

防盜鏈配置的說明

1. 紅色部分: 表示自己的信任站點(diǎn)。對我的站點(diǎn)來說設(shè)置為 http://www.benet.com 和 http://benet.com

2. 綠色部分: 要保護(hù)文件的擴(kuò)展名(以|分開)。以這些為擴(kuò)展名的文件必須通過紅色標(biāo)注的網(wǎng)址引用才可以訪問。

3. 藍(lán)色部分: 定義被盜鏈時替代的圖片讓所有盜鏈 jpg、gif、swf 等文件的網(wǎng)頁顯示網(wǎng)頁文檔根目錄下的about/ nolink.png 文件。注意替換顯示的圖片不要放在設(shè)置防盜鏈的目錄中并且該圖片文件體積越小越好。當(dāng)然你也可以不設(shè)置替換圖片而是使用下面的語句即可RewriteRule .*\.(gif|jpg|png)$ - [F]

注[F] (強(qiáng)制URL為被禁止的 forbidden),強(qiáng)制當(dāng)前URL為被禁止的即立即反饋一個HTTP響應(yīng)代碼403(被禁止的)。

RewriteCond%{HTTP_REFERER}!^$ 
上面這一行意在允許空“HTTP_REFERER”的訪問即允許用戶在瀏覽器地址欄中直接輸入圖片地址時圖片文件的顯示。

RewriteCond %{HTTP_REFERER} !benet\.com/.*$ [NC]

RewriteCond %{HTTP_REFERER} !www\.benet\.com/.*$ [NC]

設(shè)置允許訪問的HTTP來源包括網(wǎng)站自身。

RewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png [R,NC,L]

將不滿足referer條件的訪問重定向至nolink.pngnolink.png位于允許“盜鏈”的目錄about中要相當(dāng)注意不然警告信息和圖片將無法在對方網(wǎng)站上顯示。 

注意測試時要清除濟(jì)瀏覽器緩存

方法2通過判斷瀏覽器頭信息來阻止某些請求即利用SetEnvIfNoCase和access。

這個方法可以通過阻止某些機(jī)器人或蜘蛛爬蟲抓取你的網(wǎng)站來節(jié)省你的帶寬流量。

語法: SetEnvIfNoCase attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...

SetEnvIfNoCase 當(dāng)滿足某個條件時為變量賦值即根據(jù)客戶端請求屬性設(shè)置環(huán)境變量。

注Referer 指明了請求當(dāng)前資源原始資源的URL使用referer是可以防盜鏈

然后在找到自己網(wǎng)站對應(yīng)的配置的地方如在主配置文件中或虛擬主機(jī)中加入下列代碼

1
2
3
4
SetEnvIfNoCase Referer "^$" local_ref
SetEnvIfNoCase Referer "www.benet.com/.*$" local_ref
SetEnvIfNoCase Referer "benet.com/.*$" local_ref
<filesmatch "\.(mp3|mp4|zip|rar|jpg|gif)">


# 2.4版本以下的

方法一

    Order Deny,Allow

    Allow from env=local_ref

    Deny from all

方法二

    Order Allow,Deny

    Allow from env=local_ref

 

#2.4版本以上方法如下

    Require all denied

    Require env local_ref

</filesmatch>

 

三、fcgi模式編譯安裝LAMP+xcache

php的工作模式

php在lamp環(huán)境下共有三種工作模式CGI模式、apache模塊、FastCGI模式。CGI模式下運(yùn)行PHP性能不是很好。作為apache的模塊方式運(yùn)行在以前的課程中編譯安裝lamp已經(jīng)介紹過了。FastCGI的方式和apache模塊的不同點(diǎn)在于FastCGI方式PHP是一處獨(dú)立的進(jìn)程所有PHP子進(jìn)程都由PHP的一個叫作php-fpm的組件負(fù)責(zé)管理而apache模塊化方式運(yùn)行的PHP則是apache負(fù)責(zé)調(diào)用PHP完成工作。PHP的FastCGI方式性能要比apache模塊化方式強(qiáng)很多今天我們以FastCGI方式編譯安裝lamp。

FastCGI工作機(jī)制

首先客戶端發(fā)起請求請求分為2種一種是靜態(tài)請求它可以直接由Apache直接響應(yīng)返回另一種是動態(tài)的請求如其中包含中php或者Perl這種腳本解釋性語言則由Apache服務(wù)器通過fastcgi協(xié)議調(diào)用php服務(wù)器執(zhí)行并返回給Apache由Apache返回解釋執(zhí)行后的結(jié)果如果這個過程中涉及到對數(shù)據(jù)的操作此時php服務(wù)器還會還會通過mysql協(xié)議調(diào)用mysql服務(wù)器。

編譯環(huán)境及各軟件版本

Linux

Web服務(wù)器

Php

Mysql數(shù)據(jù)庫

xcache

Centos7.2

Httpd-2.4.23

php-5.4.26

Mysql5.7

xcache-3.1.0


主機(jī)規(guī)劃

至少3臺主機(jī)操作系統(tǒng)都是centos7.2.網(wǎng)段在192.168.197.0/24 網(wǎng)關(guān)192.168.197.2

分配如下

1臺httpd服務(wù)器192.168.31.83

1臺php服務(wù)器192.168.31.141

1臺mysql服務(wù)器192.168.31.225

編譯安裝LAMP

編譯安裝apache(請參考前面apache的安裝)

編譯安裝mysql(請參考mysql安裝)

FastCGI方式安裝php

1、解決依賴關(guān)系

1
[root@phpserver ~]# yum -y install libxml2-devel libcurl-devel openssl-devel bzip2-devel


安裝libmcrypt

1
2
3
[root@phpserver ~]# tar zxf libmcrypt-2.5.7.tar.gz
[root@phpserver ~]# cd libmcrypt-2.5.7/
[root@phpserver libmcrypt-2.5.7]# ./configure --prefix=/usr/local/libmcrypt && make && make install


2、編譯安裝php

1
2
3
4
5
[root@phpserver ~]# tar zxf php-5.6.27.tar.gz
[root@phpserver ~]# cd php-5.6.27/
[root@phpserver php-5.6.27]# ./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
[root@phpserver php-5.6.27]# make&& make install


相關(guān)選項(xiàng)的解釋

1
2
3
4
5
6
7
8
9
10
11
12
13
--prefix=/usr/local/php5.6//安裝位置
--with-mysql=mysqlnd //支持mysql
--with-pdo-mysql=mysqlnd//支持pdo模塊
--with-mysqli=mysqlnd//支持mysqli模塊
注上面的三選項(xiàng)的作用數(shù)據(jù)庫與php不在一個服務(wù)器上指定此種方式安裝數(shù)據(jù)庫連接驅(qū)動
--with-openssl//支持openssl模塊
--enable-fpm//支持fpm模式
--enable-sockets//啟用socket支持
--enable-sysvshm//啟用系統(tǒng)共享內(nèi)存支持
--enable-mbstring//多字節(jié)字串、像我們的中文就是多字節(jié)字串
--with-freetype-dir//支持freetype、就要裝freetype-devel、跟字體相關(guān)的、字體解析工具
--with-jpeg-dir
--with-png-dir


注上面的二選項(xiàng)的作用處理jpeg、png圖片的、php可以動態(tài)生成jpeg圖片

1
2
3
4
5
6
7
--with-zlib//是個壓縮庫、在互聯(lián)網(wǎng)傳輸時用來壓縮傳輸?shù)?/code>
--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選項(xiàng)

如果使用PHP5.3以上版本為了鏈接MySQL數(shù)據(jù)庫可以指定mysqlnd這樣在本機(jī)就不需要先安裝MySQL或MySQL開發(fā)包了。mysqlnd從php 5.3開始可用可以編譯時綁定到它而不用和具體的MySQL客戶端庫綁定形成依賴但從PHP 5.4開始它就是默認(rèn)設(shè)置了。

3、提供php配置文件

1
[root@phpserver php-5.6.27]# cp php.ini-production /etc/php.ini


4、為php-fpm提供腳本

1
2
3
4
[root@phpserver php-5.6.27]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@phpserver php-5.6.27]# chmod +x /etc/init.d/php-fpm
[root@phpserver php-5.6.27]# chkconfig --add php-fpm
[root@phpserver php-5.6.27]# chkconfig php-fpm on


5、提供php-fpm配置文件并編輯

1
2
# cp /usr/local/php5.6/etc/php-fpm.conf.default /usr/local/php5.6/etc/php-fpm.conf
[root@phpserver ~]# vi /usr/local/php5.6/etc/php-fpm.conf


修改內(nèi)容如下

1
2
3
4
5
6
pid = run/php-fpm.pid
listen = 192.168.31.141:9000
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35


啟動php-fpm服務(wù)

1
2
3
4
5
6
7
8
[root@phpserver ~]# service  php-fpm start
Starting php-fpm  done
[root@phpserver ~]# netstat -anpt | grep php-fpm
tcp        0      0 0.0.0.0:9000            0.0.0.0:*               LISTEN      25456/php-fpm: mast
[root@phpserver ~]# firewall-cmd --permanent --add-port=9000/tcp
success
[root@phpserver ~]# firewall-cmd --reload
Success


在該主機(jī)上新建虛擬主機(jī)目錄用于存放網(wǎng)頁文件

1
[root@phpserver ~]# mkdir -p /var/www/benet


至此php安裝配置完畢下面配置apache通過fastcgi協(xié)議調(diào)用php

6、配置apache(切換到apache主機(jī)上操作)

在Apache2.4以后已經(jīng)專門有一個模塊針對FastCGI的實(shí)現(xiàn)此模塊為mod_proxy_fcgi.so它其實(shí)是作為mod_proxy.so模塊的擴(kuò)充因此這兩個模塊都要加載

1
2
3
4
5
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
[root@www ~]# apachectl -M | grep proxy
proxy_module (shared)
 proxy_fcgi_module (shared)


建立一個目錄作為虛擬主機(jī)的家目錄

1
[root@www ~]# mkdir -p /var/www/benet


編輯主配置文件httpd.conf開啟虛擬主機(jī)

啟用Include conf/extra/httpd-vhosts.conf

同時定位 AddType添加下面兩行讓apache能識別php格式的頁面

1
2
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps


并且定位至DirectoryIndex支持php格式的主頁

1
DirectoryIndex index.php index.html #添加index.php最好添加在最前面


 

配置虛擬主機(jī)支持使用fcgi

[

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@www ~]# vi /usr/local/http-2.4.23/conf/extra/httpd-vhosts.conf
<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.31.141:9000/var/www/benet/$1
    #<LocationMatch "^(.*\.php(/.*)?)$">
#  ProxyPass fcgi://192.168.31.141:9000/var/www/benet
    #</LocationMatch>
<Directory "/var/www/benet">
Options  FollowSymLinks
       AllowOverride None
       Require all granted
</Directory>
</VirtualHost>


其中

ProxyRequests off #關(guān)閉正向代理

ProxyPassMatch把以.php結(jié)尾的文件請求發(fā)送到php-fpm進(jìn)程php-fpm至少需要知道運(yùn)行的目錄和URI所以這里直接在fcgi://192.168.31.141:9000后指明了這兩個參數(shù)其它的參數(shù)的傳遞已經(jīng)被mod_proxy_fcgi.so進(jìn)行了封裝不需要手動指定。

特別注意的是紅色字體部分需要與<VirtualHost >中的 DocumentRoot 后的路徑一致

ProxyPassMatch
只有滿足特定正則模式的內(nèi)容才會匹配并執(zhí)行此規(guī)則這里的模式是^/(.*\.php(/.*)?)$
從網(wǎng)站虛擬主機(jī)<VirtualHost >的根目錄開始匹配任何以 .php 結(jié)尾或者在 .php 之后緊跟一個 / 再跟別的內(nèi)容的路徑。

^ (caret) 和 $ (dollar)標(biāo)志要匹配的路徑的開始和結(jié)束

( )括號里的內(nèi)容可以用 $1 來表示以方便后面引用它。

fcgi:// 192.168.31.141:9000通過 mod_proxy_fcgi 來轉(zhuǎn)發(fā)的代理使用 fastCGI 協(xié)議轉(zhuǎn)到 PHP-FPM 監(jiān)聽的端口。

/path/to/your/documentroot/
非常重要必須與虛擬主機(jī)的路徑匹配且必須是對應(yīng) php 文件在操作系統(tǒng)中的絕對路徑。否則會找不到文件。

$1可以從原始請求擴(kuò)展成整個請求路徑的變量這里指代前面( ) 里面匹配的那個路徑uri

 

充Apache httpd 2.4以前的版本中要么把PHP作為Apache的模塊運(yùn)行要么添加一個第三方模塊支持PHP-FPM實(shí)現(xiàn)。

測試LAMP環(huán)境

在mysql主機(jī)上創(chuàng)建用于php服務(wù)器連接的mysql賬戶

mysql> grant all on *.* to testuser@'%' identified by '123456;

注意防火墻要允許mysql連接。

在php服務(wù)器上的/var/www/benet目錄下創(chuàng)建.php的測試頁

1
2
3
4
5
6
7
8
9
10
[root@phpserver ~]# cat /var/www/benet/index.php
<?php
phpinfo();
?>
[root@phpserver ~]# cat /var/www/benet/test1.php
<?php
$link=mysql_connect('192.168.31.225','testuser','123456');
if ($link)echo "connection success......";
mysql_close();
?>


測試訪問php測試頁

看到上面兩個測試頁說明apache、php、mysql之間可以協(xié)同工作了。

7、壓力測試

網(wǎng)站性能壓力測試是服務(wù)器網(wǎng)站性能調(diào)優(yōu)過程中必不可缺少的一環(huán)。只有讓服務(wù)器處在高壓情況下才能真正體現(xiàn)出軟件、硬件等各種設(shè)置不當(dāng)所暴露出的問題。

性能測試工具目前最常見的有以下幾種ab、http_load、webbench、siege。今天我們專門來介紹ab。

ab是apache自帶的壓力測試工具。ab非常實(shí)用它不僅可以對apache服務(wù)器進(jìn)行網(wǎng)站訪問壓力測試也可以對或其它類型的服務(wù)器進(jìn)行壓力測試。比如nginx、tomcat、IIS等。

下面我們開始介紹有關(guān)ab命令的使用

1ab的原理

2ab的安裝

3ab參數(shù)說明

4ab性能指標(biāo)

5ab實(shí)際使用

6測試nginx性能

1ab的原理

ab是apachebench命令的縮寫。

ab的原理ab命令會創(chuàng)建多個并發(fā)訪問線程模擬多個訪問者同時對某一URL地址進(jìn)行訪問。它的測試目標(biāo)是基于URL的因此它既可以用來測試apache的負(fù)載壓力也可以測試nginx、lighthttp、tomcat、IIS等其它Web服務(wù)器的壓力。

ab命令對發(fā)出負(fù)載的計(jì)算機(jī)要求很低它既不會占用很高CPU也不會占用很多內(nèi)存。但卻會給目標(biāo)服務(wù)器造成巨大的負(fù)載其原理類似CC攻擊。自己測試使用也需要注意否則一次上太多的負(fù)載??赡茉斐赡繕?biāo)服務(wù)器資源耗完嚴(yán)重時甚至導(dǎo)致死機(jī)。

2ab的安裝

ab的安裝非常簡單如果是源碼安裝apache的話那就更簡單了。apache安裝完畢后ab命令存放在apache安裝目錄的bin目錄下。如下

/usr/local/http2.4.23/bin/ab

如果apache 是通過yum的RPM包方式安裝的話ab命令默認(rèn)存放在/usr/bin目錄下。如下

which ab

注意如果不想安裝apache但是又想使用ab命令的話我們可以直接安裝apache的工具包httpd-tools。如下

yum -y install httpd-tools

查看ab是否安裝成功可以切換到上述目錄下使用ab –V命令進(jìn)行檢測。如下

1
2
3
4
[root@www ~]# /usr/local/http-2.4.23/bin/ab -V
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/


3ab參數(shù)說明

有關(guān)ab命令的使用我們可以通過幫助命令進(jìn)行查看。如下

[root@cent05 ~]# ab--help

下面我們對這些參數(shù)進(jìn)行相關(guān)說明。如下

-n在測試會話中所執(zhí)行的請求個數(shù)(即總請求數(shù))。

-c一次產(chǎn)生的請求個數(shù)并發(fā)用戶數(shù)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[root@www ~]# ab -c 500 -n 10000 http://192.168.31.83/index.html
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
  
Benchmarking 192.168.31.83 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
  
  
Server Software:        Apache
Server Hostname:        192.168.31.83
Server Port:            80
  
Document Path:          /index.html    #請求的資源
Document Length:        312 bytes#HTTP響應(yīng)數(shù)據(jù)的正文長度
  
Concurrency Level:      500#并發(fā)個數(shù)并發(fā)用戶數(shù)
Time taken for tests:   1.452 seconds#所有這些請求處理完成所花費(fèi)的時間 
Complete requests:      10000#完成請求數(shù)
Failed requests:        0#失敗的請求數(shù)
Non-2xx responses:      10000
Total transferred:      4760000 bytes#表示所有請求的響應(yīng)數(shù)據(jù)長度總和包括每個HTTP響應(yīng)數(shù)據(jù)的頭信息和正文數(shù)據(jù)的長度。注意這里不包括HTTP請求數(shù)據(jù)的長度僅僅為web服務(wù)器流向用戶PC的應(yīng)用層數(shù)據(jù)總長度。 
HTML transferred:       3120000 bytes# 表示所有請求的響應(yīng)數(shù)據(jù)中正文數(shù)據(jù)的總和也就是減去了Total transferred中HTTP響應(yīng)數(shù)據(jù)中的頭信息的長度。
Requests per second:    7530.93 [#/sec] (mean) #吞吐量-每秒請求數(shù)。計(jì)算公式Complete requests/Time taken for tests
Time per request:       66.393 [ms] (mean) #用戶平均請求等待時間計(jì)算公式Time token
for tests/Complete requests/Concurrency Level。
Time per request:       0.133 [ms] (mean, across all concurrent requests)#服務(wù)器平均請求等待時間計(jì)算公式Time taken for tests/Complete requests。
Transfer rate:          3500.71 [Kbytes/sec] received#表示這些請求在單位時間內(nèi)從服務(wù)器獲取的數(shù)據(jù)長度計(jì)算公式Total trnasferred/ Time taken for tests這個統(tǒng)計(jì)很好的說明服務(wù)器的處理能力達(dá)到極限時其出口寬帶的需求量。即平均每秒網(wǎng)絡(luò)上的流量
  
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:       10   27   7.3     27      48
Processing:     4   37  36.5     32     439
Waiting:        2   27  37.0     21     435
Total:         30   64  37.6     60     470
  
Percentage of the requests served within a certain time (ms)
  50%     60
  66%     63
  75%     64
  80%     66
  90%     71
  95%     76
  98%     89
  99%    261
 100%    470 (longest request)
這部分?jǐn)?shù)據(jù)用于描述每個請求處理時間的分布情況比如以上測試80%的請求處理時間都不超過66ms這個處理時間是指前面的Time per request即對于單個用戶而言平均每個請求的處理時間。


繼續(xù)壓力測試
我們再來進(jìn)行一次壓力測試此時并發(fā)用戶數(shù)為1000其他條件不變查看兩次測試結(jié)果的吞吐量差別

4ab性能指標(biāo)

在進(jìn)行性能測試過程中有幾個指標(biāo)比較重要

1、吞吐率Requests per second

服務(wù)器并發(fā)處理能力的量化描述單位是reqs/s指的是在某個并發(fā)用戶數(shù)下單位時間內(nèi)處理的請求數(shù)。某個并發(fā)用戶數(shù)下單位時間內(nèi)能處理的最大請求數(shù)稱之為最大吞吐率。

記住吞吐率是基于并發(fā)用戶數(shù)的。這句話代表了兩個含義

a、吞吐率和并發(fā)用戶數(shù)相關(guān)

b、不同的并發(fā)用戶數(shù)下吞吐率一般是不同的

計(jì)算公式總請求數(shù)/處理完成這些請求數(shù)所花費(fèi)的時間即

Request per second=Complete requests/Time taken for tests

必須要說明的是這個數(shù)值表示當(dāng)前機(jī)器的整體性能值越大越好。

2、并發(fā)連接數(shù)The number of concurrent connections

并發(fā)連接數(shù)指的是某個時刻服務(wù)器所接受的請求數(shù)目簡單的講就是一個會話。

3、并發(fā)用戶數(shù)Concurrency Level

要注意區(qū)分這個概念和并發(fā)連接數(shù)之間的區(qū)別一個用戶可能同時會產(chǎn)生多個會話也即連接數(shù)。

4、用戶平均請求等待時間Time per request

計(jì)算公式處理完成所有請求數(shù)所花費(fèi)的時間/總請求數(shù)/并發(fā)用戶數(shù)即

Time per request=Time taken for tests/Complete requests/Concurrency Level

5、服務(wù)器平均請求等待時間Time per request:across all concurrent requests

計(jì)算公式處理完成所有請求數(shù)所花費(fèi)的時間/總請求數(shù)即

Time taken for/testsComplete requests

可以看到它是吞吐率的倒數(shù)。

同時它也等于用戶平均請求等待時間/并發(fā)用戶數(shù)即

Time per request/Concurrency Level

 

8、CentOS7.2下安裝php加速軟件Xcache在php主機(jī)上完成下面的操作

說明

php安裝目錄/usr/local/php5.6

php.ini配置文件路徑/etc/php.ini

php網(wǎng)頁根目錄/var/www/benet

1安裝xcache

1
2
3
4
5
6
7
8
9
10
wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz #下載
[root@phpserver ~]# tar zxf xcache-3.2.0.tar.gz #解壓
[root@phpserver ~]# cd xcache-3.2.0/ #進(jìn)入安裝目錄
[root@phpserver xcache-3.2.0]# /usr/local/php5.6/bin/phpize#用phpize生成configure配置文件
[root@phpserver xcache-3.2.0]# ./configure --enable-xcache --enable-xcache-coverager --enable-xcache-optimizer --with-php-config=/usr/local/php5.6/bin/php-config  #配置
[root@phpserver xcache-3.2.0]# make && make install  #編譯、安裝
  
Installing shared extensions:     /usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/
安裝完成之后出現(xiàn)下面的界面記住以下路徑后面會用到
/usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/


2創(chuàng)建xcache緩存文件

1
2
# touch /tmp/xcache
# chmod 777 /tmp/xcache


3拷貝xcache后臺管理程序到網(wǎng)站根目錄

1
[root@phpserver xcache-3.2.0]# cp -r htdocs/ /var/www/benet/xcache


4配置php支持xcache

vi / etc/php.ini #編輯配置文件在最后一行添加以下內(nèi)容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[xcache-common]
extension = /usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/xcache.so
[xcache.admin]
xcache.admin.enable_auth = Off
[xcache]
xcache.shm_scheme ="mmap"
xcache.size=60M
xcache.count =1
xcache.slots =8K
xcache.ttl=0
xcache.gc_interval =0
xcache.var_size=64M
xcache.var_count =1
xcache.var_slots =8K
xcache.var_ttl=0
xcache.var_maxttl=0
xcache.var_gc_interval =300
xcache.test =Off
xcache.readonly_protection = Off
xcache.mmap_path ="/tmp/xcache"
xcache.coredump_directory =""
xcache.cacher =On
xcache.stat=On
xcache.optimizer =Off
[xcache.coverager]
xcache.coverager =On
xcache.coveragedump_directory =""


將xcache目錄拷貝到apache主機(jī)的網(wǎng)頁文檔目錄下

1
[root@phpserver ~]# scp -r /var/www/benet/xcache/ root@192.168.31.83:/var/www/benet/


6測試

service php-fpm restart #重啟php-fpm

瀏覽器打開網(wǎng)站根目錄下面的xcache

http://http://192.168.31.83/xcache可以看到如下頁面

至此Linux下安裝php加速軟件Xcache教程完成

執(zhí)行ab壓力測試

執(zhí)行第一次壓力測試

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[root@www ~]# ab -c 100 -n 1000 http://192.168.31.83/index.php
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
  
Benchmarking 192.168.31.83 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
  
  
Server Software:        Apache
Server Hostname:        192.168.31.83
Server Port:            80
  
Document Path:          /index.php
Document Length:        85006 bytes
  
Concurrency Level:      100
Time taken for tests:   1.773 seconds
Complete requests:      1000
Failed requests:        368
   (Connect: 0, Receive: 0, Length: 368, Exceptions: 0)
Total transferred:      85259504 bytes
HTML transferred:       85013504 bytes
Requests per second:    563.88 [#/sec] (mean)
Time per request:       177.344 [ms] (mean)
Time per request:       1.773 [ms] (mean, across all concurrent requests)
Transfer rate:          46948.95 [Kbytes/sec] received
  
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0    1   2.7      0      16
Processing:    31  167  73.7    140     406
Waiting:       23  162  73.1    136     401
Total:         40  168  73.0    141     406
  
Percentage of the requests served within a certain time (ms)
  50%    141
  66%    152
  75%    176
  80%    188
  90%    294
  95%    389
  98%    396
  99%    400
 100%    406 (longest request)


執(zhí)行第二次壓力測試

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[root@www ~]# ab -c 100 -n 1000 http://192.168.31.83/index.php
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
  
Benchmarking 192.168.31.83 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
  
  
Server Software:        Apache
Server Hostname:        192.168.31.83
Server Port:            80
  
Document Path:          /index.php
Document Length:        85006 bytes
  
Concurrency Level:      100
Time taken for tests:   1.264 seconds
Complete requests:      1000
Failed requests:        316
   (Connect: 0, Receive: 0, Length: 316, Exceptions: 0)
Total transferred:      85257983 bytes
HTML transferred:       85011983 bytes
Requests per second:    790.93 [#/sec] (mean)
Time per request:       126.434 [ms] (mean)
Time per request:       1.264 [ms] (mean, across all concurrent requests)
Transfer rate:          65852.24 [Kbytes/sec] received
  
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0    1   2.7      0      11
Processing:    33  120  20.6    120     180
Waiting:       28  115  20.0    115     179
Total:         44  121  19.2    121     180
  
Percentage of the requests served within a certain time (ms)
  50%    121
  66%    124
  75%    127
  80%    128
  90%    147
  95%    159
  98%    166
  99%    169
 100%    180 (longest request)


查看xcache的命中率

9、部署bbs論壇

Discuz的程序文件解壓并且將upload中所有文件放置到網(wǎng)站目錄(php服務(wù)器的操作)

#unzip Discuz_7.0.0_FULL_SC_UTF8.zip  -d  discus

# mv discuz/upload/ /var/www/benet/bbs

設(shè)置php-fpm的服務(wù)用戶為下面文件的屬主或者對其設(shè)置寫權(quán)限否則安裝時會報錯

#cd  /var/www/benet/bbs

#chown -R nobody config.inc.php attachments/ forumdata/ uc_client/data/cache/ templates/

#chmod -R 777 uc_server/data/

修改php.ini文件

short_open_tag = On

# service php-fpm restart

web服務(wù)器也需要有靜態(tài)文件(apache服務(wù)器上操作)

#unzip Discuz_7.0.0_FULL_SC_UTF8.zip  -d  discus

# mv Discuz/upload/ /var/www/benet/bbs

設(shè)置httpd的服務(wù)用戶對指定文件也需要有寫權(quán)限

#cd  /var/www/benet/bbs

#chown -R daemon config.inc.php attachments/ forumdata/ uc_client/data/cache/ templates/

在數(shù)據(jù)庫服務(wù)器上創(chuàng)建bbs數(shù)據(jù)庫及授權(quán)帳戶

mysql> create database bbsdb;

Query OK, 1 row affected (0.01 sec)

mysql> grant all on bbsdb.* to runbbs@'%' identified by 'pwd@123';

Query OK, 0 rows affected, 1 warning (0.03 sec)

 

置完成之后輸入httd//192.168.31.83/bbs/install即可安裝

填寫數(shù)據(jù)庫的相關(guān)信息添加數(shù)據(jù)庫服務(wù)器的地址和MariaDB創(chuàng)建的數(shù)據(jù)庫和用戶密碼而后在設(shè)置bbs的管理員帳號密碼就可以繼續(xù)安裝了。

剩下的根據(jù)提示安裝即可。

出現(xiàn)上面這種情況是由于php服務(wù)器安裝了discuz之后導(dǎo)致程序發(fā)生變化從而導(dǎo)致動態(tài)服務(wù)器和靜態(tài)服務(wù)器的程序不一致只需要手動把bbs服務(wù)器的文件和web服務(wù)器進(jìn)行一次同步即可如果想實(shí)現(xiàn)自動同步需要使用其他服務(wù)如initory+rsync、sersync等工具。

#scp -r /var/www/benet/bbs/* root@192.168.31.83:/var/www/benet/bbs/

動態(tài)服務(wù)器和靜態(tài)服務(wù)器同步文件之后再次訪問bbs的網(wǎng)址就正常了。

 


本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號