新增模塊;
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使用的是event或worker要啓用cgid
--enable-modules=most:明確指明要靜態編譯到httpd二進制文件的模塊,<MODULE-LIST>爲空格分隔的模塊名列表、all或者most,all表示包含所有模塊,most表示包含大部分常用模塊
--enable-mods-shared=most:明確指明要以DSO方式編譯的模塊,<MODULE-LIST>爲空格分隔的模塊名列表、all或者most,all表示包含所有模 塊,most表示包含大部分模塊
--enable-mpms-shared=all:啓用MPM所有支持的模式,這樣event、worker、prefork就會以模塊化的方式安裝,要用哪個就在 httpd.conf 裏配置就好了。
--with-mpm=event:指定啓用的mpm模式,默認使用enevt模式,在apache的早期版本2.0默認prefork,2.2版本是worker,2.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調優的一個重要選項之一。
以上是安裝前的優化;
那麼接下來說安裝後的優化:
pache所運行的硬件環境都是對性能影響最大的因素,即使不能對硬件進行升級,也最好給apache一個單獨的主機以免受到其他應用的干擾。各個硬件指標中,對性能影響最大的是內存,對於靜態內容(圖片、javascript文件、css文件等),它決定了apache可以緩存多少內容,它緩存的內容越多,在硬盤上讀取內容的機會就越少,大內存可以極大提高靜態站點的速度;對動態高負載站點來說,每個請求保存的時間更多一些,apache的mpm模塊會爲每個請求派生出相應的進程或線程分別處理,而進程或線程的數量與內存的消耗近似成正比,因此增大內存對提高動態站點的負載和運行速度也極爲有利
其次是硬盤的速度,靜態站點尤爲突出,apache不斷的在讀取文件併發送給相應的請求,硬盤的讀寫是極其頻繁的;動態站點也要不斷的加載web程序(php等),一個請求甚至要讀取十幾個文件才能處理完成,因此儘可能的提高硬盤速度和質量對提高apache的性能是有積極意義的。
最後是cpu和網絡,cpu影響的是web程序執行速度,網絡影響流量大小。
1、apache的工作模式:
Apache HTTP服務器被設計爲一個強大的、靈活的能夠在多種平臺以及不同環境下工作的服務器。這種模塊化的設計就叫做“多進程處理模塊”(Multi-Processing Module,MPM),也叫做工作模式。
Prefork模式(一個非線程型的):
其主要工作方式是:當Apache服務器啓動後,mpm_prefork模塊會預先創建多個子進程(默認爲5個),每個子進程只有一個線程,當接收到客戶端的請求後,mpm_prefork模塊再將請求轉交給子進程處理,並且每個子進程同時只能用於處理單個請求。如果當前的請求數將超過預先創建的子進程數時,mpm_prefork模塊就會創建新的子進程來處理額外的請求。Apache總是試圖保持一些備用的或者是空閒的子進程用於迎接即將到來的請求。這樣客戶端的請求就不需要在接收後等候子進程的產生。
由於在mpm_prefork模塊中,每個請求對應一個子進程,因此其佔用的系統資源相對其他兩種模塊而言較多。不過mpm_prefork模塊的優點在於它的每個子進程都會獨立處理對應的單個請求,這樣,如果其中一個請求出現問題就不會影響到其他請求。Prefork在效率上要比Worker要高,但是內存使用大得多不擅長處理高併發的場景。
Apache在prefork工作模式下影響性能的重要參數說明
# 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>
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
如果要開啓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>
4、Apache禁止目錄遍歷
將Options Indexes FollowSymLinks中的Indexes 去掉,就可以禁止 Apache 顯示該目錄結構。Indexes 的作用就是當該目錄下沒有 index.html文件時,就顯示目錄結構。
5、apache 隱藏版本信息
測試默認 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 測試
6、Apache日誌切割
爲什麼要分割日誌
隨着網站的訪問越來越大,WebServer產生的日誌文件也會越來越大,如果不對日誌進行分割,那麼只能一次將大的日誌(如Apache的日誌)整個刪除,這樣也丟失了很多對網站比較寶貴的信息,因爲這些日誌可以用來進行訪問分析、網絡安全監察、網絡運行狀況監控等,因此管理好這些海量的日誌對網站的意義是很大的。
方法1:使用rotatelogs(apache自帶的工具)每隔一天記錄一個日誌
輯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上,這樣他的服務器就可以空閒出來了;也就是說別人訪問他網站的圖片視頻,消耗的確是你服務器的資源;
解決這個問題的方法是配置下防盜鏈,讓外來的盜不了鏈;
方法1:Apache 防盜鏈的第一種實現方法,可以用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