關於Apache的優化分爲如下幾個步驟:html
- Apache的Gzip(deflate)功能;
- Apache的緩存設置;
- Apache禁止目錄遍歷;
- Apache隱藏版本目錄;
- Apache日誌分割;
- Apache配置防盜鏈;
gzip能夠極大的加速網站,使用gzip功能有時壓縮比率高到80%以上,最少都有40%以上,因此說gzip功能是很是強大的,仍是不錯的。apache
在Apache2以後的版本,模塊名不叫gzip,而叫mod_deflatevim
未使用gzip時,網頁中傳輸文件的過程,如圖:瀏覽器
使用gzip時,網頁中傳輸文件的過程,如圖:緩存
本次博文案例環境,能夠參考博文:Apache的安裝部署及工做模式詳解安全
若是要使用gzip(deflate)的功能,必定要打開兩個模塊:服務器
LoadModule deflate_module modules/mod_deflate.so //模塊的做用:對傳輸到客戶端的代碼進行gzip壓縮 LoadModule headers_module modules/mod_headers.so //模塊的做用:告訴客戶端的瀏覽器,傳輸的文件使用了gzip壓縮。若是不開啓的話,則沒法正常顯示網頁內容
[root@localhost ~]# apachectl -M | grep deflate //檢查mod_deflate模塊是否安裝,若是沒有任何返回信息則表示沒有安裝
安裝方法有兩種:ide
- 編譯時添加「--enable-deflate」選項便可安裝;
- 使用DSO方式進行安裝;
自己Apache已經安裝完成,因此這裏就是用DSO方式進行安裝了工具
[root@localhost ~]# cd /usr/src/httpd-2.4.23/modules/filters/ //切換到Apache源碼包mod_deflate所在的目錄下 [root@localhost filters]# /usr/local/http-2.4.23/bin/apxs -c -i -a mod_deflate.c //使用apxs命令進行安裝
apxs命令參數的解釋:測試
- -i:表示須要執行安裝操做,以安裝一個或多個動態共享對象到服務器的modules目錄中;
- -a:表示會自動增長一個 LoadModule 行到 httpd.conf 文件中,以啓用此模塊,或者,若是 此行已經存在,則啓用之;
- -c:表示須要執行編譯操做。
在安裝過程當中會出現這樣的錯誤信息,如圖:
這樣的錯誤信息即表示缺乏zlib-devel的安裝包,使用「yum -y install zlib-devel」便可,再次從新安裝mod_deflate模塊!
[root@localhost filters]# ll /usr/local/http-2.4.23/modules/mod_deflate.so -rwxr-xr-x. 1 root root 98160 11月 22 18:53 /usr/local/http-2.4.23/modules/mod_deflate.so //確認文件已經存在
檢查Apache主配置文件出現如下狀況:
[root@localhost ~]# apachectl -t httpd: Syntax error on line 104 of /usr/local/http-2.4.23/conf/httpd.conf: Cannot load modules/mod_deflate.so into server: /usr/local/http-2.4.23/modules/mod_deflate.so: undefined symbol: inflate
解決方法:
須要在Apache主配置文件的 LoadModule deflate_module modules/mod_deflate.so 這行的上一行添加LoadFile /usr/local/zlib/lib/libz.so
便可,如圖:
[root@localhost ~]# apachectl -t Syntax OK //檢查其配置文件沒有錯誤 [root@localhost ~]# apachectl restart //從新啓動Apache服務
接下來修改Apache主配置文件,使其開啓gzip壓縮傳輸功能:
LoadModule deflate_module modules/mod_deflate.so //這個模塊的做用:對傳輸到客戶端的代碼進行gzip壓縮 LoadModule headers_module modules/mod_headers.so //這個模塊的做用:告訴客戶端的瀏覽器,傳輸的文件使用了gzip壓縮。若是不開啓的話,則沒法正常顯示網頁內容 //查看Apache主配置文件必須保證這兩個模塊已經被啓用
在Apache主配置文件中(我的建議在末尾)添加以下內容:
<IfModule mod_deflate.c> //表示須要啓用mod_deflate模塊 DeflateCompressionLevel 9 //壓縮程度的等級 SetOutputFilter DEFLATE //設置輸出過濾器,對輸出啓用壓縮功能 AddOutputFilterByType DEFLATE text/* //設置對文件是文本格式的進行壓縮 SetEnvIfNoCase Reques t_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary //設置不對後綴爲 gif,jpg,jpeg,png 的圖片文件進行壓縮。?:表示不會捕獲 ( )裏內容了 </IfModule> //如下內容是設置日誌輸出 DeflateFilterNote Input input_info //聲明輸入流的 byte 數量 DeflateFilterNote Output output_info //聲明輸出流的 byte 數量 DeflateFilterNote Ratio ratio_info //聲明壓縮的百分比 LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate //聲明日誌格式 CustomLog logs/deflate_log.log deflate //指定日誌的存放路徑
考慮到粘貼複製的問題,這裏附上Apache文件中添加的內容(不帶註釋)
<IfModule mod_deflate.c> DeflateCompressionLevel 9 SetOutputFilter DEFLATE AddOutputFilterByType DEFLATE text/* SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary </IfModule> DeflateFilterNote Input input_info DeflateFilterNote Output output_info DeflateFilterNote Ratio ratio_info LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate CustomLog logs/deflate_log.log deflate
修改完成以後,從新啓用Apache服務,並使用瀏覽器進行測試(使用F12開啓開發者模式,並使用F5進行刷新),如圖:
[root@localhost ~]# cat /usr/local/http-2.4.23/logs/deflate_log.log //查看deflate的日誌(日誌路徑在配置文件中已經定義) "GET / HTTP/1.1" -/- (-%) "GET /favicon.ico HTTP/1.1" -/- (-%) "GET / HTTP/1.1" -/- (-%) "GET / HTTP/1.1" 76/4725 (1%) "GET / HTTP/1.1" 76/4725 (1%) //能夠看出壓縮比例達到了99% "-" -/- (-%)
注意:圖片是不須要被壓縮的,flash的swf文件也是不用壓縮的(這兩個東西壓縮以後會出現意想不到的效果)
Apache的緩存設置主要依賴於 mod_expires 模塊 ,啓用模塊後,能夠減小20%~30%左右的重複請求,讓重複的用戶請求結果都緩存在本地。注意更新快的文件不要這麼作。
mod_expires模塊控制服務器應答時的 Expires 頭內容和 Cache-Control 頭的 max-age 指令。有效期 (expiration date)能夠設置爲相對於源文件的最後修改時刻或者客戶端的訪問時刻。
未啓用 mod_expires模塊expire緩存的效果:
啓用mod_expires模塊expire緩存,方法以下:
LoadModule expires_module modules/mod_expires.so //查看Apache的主配置文件,必要要保證這個模塊被啓用
而後在Apache主配置文件末尾添加如下內容:
<IfModule mod_expires.c> //表示啓用expires模塊 ExpiresActive On //啓用expires功能 ExpiresByType text/html "access plus 2 minute" //設置後綴爲html的文本文件保存時間爲兩分鐘 ExpiresByType image/jpeg "access plus 1 mouth" //設置後綴爲jpeg的圖片信息保存時間爲一個月 ExpiresDefault "now plus 0 minute" //其餘默認沒有被定義的不進行緩存 </IfModule>
不帶註釋的配置文件:
<IfModule mod_expires.c> ExpiresActive On ExpiresByType text/html "access plus 2 minute" ExpiresByType image/jpeg "access plus 1 mouth" ExpiresDefault "now plus 0 minute" </IfModule>
測試效果以下:
緩存機制的配置格式:
ExpiresByType type/encoding "<base> [plus] {<num><type>}" ExpiresDefault "<base> [plus] {<num><type>}"
一、其中<base>是下列之一:
access(相對於客戶端訪問的時間)
now(至關於access)
modification(相對於最後一次修改源文件後的緩存時間)
二、該plus關鍵字是可選的。num 應該是整數值,而且type是如下之一:
years
months
weeks
days
hours
minutes
seconds
也可使用如下格式來定義緩存機制:
ExpiresByType image/jpeg A2592000 //表示圖片的緩存是1個月 ExpiresByType text/html M604800 //表示HTML文檔的有效期是最後修改時刻後的一星期 //"M"表示源文件的最後修改時刻,"A"表示客戶端對源文件的訪問時刻。後面的時間則以秒計 算。
具體介紹能夠參考官方文檔
訪問Apache時,默認訪問的時Apache網頁根目錄下的index.html,如何這個文件不存在的話,就會出現如下狀況:
爲了防止出現以上狀況須要修改Apache的配置文件:
從新啓動服務以後,就會出現這種狀況:
不進行修改,默認的版本信息:
這樣輕易的出如今互聯網上,顯然是不安全的。能夠經過如下操做進行優化處理,方法以下:
在Apache主配置文件中啓用 httpd-default.conf Include conf/extra/httpd-default.conf //去除以前的#號 [root@localhost ~]# vim /usr/local/http-2.4.23/conf/extra/httpd-default.conf //找到 ServerTokens Full ServerSignature On //修改成如下內容 ServerTokens Prod ServerSignature Off
從新啓動服務以後,再次進行查看:
若是須要完全的改變版本之類的信息,那麼須要在編譯以前,修改源碼包下 include 目錄下的 ap_release.h 。
[root@localhost ~]# vim /usr/src/httpd-2.4.23/include/ap_release.h //這是本人的解壓路徑,各位根據實際狀況 //修改的內容以下: #define AP_SERVER_BASEVENDOR "Apache Software Foundation" //服務的供應商名稱 #define AP_SERVER_BASEPROJECT "Apache HTTP Server" //服務的項目名稱 #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 //上述行無需將行首的「#」號刪除
根據註釋修改爲本身想要的,編譯安裝便可!
隨着網站的訪問量愈來愈大,產生的日誌文件也就會愈來愈大,若是不對日誌進行分隔處理,日誌文件會越存越大,不易備份,並且只能一次性將Apache的日誌所有刪除,這樣就會丟失不少對網站寶貴的信息,所以管理好這些海量的日誌對網站來講十分重要。
對日誌進行分隔處理能夠經過如下兩種方法:
修改Apache的主配置文件,更改內容以下: //找到如下兩行,進行註釋: ErrorLog logs/error_log CustomLog logs/access_log common //而後最好在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 //這裏是要填寫rotatelogs工具的絕對路徑
在上面添加的內容中,86400爲輪轉的時間,單位是秒(也就是一天生成一個日誌文件)。
[root@localhost ~]# systemctl restart httpd //重啓Apache服務 [root@localhost ~]# ls /usr/local/http-2.4.23/logs/ access_2019-11-23.log access_log error_2019-11-23.log error_log httpd.pid //查看日誌文件,第一次可能只會出現錯誤日誌,訪問一下,訪問日誌便可產生
這樣就已經實現了日誌按天進行分割存放!
因爲 apache 自帶的日誌輪詢工具 rotatelogs,聽說在進行日誌切割時容易丟日誌,所以咱們一般使用 cronolog (也就是方法2)進行日誌輪詢。
一樣也是在Apache的主配置文件中註釋掉如下兩行: ErrorLog "logs/error_log" CustomLog "logs/access_log" common
[root@localhost ~]# tar zxf cronolog-1.6.2.tar.gz -C /usr/src [root@localhost ~]# cd /usr/src/cronolog-1.6.2/ [root@localhost cronolog-1.6.2]# ./configure && make && make install //解壓以後進行編譯安裝 [root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf //編輯Apache的主配置文件 //將方法1中寫入的日誌切割配置項刪除,寫入下面的兩行配置 CustomLog "|/usr/local/sbin/cronolog logs/access-%Y-%m-%d.log" combined ErrorLog "|/usr/local/sbin/cronolog logs/error-%Y-%m-%d.log" //一樣這裏寫的也是cronolog工具的絕對路徑 爲了更好的進行測試,建議將本來的日誌文件進行刪除、移動操做 [root@localhost ~]# rm -rf /usr/local/http-2.4.23/logs/*log [root@localhost ~]# ls /usr/local/http-2.4.23/logs/ httpd.pid [root@localhost ~]# ls /usr/local/http-2.4.23/logs/ access-2019-11-23.log error-2019-11-23.log httpd.pid //測試訪問一下,訪問日誌和錯誤日誌便可產生
這樣就已經實現了日誌按天進行分割存放!
若是 Apache 中有多個虛擬主機,最好每一個虛擬主機中放置一個這樣的代碼,並將日誌文件名改爲不一樣的名字。
若是網站的訪問實在太大,也能夠進行按小時分隔,方法以下:
基於第二種方法實現:
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf //將本來的兩行配置內容修改以下: CustomLog "|/usr/local/sbin/cronolog logs/access-%Y-%m-%d.log.%H" combined ErrorLog "|/usr/local/sbin/cronolog logs/error-%Y-%m-%d.log.%H" //就是在本來的配置上添加了「%H」表示按小時進行分隔 [root@localhost ~]# systemctl restart httpd //重啓Apache服務
自行進行測試訪問,接下來查看日誌文件,如圖:
生產環境下,經常使用方法:
按天輪詢: 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
注意: 這兩個管道日誌文件程序還有一點不一樣之處是使用 cronolog 時若是日誌是放在某個不存 在的路徑則會自動建立目錄,而使用 rotatelogs 時不能自動建立,這一點要特別注意 !
有時候會忽然發現網站的訪問量愈來愈,千萬不要高興的太早,頗有多是被別人盜鏈了。打個比方說:你本身搭建了一個視頻網站,而後別人將他網站上的視頻的地址重定向到你的服務器上。這樣你的網站訪問量就會愈來愈大,消耗的資源也就愈來愈多!如何避免這種可能的發生,那麼就須要使用防盜鏈。
首先要確認Apache的rewrite module模塊已經安裝,可用: [root@localhost ~]# apachectl -M | grep rewrite rewrite_module (shared)
接下來編寫Apache的主配置文件
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf LoadModule rewrite_module modules/mod_rewrite.so //找到這一行,默認是註釋的,將#號刪除便可 …………………… <Directory "/usr/local/http-2.4.23/htdocs"> //如下內容必須寫在網站的根目錄下 RewriteEngine On RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://192.168.1.1/.*$ [NC] RewriteRule .*\.(gif|jpg|swf)$ http://192.168.1.1/about/error.png [R,NC,L] </Directory>
添加的內容相關解釋:
- RewriteEngine On //啓用rewrite(地址重定向)功能,必須填寫;
- RewriteCond %{HTTP_REFERER} !^$ //容許用戶在瀏覽器直接測試訪問
- RewriteCond %{HTTP_REFERER} !^http://192.168.1.1/.*$ [NC] //容許經過192.168.1.1的地址進行訪問
- RewriteRule .*.(gif|jpg|swf)$ http://192.168.1.1/about/error.png [R,NC,L] //將不知足以上策略的、後綴名爲gif、jpg、swf的文件所有重定向到網頁根目錄的about目錄中的error.png,要至關注意,about目錄下的error.png文件存在,否則,警告信息和圖片將沒法在對方網站上顯示。
詳細介紹如圖:
注意:測試時要清除瀏覽器緩存
下面進行測試:
實驗環境有192.168.1.1(A)網站服務器和192.168.1.2(B)網站服務器,配置以下:
A服務器:
[root@localhost ~]# apachectl -M | grep rewrite rewrite_module (shared) [root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf LoadModule rewrite_module modules/mod_rewrite.so //找到這一行,默認是註釋的,將#號刪除便可 …………………… <Directory "/usr/local/http-2.4.23/htdocs"> //如下內容必須寫在網站的根目錄下 RewriteEngine On RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://192.168.1.1/.*$ [NC] RewriteRule .*\.(gif|jpg|swf)$ http://192.168.1.1/about/error.png [R,NC,L] </Directory> [root@localhost ~]# ll /usr/local/http-2.4.23/htdocs/ 總用量 64 drwxr-xr-x. 2 root root 23 11月 25 14:45 about -rw-r--r--. 1 root root 60108 11月 24 10:02 access.jpg //確保文件存在 -rw-r--r--. 1 root root 45 6月 12 2007 index.html [root@localhost ~]# ll /usr/local/http-2.4.23/htdocs/about 總用量 236 -rw-r--r--. 1 root root 240595 11月 24 10:01 error.png //確保文件存在 [root@localhost ~]# apachectl restart //從新啓動httpd服務器
B服務器:
[root@localhost ~]# yum -y install httpd //爲了方便 起見,使用yum的方式安裝httpd服務 [root@localhost ~]# vim /var/www/html/index.html <a href="http://192.168.1.1/access.jpg">連接</a> //手動安裝的httpd的主頁文件作一個超連接鏈接到A服務器的根目錄下的access.jpg //訪問時會出現一個連接的超連接
這樣當客戶端訪問B服務器時就會查看到error.png(訪問的本意是訪問access.jpg)
也可讓客戶端的連接過來的時候訪問到錯誤頁面,方法以下:
修改A服務器的配置文件:
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf …………………… //省略部份內容 RewriteEngine On RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://192.168.1.1/.*$ [NC] #RewriteRule .*\.(gif|jpg|swf)$ http://192.168.1.1/about/error.png [R,NC,L] //將這條進行註釋 RewriteRule .*\.(gif|jpg|png)$ - [F] //(強制 URL 爲被禁止的 forbidden),強制當前 URL 爲被禁止的,即,當即反饋一 個 HTTP 響應代碼 403(被禁止的) [root@localhost ~]# systemctl restart httpd //從新啓動httpd服務
再次訪問就會出現這樣的狀況:
注意清除瀏覽器緩存
這樣就證實了防盜鏈的做用!
也就是利用 SetEnvIfNoCase 和 access。 這個方法能夠經過阻止某些機器人或蜘蛛爬蟲抓取你的網站來節省你的帶寬流量。 語法: SetEnvIfNoCase attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ... SetEnvIfNoCase 當知足某個條件時,爲變量賦值,即根據客戶端請求屬性設置環境變量。 注:Referer :指明瞭請求當前資源原始資源的 URL,使用 referer 是能夠防盜鏈 而後在找到本身網站對應的配置的地方(如在主配置文件中或虛擬主機
中),加入下列代碼:
SetEnvIfNoCase Referer "^$" local_ref SetEnvIfNoCase Referer"^http://www.benet.com/.*$" local_ref SetEnvIfNoCase Referer"^http://benet.com/.*$"local_ref <filesmatch"\.(mp3|mp4|zip|rar|jpg|gif|png)">
經過判斷referer變量的值,來判斷圖片或資源的引用是否合法,只有在根據配置符合設定需求範圍內的referer,這樣的網站內容,才能調用訪問指定的資源內容,從而實現了資源被網站盜鏈的目的。須要注意的是:是全部的用戶代理(瀏覽器)都會設置referer變量,並且有的還能夠手工修改erferer,referer是能夠被僞造的,上面的配置只是一種簡單的防禦手段。應付通常的盜鏈足矣。當網站被盜鏈,通常能夠採起如下措施:對本站的圖片、視頻、音頻等文件標上本身的站名品牌或者相關水印;設置防火牆,從源頭IP進行控制設置防盜鏈(根據referer機制)網站被非法盜鏈使用,會致使網站帶寬成本加大以及服務器壓力加大,嚴重時會致使鉅額的網站及正經常使用戶訪問受到影響。好了,防盜鏈至此就實現了。———————— 本文至此結束,感謝閱讀 ————————