apache優化之防盜鏈,日誌拆分,ab壓力測試
Apache調優之apache防盜鏈、日誌拆分和ab壓力測試
1、apache防盜鏈
盜鏈,全稱是盜取鏈接,假如我們的網站有很多好看的圖片,別人可以查看我們網站圖片的鏈接,然後應用在他的網站上,這樣的話,去訪問他的網站,實際上消耗的是我們的流量(因為實際鏈接在我們這裏),這樣我們就不得不去配置防盜鏈,使得別人不能復制我們圖片的鏈接
要實現防盜鏈,我們就必須先理解盜鏈的實現原理,提到防盜鏈的實現原理就不得不從HTTP協議說起,在HTTP協議中,有一個表頭字段叫referer,采用URL的格式來表示從哪兒鏈接到當前的網頁或文件。換句話說,通過referer,網站可以檢測目標網頁訪問的來源網頁,如果是資源文件,則可以跟蹤到顯示它的網頁地址。有了referer跟蹤來源就好辦了,這時就可以通過技術手段來進行處理,一旦檢測到來源不是本站即進行阻止或者返回指定的頁面。
Apache 防盜鏈的第一種實現方法,可以用 Rewrite 實現。首先要確認 Apache 的 rewrite module 可用:能夠控制 Apache httpd.conf 文件的,打開 httpd.conf,確保有這麽一行配置:LoadModule rewrite_module modules/mod_rewrite.so
然後在相應虛擬主機配置的地方,加入下列代碼:
ServerName www.chinaz.com
# 防盜鏈配置 參數
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://chinaz.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://chinaz.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.chinaz.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.chinaz.com$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ http://www.chinaz.com/img/nolink.gif [R,NC]
其中,chinaz.com/www.chinaz.com 表示自己的信任站點。gif|jpg|swf 表示要保護文件的擴展名(以|分開)。nolink.gif 盜鏈後的重定向頁面/圖片。用以輸出警示信息,這張圖片應該盡可能的小,當然你也可以不設置替換圖片,而是使用下面的語句即可:RewriteRule .*\.(gif|jpg|png)$ - [F] 註:[F] (強制URL為被禁止的 forbidden),強制當前URL為被禁止的,即,立即反饋一個HTTP響應代碼403(被禁止的)。
RewriteCond %{HTTP_REFERER} !^$
上面這一行意在允許空“HTTP_REFERER”的訪問,即允許用戶在瀏覽器地址欄中直接輸入圖片地址時圖片文件的顯示。
RewriteCond %{HTTP_REFERER} !benet\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !www\.benet\.com/.*$ [NC]
設置允許訪問的HTTP來源,包括網站自身。
RewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png [R,NC,L]將不滿足referer條件的訪問重定向至nolink.png。 nolink.png位於允許“盜鏈”的目錄about中,要相當註意,不然,警告信息和圖片將無法在對方網站上顯示。
有些用戶使用的是虛擬主機,沒有服務器的控制權,無法修改 httpd.conf 文件和重啟服務器。那麽請確認你的虛擬主機支持 .htaccess,將上面的配置寫入 .htaccess 文件,放入根目錄或圖片所在的目錄即可:
# 防盜鏈配置
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://chinaz.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://chinaz.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.chinaz.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.chinaz.com$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ http://www.chinaz.com/img/nolink.gif [R,NC]
通過判斷referer變量的值,判斷圖片或資源的引用是否合法,只有在設定範圍內的 referer,才能訪問指定的資源,從而實現了防盜鏈(Anti-Leech)的目的。需要指出的是:不是所有的用戶代理(瀏覽器)都會設置 referer 變量,而且有的還可以手工修改 referer,也就是說,referer 是可以被偽造的。
方法2:通過判斷瀏覽器頭信息來阻止某些請求,即利用SetEnvIfNoCase和access。這個方法可以通過阻止某些機器人或蜘蛛爬蟲抓取你的網站來節省你的帶寬流量。
語法: SetEnvIfNoCase attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...
SetEnvIfNoCase 當滿足某個條件時,為變量賦值,即根據客戶端請求屬性設置環境變量。
註:Referer :指明了請求當前資源原始資源的URL,使用referer是可以防盜鏈
然後在找到自己網站對應的配置的地方(如在主配置文件中或虛擬主機中),加入下列代碼:
SetEnvIfNoCase Referer "^$" local_ref
SetEnvIfNoCase Referer "www.benet.com/.*$" local_ref
SetEnvIfNoCase Referer "benet.com/.*$" local_ref
<filesmatch "\.(mp3|mp4|zip|rar|jpg|gif)">
測試:
在還沒有設置防盜鏈時,網站www.lyq.com的配置如圖1所示
圖1
網站lyq.gdcp.cn的配置如圖2所示
圖2
訪問網頁:
訪問www.lyq.com,如圖3所示
圖3
訪問lyq.gdcp.cn,如圖4所示
圖4
配置了防盜鏈時,服務器www.lyq.com的配置,如圖5所示(服務器lyq.gdcp.cn不用修改)
圖5
訪問頁面:
訪問www.lyq.com,如圖6所示
圖6
訪問lyq.gdcp.cn,如圖7和圖8所示
圖7
圖8
2、日誌拆分
使用工具Cronnolog進行日誌切割。
1.下載及安裝
wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
tar zxvf cronolog-1.6.2.tar.gz
cd cronolog-1.6.2
./configure
make && make install
2.用which命令查看路徑驗證安裝
which cronolog
默認路徑為:/usr/local/sbin/cronolog
3.配置
vi /usr/local/apache/conf/httpd.conf
CustomLog “|/usr/local/sbin/cronolog /usr/local/apache/logs/access_%Y%m%d.log” combined #定義訪問日誌
ErrorLog “|/usr/local/sbin/cronolog /home/www/ex/log/error_%Y%m%d.log” #定義錯誤日誌
保存配置文件後,重啟apache。
命令:service httpd restart
第二種方法
編輯Apache的主配置文件httpd.conf,更改內容如下:
註釋掉如下兩行
ErrorLog logs/error_log
CustomLog logs/access_log common
然後添加如下兩行
ErrorLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/errorlog.%Y-%m-%d-%H_%M_%S 2M +480"
CustomLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/accesslog.%Y-%m-%d-%H_%M_%S 2M +480" common
意義如下:
errorlog.%Y-%m-%d-%H_%M_%S為生成日誌的格式,類似於這樣:errorlog.2010-04-15-11_32_30 ,以年月日時分秒為單位的,2M 為日誌的大小,即為日誌達到多大後生成新的日誌文件,支持的單位為K,M,G,本處為2M。+480 為時差,文件的時間為美國時間,中國的時差要比美國多8個小時也就是480分鐘,所以要加上480分鐘。
rotatelogs說明:
rotatelogs logfile [ rotationtime [ offset ]] | [ filesizeM ]
rotationtime指的是設定多少秒後進行日誌切割,如這裏的300秒,在設定的時間之後系統將自動切割日誌;offset指的是日誌時間的偏移量,如果不設置該偏移量,則默認為0,且顯示的時間與北京時間會不一樣,與北京時間相差8個小時,故建議將其設置為+480,單位為分鐘;filesizeM指的是日誌多大之後自動切割,可接受的單位為K,M,G,上面的ErrorLog設置為400M之後自動切割日誌。
其他的設置方法如下:
每天生成一個錯誤日誌文件
ErrorLog "|bin/rotatelogs.exe -l logs/error-%Y-%m-%d.log 86400"
其中86400為輪轉的時間單位為秒
rotatelogs - 滾動Apache日誌的管道日誌程序
rotatelogs是一個配合Apache管道日誌功能使用的簡單程序。舉例:
CustomLog "|bin/rotatelogs /var/logs/logfile 86400" common
此配置會建立文件"/var/logs/logfile.nnnn",其中的nnnn是名義上的日誌啟動時的系統時間(此時間總是滾動時間的倍數,可以用於cron腳本的同步)。在滾動時間到達時(在此例中是24小時以後),會產生一個新的日誌。
CustomLog "|bin/rotatelogs /var/logs/logfile 5M" common
此配置會在日誌文件大小增長到5兆字節時滾動該日誌。
ErrorLog "|bin/rotatelogs /var/logs/errorlog.%Y-%m-%d-%H_%M_%S 5M"
此配置會在錯誤日誌大小增長到5兆字節時滾動該日誌,日誌文件名後綴會按照如下格式創建:errorlog.YYYY-mm-dd-HH_MM_SS 。
語法
rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]
選項
-l
使用本地時間代替GMT時間作為時間基準。註意:在一個改變GMT偏移量(比如夏令時)的環境中使用-l會導致不可預料的結果。
logfile
它加上基準名就是日誌文件名。如果logfile中包含"%",則它會被視為用於strftime()的格式字符串;否則它會被自動加上以秒為單位的".nnnnnnnnnn"後綴。這
兩種格式都表示新的日誌開始使用的時間。
rotationtime
日誌文件滾動的以秒為單位的間隔時間。
offset
相對於UTC的時差的分鐘數。如果省略,則假定為"0"並使用UTC時間。比如,要指定UTC時差為"-5小時"的地區的當地時間,則此參數應為"-300"。
filesizeM
指定以filesizeM文件大小滾動,而不是按照時間或時差滾動。
可移植性
下列日誌文件格式字符串可以為所有的strftime()實現所支持,見各種擴展庫對應的strftime()的手冊。
%A星期名全稱(本地的)
%a3個字符的星期名(本地的)
%B月份名的全稱(本地的)
%b3個字符的月份名(本地的)
%c日期和時間(本地的)
%d2位數的一個月中的日期數
%H2位數的小時數(24小時制)
%I2位數的小時數(12小時制)
%j3位數的一年中的日期數
%M2位數的分鐘數
%m2位數的月份數
%pam/pm12小時制的上下午(本地的)
%S2位數的秒數
%U2位數的一年中的星期數(星期天為一周的第一天)
%W2位數的一年中的星期數(星期一為一周的第一天)
%w1位數的星期幾(星期天為一周的第一天)
%X時間(本地的)
%x日期(本地的)
%Y4位數的年份
%y2位數的年份
%Z時區名
%%符號"%"本身
測試:
使用編輯Apache的主配置文件httpd.conf的方法,如圖9所示
圖9
到log目錄下查看是否有該日誌文件,如圖10所示
圖10
查看日誌文件,如圖11所示
圖11
3、ab壓力測試
ab命令原理
Apache的ab命令模擬多線程並發請求,測試服務器負載壓力,也可以測試nginx、lighthttp、IIS等其它Web服務器的壓力。ab命令對發出負載的計算機要求很低,既不會占用很多CPU,也不會占用太多的內存,但卻會給目標服務器造成巨大的負載,因此是某些DDOS攻擊之必備良藥,老少皆宜。自己使用也須謹慎。否則一次上太多的負載,造成目標服務器直接因內存耗光死機,而不得不硬重啟,得不償失。
在帶寬不足的情況下,最好是本機進行測試,建議使用內網的另一臺或者多臺服務器通過內網進行測試,這樣得出的數據,準確度會高很多。遠程對web服務器進行壓力測試,往往效果不理想(因為網絡延時過大或帶寬不足)
註:
參數解析:
-n:代表請求數,在測試會話中所執行的請求個數。默認時,僅執行一個請求
-c:代表並發數,一次產生的請求個數。默認是一次一個
-t:測試所進行的最大秒數。其內部隱含值是-n 50000。它可以使對服務器的測試限制在一個固定的總時間以內。默認時,沒有時間限制
-p:包含了需要POST的數據的文件
-T:POST數據所使用的Content-type頭信息。
-v:設置顯示信息的詳細程度 - 4或更大值會顯示頭信息, 3或更大值可以顯示響應代碼(404, 200等), 2或更大值可以顯示警告和其他信息。 -V 顯示版本號並退出。
-i:執行HEAD請求,而不是GET。
-C:cookie-name=value 對請求附加一個Cookie:行。 其典型形式是name=value的一個參數對。此參數可以重復。
-P:proxy-auth-username:password 對一個中轉代理提供BASIC認證信任。用戶名和密碼由一個:隔開,並以base64編碼形式發送。無論服務器是否需要(即, 是否發送了401認證需求代碼),此字符串都會被發送。
返回結果解析:
Server Software: ##apache版本
Server Hostname: ##請求的機子
Server Port: ##請求端口
Document Length: ## HTTP響應數據的正文長度
Concurrency Level: ##並發數
Time taken for tests: ##所有這些請求處理完成所花費的時間
Complete requests: ##完成請求數
Failed requests: ##失敗請求數
Total transferred: ##總共傳輸字節數,包含http的頭信息等
HTML transferred: ##html字節數,實際的頁面傳遞字節數
Requests per second: ##每秒多少請求,這個是非常重要的參數數值,服務器的吞吐量
Time per request: ##服務器收到請求,響應頁面要花費的時間
Time per request: ##服務器平均處理時間,也就是服務器吞吐量的倒數
Transfer rate: ##平均每秒網絡上的流量,可以幫助排除是否存在網絡流量過大導致響應時間延長的問題
測試:
[root@lyq1 bin]# ./ab -c1000 -n1000 http://www.lyq.com:8080/1.jpg
This is ApacheBench, Version 2.3 <$Revision: 1796539 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking www.lyq.com (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 ##apache版本(這裏版本已被隱藏了)
Server Hostname: www.lyq.com ##服務器主機名
Server Port: 8080 ##服務器端口
Document Path: /1.jpg ##測試的頁面文檔
Document Length: 9006 bytes ##測試文檔大小
Concurrency Level: 1000 ##並發數
Time taken for tests: 6.950 seconds ##整個測試持續的時間
Complete requests: 1000 ##完成的請求數量
Failed requests: 0 ##失敗的請求數量
Total transferred: 9241000 bytes ##整個場景中的網絡傳輸量
HTML transferred: 9006000 bytes ##整個場景中的HTML內容傳輸量
Requests per second: 143.89 [#/sec] (mean) ##大家最關心的指標之一,相當於LR中的每秒事務數,後面括號中的mean表示這是一個平均值
Time per request: 6949.866 [ms] (mean) ##大家最關心的指標之二,相當於LR中的平均事務響應時間,後面括號中的mean表示這是一個平均值
Time per request: 6.950 [ms] (mean, across all concurrent requests) ##每個請求實際運行時間的平均值
Transfer rate: 1298.50 [Kbytes/sec] received ##平均每秒網絡上的流量,可以幫助排除是否存在網絡流量過大導致響應時間延長的問題
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 21 20.1 3 44
Processing: 6 805 2070.7 16 6905
Waiting: 6 804 2070.8 15 6905
Total: 7 826 2078.7 22 6946
##網絡上消耗的時間的分解,各項數據的具體算法還不是很清楚
Percentage of the requests served within a certain time (ms)
50% 22
66% 59
75% 248
80% 260
90% 4011
95% 6884
98% 6916
99% 6939
100% 6946 (longest request)
##整個場景中所有請求的響應情況。在場景中每個請求都有一個響應時間,其中50%的用戶響應時間小於22 毫秒,60% 的用戶響應時間小於59 毫秒,最大的響應時間小於6946 毫秒
由於對於並發請求,cpu實際上並不是同時處理的,而是按照每個請求獲得的時間片逐個輪轉處理的,所以基本上第一個Time per request時間約等於第二個Time per request時間乘以並發請求數
apache優化之防盜鏈,日誌拆分,ab壓力測試