Apache深度優化

博文結構
Apache的Gzip(deflate)功能
Apache的緩存設置
Apache禁止目錄遍歷
Apache隱藏版本目錄
Apache日誌分割
Apache配置防盜鏈css

關於apache源碼包安裝參考apache安裝及工做模式html

一.apache的Gzip(deflate)功能

開啓 apache 的 Gzip(deflate)功能 gzip 能夠極大的加速網站,有時壓縮比率高到 80%,最少都有 40%以上,仍是至關不錯的。 在 Apache2 以後的版本,模塊名不叫 gzip,而叫 mod_deflate web

  • 未使用 Gzip

Apache深度優化

  • 開啓使用

Apache深度優化

  • 若是要使用gzip(deflate)的功能,必定要打開兩個模塊
    注:進入主配置文件裏面把前面#號去掉就能夠
    如圖:
    [root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf
    Apache深度優化
LoadModule deflate_module modules/mod_deflate.so
//模塊的做用:對傳輸到客戶端的代碼進行gzip壓縮
LoadModule headers_module modules/mod_headers.so 
/模塊的做用:告訴客戶端的瀏覽器,傳輸的文件使用了gzip壓縮。若是不開啓的話,則沒法正常顯示網頁內容
  • mod_deflate 模塊檢查及安裝
[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:表示須要執行編譯操做。
  • 在安裝時會報錯如圖:

Apache深度優化

  • 這是須要yum安裝zlib-devel

[root@localhost ~]# yum -y install zlib-develapache

  • 在Apache主配置文件的 LoadModule deflate_module modules/mod_deflate.so 這行的上一行添加
  • LoadFile /usr/local/zlib/lib/libz.so

[root@localhost /]# vim /usr/local/http-2.4.23/conf/httpd.conf
Apache深度優化
[root@localhost /]# apachectl -t
Syntax OK
[root@localhost /]# apachectl restartvim

  • 接下來修改Apache主配置文件,使其開啓gzip壓縮傳輸功能瀏覽器

  • 在Apache主配置文件中在末尾添加以下內容:
[root@localhost /]# vim /usr/local/http-2.4.23/conf/httpd.conf 

<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

解釋:緩存

<IfModule mod_deflate.c>
DeflateCompressionLevel 9    
\\壓縮程度的等級,預設能夠採用 6 這個數值,以維持 耗用處理器效能與網頁壓縮質量的平衡

SetOutputFilter DEFLATE
\\設置輸出過濾器,對輸出啓用壓縮,必須的,就像一個 開關同樣,告訴 apache 對傳輸到瀏覽器的內容進行壓縮 

AddOutputFilterByType DEFLATE text/*
\\設置對文件是文本的內容進行壓縮,例如 text/html  text/css  text/plain 等. 

SetEnvIfNoCase Request_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
//指定日誌的存放路徑
  • 修改完成後保存退出並重啓 httpd 服務,使用瀏覽器測試訪問,以下圖顯示結果:(提示:在訪問測試頁以前按 F12 鍵)
    注:訪問以前須要把網頁內容調的大一些,多複製幾行

[root@localhost /]# vim /usr/local/http-2.4.23/htdocs/index.html
Apache深度優化安全

[root@localhost /]# apachectl -t
Syntax OK
[root@localhost /]# apachectl restart
  • 能夠看到頁面已經被壓縮

Apache深度優化

  • 查看日誌
[root@localhost ~]# cat /usr/local/http-2.4.23/logs/deflate_log.log
"GET / HTTP/1.1" 77/5265 (1%)
"GET /favicon.ico HTTP/1.1" -/- (-%)
"GET / HTTP/1.1" 77/5265 (1%)
"GET / HTTP/1.1" 77/5265 (1%)
[root@localhost ~]#

注:圖片是不須要啓用 GZip 壓縮的,從 GZip 檢測結果來看,壓縮後的圖片體積居然大過原 體積!這就解釋了爲何圖片不用啓用 GZip 壓縮的緣由了服務器

apache的緩存配置

這個是很是有用的優化,mod_expires 能夠減小 20-30%左右的重複請求,讓重複的用戶對指定 的頁面請求結果都 CACHE 在本地,根本不向服務器發出請求。但要注意更新快的文件不要 這麼作。 這個模塊控制服務器應答時的 Expires 頭內容和 Cache-Control 頭的 max-age 指令。有效期 (expiration date)能夠設置爲相對於源文件的最後修改時刻或者客戶端的訪問時刻網絡

  • 未啓用 mod_expires模塊expire緩存的效果

Apache深度優化

  • 啓用 expire 緩存

進入主配置裏面搜索expires把前面#去掉

[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf

Apache深度優化

  • 而後添加 Expires 配置規則 (在Apache主配置文件末尾添加如下內容)
<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>

註釋:

<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>
  • 測試效果以下:

Apache深度優化

其中<base>是下列之一: 
• access 
• now (等價於'access ')
• modification 
plus 關鍵字是可選的。<num>必須是整數,<type>是下列之一: 
• years
• months
• weeks 
• days 
• hours 
• minutes 
• seconds
  • Apache禁止目錄遍歷
    將 Options Indexes FollowSymLinks 中的 Indexes 去掉,就能夠禁止 Apache 顯示該目錄結構
    Indexes 的做用就是當該目錄下沒有 index.html 文件時,就顯示目錄結構。
[root@localhost ~]# cd /usr/local/http-2.4.23/htdocs/
[root@localhost htdocs]# mv index.html /index.html.bak
[root@localhost htdocs]# mkdir aaa
[root@localhost htdocs]# mkdir 123
[root@localhost htdocs]# vim /usr/local/http-2.4.23/conf/httpd.conf 
[root@localhost htdocs]# apachectl restar

[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf 
[root@localhost ~]# apachectl restart

Apache深度優化

Apache深度優化

報403沒有權限訪問

顯示目錄結構:把主配置文件裏面剛刪除的寫回來

Apache深度優化

報200訪問成功

apache隱藏版本

  • 默認 apache 的狀態信息

Apache深度優化

  • 這樣輕易的出如今互聯網上,顯然是不安全的。能夠經過如下操做進行優化處理,方法以下:

[root@localhost /]# vim /usr/local/http-2.4.23/conf/httpd.conf
進入主配置文件把前面#號去掉

Apache深度優化

  • 修改 httpd-default.conf

[root@localhost /]# vim /usr/local/http-2.4.23/conf/extra/httpd-default.conf

找到 ServerTokens Full ServerSignature On 改爲 ServerTokens Prod ServerSignatureoff 重啓 apache 測試

Apache深度優化

[root@localhost /]# apachectl restart
[root@localhost /]# curl -I 127.0.0.1

  • 能夠看到apache版本號被隱藏了
    Apache深度優化

  • 若是你須要完全將版本之類的信息進行改頭換面,你就須要在編譯以前作準備或者進行重新 編譯了。在從新編譯時,修改源碼包下 include 目錄下的 ap_release.文件
#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  #

日誌分割

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

  • 方法一
    使用 rotatelogs(apache 自帶的工具)每隔一天記錄一個日誌

[root@localhost /]# vim /usr/local/http-2.4.23/conf/httpd.conf

修改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爲輪轉的時間,單位是秒(也就是一天生成一個日誌文件)。

  • 而後添加以下兩行
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
[root@localhost /]# ls /usr/local/http-2.4.23/logs/
access_20191221.log  access-20191221.log  access_log  error_20191221.log  error-20191221.log  error_log  httpd.pid
[root@localhost /]#

因爲 apache 自帶的日誌輪詢工具 rotatelogs,聽說在進行日誌切割時容易丟日誌,所以咱們一般使用 cronolog 進行日誌輪詢。

  • 方法二
    下載cronlog
    使用 cronolog 爲每一天創建一個新的日誌安裝 cronolog 程序
[root@localhost /]# tar zxf cronolog-1.6.2.tar.gz  
[root@localhost /]# cd 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
//測試訪問一下,訪問日誌和錯誤日誌便可產生

[root@localhost /]# ls /usr/local/http-2.4.23/logs/

  • 生產環境下,經常使用方法:
按天輪詢:
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 時不能自動建立,這一點要特別注意 !

配置防盜鏈

有時候會忽然發現網站的訪問量愈來愈,千萬不要高興的太早,頗有多是被別人盜鏈了。打個比方說:你本身搭建了一個視頻網站,而後別人將他網站上的視頻的地址重定向到你的服務器上。這樣你的網站訪問量就會愈來愈大,消耗的資源也就愈來愈多!如何避免這種可能的發生,那麼就須要使用防盜鏈。

  • 方法一

服務器配置以下:

用 rewrite 實現

下載倆個圖片保存在
Apache深度優化

[root@localhost htdocs]# ls
a.jpg  b.jpg
[root@localhost htdocs]# mkdir about
[root@localhost htdocs]# mv a.jpg b.jpg about
[root@localhost about]# mv  b.jpg  error.png
[root@localhost htdocs]# cd about/
[root@localhost about]# ls
a.jpg  error.png
[root@localhost about]# pwd
/usr/local/http-2.4.23/htdocs/about
[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.222.130/.*$ [NC]
    RewriteRule .*\.(gif|jpg|swf)$ http://192.168.222.130/about/error.png [R,NC,L]
</Directory>

輸入本地服務器的IP

  • 注:相關選項的解釋
RewriteEngine On #啓用 rewrite,要想 rewrite 起做用,必需要寫上 
RewriteCond test-string condPattern #寫在 RewriteRule 以前,能夠有一或 N 條,用於測試 rewrite 的匹配條件,具體怎麼寫,後面會詳細說到。 
RewriteRule Pattern Substitution #規則 
 %{HTTP_REFERER}:服務器變量,HTTPReferer 是 header 的一部分,當瀏覽器向 web 服務器發送請求的時候,通常會帶上 Referer,告訴服務器我是從哪一個頁面連接過來的,服務器藉此能夠得到一些信息用於處理。好比從我主頁上連接到一個朋友那裏,他的服務器就可以從 HTTP Referer 中統計出天天有多少用戶點擊我主頁上的連接訪問他的網站。 
[ NC]指的是不區分大小寫,[R]強制重定向 redirect 
 字母 L 表示若是能匹配本條規則,那麼本條規則是最後一條(Last),忽略以後的規則

如圖:

Apache深度優化

  • 客戶端配置以下:
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# vim /var/www/html/index.html 
<a href="http://192.168.222.130/a.jpg">lianjie</a>
\\編寫一個超連接,指定服務器的IP
  • 測試:

訪問客戶端IP
Apache深度優化

Apache深度優化

相關文章
相關標籤/搜索