Apache優化

新增模塊;
mod_proxy_fcgi(可提供fcgi代理)
mod_ratelimit(限制用戶帶寬)
mod_request(請求模塊,對請求做過濾)
mod_remoteip(匹配客戶端的IP地址)
對於基於IP的訪問控制做了修改,不再支持allow,deny,order機制,而是統一使用require進行


1、MPM支持在運行時裝載;不過要開啓這種特性,在編譯安裝要啓用這三種功能;--enable-mpms-shared=all  --with-mpm=event

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

在編譯安裝時需要配置./configure;

相關參數解釋:

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

--enable-rewrite:支持url重寫

--enable-ssl:支持ssl

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

--enable-cgi:啓用cgi

--enable-cgid:MPM使用的是eventworker要啓用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所有支持的模式,這樣eventworkerprefork就會以模塊化的方式安裝,要用哪個就在 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:”頭內容,即對網站圖片、jscss等內容,提供客戶端瀏覽器緩存的設置。這個是apache調優的一個重要選項之一。

--enable-deflate:提供對內容的壓縮傳輸編碼支持,一般是htmljscss等內容的站點。使用此參數會打打提高傳輸速度,提升訪問者訪問的體驗。在生產環境中,這是apache調優的一個重要選項之一。

以上是安裝前的優化;

那麼接下來說安裝後的優化

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

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

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

 

1apache的工作模式:

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

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

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

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

Apacheprefork工作模式下影響性能的重要參數說明

# prefork MPM

<IfModule mpm_prefork_module>

StartServers             5

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

MinSpareServers          5

#最小的閒置進程數

MaxSpareServers         10

#最大的閒置進程數

MaxRequestWorkers      250

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

MaxConnectionsPerChild   500

#設置的是每個子進程可處理的請求數。每個子進程在處理了“MaxConnectionsPerChild”個請求後將自動銷燬。0意味着無限,即子進程永不銷燬。雖然缺省設爲0可以使每個子進程處理更多的請求,但如果設成非零值也有兩點重要的好處:1、可防止意外的內存泄漏。2、在服務器負載下降的時侯會自動減少子進程數。因此,可根據服務器的負載來調整這個值。在Apache2.3.9之前稱之爲MaxRequestsPerChild

</IfModule>

2apache配置參數

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

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

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

4HostnameLookups on|off|double
如果是使用on,那麼只有進行一次反查,如果用double,那麼進行反查之後還要進行一次正向解析,只有兩次的結果互相符合才行,而off就是不進行域名驗證。
如果爲了安全,建議使用double;爲了加快訪問速度,建議使用off

域名查找開啓這個會增加apache的負擔, 減慢訪問速度建議關閉

5timeout 5

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

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

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

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

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

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

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

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

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

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

3開啓apacheGzipdeflate功能

gzip可以極大的加速網站,有時壓縮比率高到80%,最少都有40%以上,還是相當不錯的。在Apache2之後的版本,模塊名不叫gzip,而叫mod_deflate

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

LoadModule deflate_module modules/mod_deflate.so

LoadModule headers_module modules/mod_headers.so

a.編譯時安裝方法

 編譯的時候跟上--enable-deflate即可實現安裝
b.DSO方式安裝
[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

配置mod_expires模塊

這個非常有用的優化,mod_expires可以減少20-30%左右的重複請求,讓重複的用戶對指定的頁面請求結果都CACHE在本地,根本不向服務器發出請求。但要注意更新快的文件不要這麼做。

啓用expire緩存:

mod_expires的安裝配置:

啓用expires_module

LoadModule expires_module modules/mod_expires.so

然後添加Expires配置規則

<IfModule mod_expires.c>

ExpiresActive On

ExpiresByType text/css "now plus 1 month"

ExpiresByType application/x-javascript "now plus 5 day"

ExpiresByType p_w_picpath/jpeg "access plus 1 month"

ExpiresByType p_w_picpath/gif "access plus 1 month"

ExpiresByType p_w_picpath/bmp "access plus 1 month"

ExpiresByType p_w_picpath/x-icon "access plus 1 month"

ExpiresByType p_w_picpath/png "access plus 1 minutes"

ExpiresByType application/x-shockwave-flash "access plus 1 month"

ExpiresDefault "now plus 0 minutes"

</IfModule> 

4Apache禁止目錄遍歷

Options Indexes FollowSymLinks中的Indexes 去掉,就可以禁止 Apache 顯示該目錄結構。Indexes 的作用就是當該目錄下沒有 index.html文件時,就顯示目錄結構。

5apache 隱藏版本信息

測試默認 apache 的狀態信息

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

Include conf/extra/httpd-default.conf

2修改httpd-default.conf

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

找到

ServerTokens Full

ServerSignature On

改成

ServerTokens Prod

ServerSignature off

重啓 apache 測試

6Apache日誌切割

爲什麼要分割日誌
隨着網站的訪問越來越大,WebServer產生的日誌文件也會越來越大,如果不對日誌進行分割,那麼只能一次將大的日誌(Apache的日誌)整個刪除,這樣也丟失了很多對網站比較寶貴的信息,因爲這些日誌可以用來進行訪問分析、網絡安全監察、網絡運行狀況監控等,因此管理好這些海量的日誌對網站的意義是很大的。 

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

Apache的主配置文件,更改內容如下:
註釋掉如下兩行
ErrorLog logs/error_log

CustomLog logs/access_log common
然後添加如下兩行

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

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

安裝cronolog程序

下載cronolog  
[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

 

主配置文件中的使用方法

ErrorLog "|/usr/local/sbin/cronolog logs/error-%Y%m%d.log"

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

如果Apache中有多個虛擬主機,最好每個虛擬主機中放置一個這樣的代碼,並將日誌文件名改成不同的名字。

擴展:

這個保證了每天一個文件夾文件夾下每個小時產生一個log

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

 

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


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

 

7配置防盜鏈

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

舉個例子:比如discuz論壇,裏面有些熱點圖片視頻;然後別人將他網站上訪問圖片的地址重定向到discuz上,這樣他的服務器就可以空閒出來了;也就是說別人訪問他網站的圖片視頻,消耗的確是你服務器的資源;

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

方法1Apache 防盜鏈的第一種實現方法,可以用rewrite實現。

首先要確認 Apache rewrite module可用:

[root@www ~]# apachectl -M | grep rewrite

rewrite_module (shared)

打開 httpd.conf,確保有這麼一行配置:

LoadModule rewrite_module modules/mod_rewrite.so

然後在找到自己網站對應的配置的地方(如在主配置文件中或虛擬主機中),加入下列代碼:

ServerName  www.***.com




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