LAMP架構訪問日誌的設定及切割、靜態檔案失效設定
阿新 • • 發佈:2018-11-25
訪問日誌不記錄靜態檔案
為什麼要這樣設定
網站大多為靜態網頁,網頁內部的圖片、css檔案等同樣有其網址連結,如果不設定,這些無效的資訊也將被存入訪問日誌中,會導致訪問日誌檔案大小快速增加,佔用大量儲存空間。我們可以通過設定不記錄某些檔案來減少無效資訊,節省記憶體資源。
如何設定
修改虛擬主機配置檔案httpd-vhost.conf
[[email protected] logs]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
...
ErrorLog "logs/111.com-error_log"
# SetEnvIf行設定img滿足URI匹配.gif等的情況,配合env=!img排除特定型別檔案的錯誤日誌記錄。
SetEnvIf Request_URI ".*\.gif$" img
SetEnvIf Request_URI ".*\.jpg$" img
SetEnvIf Request_URI ".*\.png$" img
SetEnvIf Request_URI ".*\.bmp$" img
SetEnvIf Request_URI ".*\.swf$" img
SetEnvIf Request_URI ".*\.js$" img
SetEnvIf Request_URI ".*\.css$" img
CustomLog "logs/111.com-access_log" combined env=!img
...
# 重啟服務,使配置生效
[ [email protected] ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[[email protected] logs]# /usr/local/apache2.4/bin/apachectl graceful
效果驗證
# 訪問包含.jpg等的路徑,訪問日誌不會記錄;訪問其他則被記錄
[[email protected] ~]# curl -x 192.168.65.133:80 111.com/111.jpg -I
HTTP/1.1 200 OK
Date: ..., ... 11:19:25 GMT
Server: Apache/2.4.28 (Unix) PHP/5.6.30
Last-Modified: ..., ... 11:19:21 GMT
ETag: "2-560d7df2b9966"
Accept-Ranges: bytes
Content-Length: 2
Content-Type: image/jpeg
#未記錄匹配到的jpg檔案訪問記錄!
[ [email protected] ~]# cat /usr/local/apache2.4/logs/111.com-access_log
...
// 沒有最新的訪問圖片的記錄
192.168.65.133 - - [...:19:17:32 +0800] "HEAD HTTP://111.com/111.php HTTP/1.1" 200 - "-" "curl/7.29.0"
將env!=img去掉(記得重啟服務!!),看是否會記錄
# 修改配置並重啟訪問
[[email protected] logs]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
[[email protected] ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[[email protected] ~]# /usr/local/apache2.4/bin/apachectl graceful
# 重新測試
[[email protected] ~]# curl -x 192.168.65.133:80 111.com/111.jpg -I
HTTP/1.1 200 OK
Date: ..., ... 11:22:38 GMT
Server: Apache/2.4.28 (Unix) PHP/5.6.30
Last-Modified: ..., ... 11:19:21 GMT
ETag: "2-560d7df2b9966"
Accept-Ranges: bytes
Content-Length: 2
Content-Type: image/jpeg
# 檢視是否記錄
[[email protected] ~]# cat /usr/local/apache2.4/logs/111.com-access_log
...
# 訪問jpg檔案資訊被記錄
192.168.65.133 - - [...:19:22:38 +0800] "HEAD HTTP://111.com/111.jpg HTTP/1.1" 200 - "-" "curl/7.29.0"
訪問日誌切割
就算不記錄某些無效資訊,隨之伺服器的執行,訪問日誌檔案大小也將會不斷變大,通過設定日誌檔案自動切割以及一段時間後刪除舊的日誌就變得較為必要。
如何設定
修改虛擬主機配置檔案
[[email protected] logs]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
...
# /usr/local/apache2.4/bin/rotatelogs工具是apache自帶的分割日誌的工具
# -l引數按當前系統時間為基準進行切割(我國為CST)
# %Y%m%d表示年月日,這樣會每天記錄一個帶日期的日誌檔案,更方便
# 86400(s)表示每天都進行切割
CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d_log 86400" combined env=!img
# 使用"|$"替代"|"來呼叫shell執行,預設是不會呼叫shell的
# CustomLog "|$/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d_log 86400" combined env=!img
...
[[email protected] logs]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[[email protected] logs]# /usr/local/apache2.4/bin/apachectl graceful
效果測試
檢視是否生成新格式的日誌檔案
[[email protected] ~]# curl -x 127.0.0.1:80 111.com/111.php
abc.com
# logs目錄下已經產生當天格式的訪問日誌
[[email protected] ~]# ls /usr/local/apache2.4/logs/
111.com-access_log abc.com-access_log error_log
111.com-error_log abc.com-error_log httpd.pid
111.com-access_20171221_log access_log
補充內容
如果想定期刪除老日誌,可以配合cron命令,可以實現。
[[email protected] ~]# crontab -e
# 每月1號刪除15天以前的所有帶日期的日誌檔案
0 0 1 * * /usr/bin/find /usr/local/apache2.4/logs/ -regex ".*/.*-access_.*_log" -mtime +15 -exec rm -f {} \;
說明:由於find目錄查詢檔案顯示為絕對路徑,使用正則來匹配時不能只單單匹配檔名,還需要匹配其之前的路徑,這裡使用了-regex
這個不常用的引數。
詳細說明參見:http://blog.csdn.net/lee244868149/article/details/43406335
靜態檔案過期時間
瀏覽器訪問網站的圖片時會把靜態的檔案快取在本地電腦裡,這樣下次訪問時就不用再次獲取,直接就可以使用,可以節省頻寬資源。
當狀態碼為304時,瀏覽器將不會向伺服器獲取已快取的檔案。
設定範例
先在主配置檔案內開啟expires模組
[[email protected] logs]# vim /usr/local/apache2.4/conf/httpd.conf
// 新增expire模組,刪除行首的#
#LoadModule expires_module modules/mod_expires.so
// 檢視expire模組是否已載入,沒有的話要修改httpd.conf檔案去載入
[[email protected] logs]# /usr/local/apache2.4/bin/apachectl -M | grep expire
expires_module (shared)
在虛擬主機配置檔案內增加如下配置
[[email protected] logs]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
...
<IfModule mod_expires.c>
# 開啟該功能的開關
ExpiresActive on
# 按檔案型別來設定自定義過期時間
# acess表示從訪問時間開始
# now表示按當前時間開始
# plus在前面的時間基礎上加上
# 1 hours/days 表示檔案的生命週期
# 例如 acess plus 1 days 表示該檔案從訪問的時間開始1天內有效,無需重新獲取
ExpiresByType image/gif "access plus 1 days"
ExpiresByType image/jpeg "access plus 24 hours"
ExpiresByType image/png "access plus 24 hours"
ExpiresByType text/css "now plus 2 hours"
ExpiresByType application/x-javascript "now plus 2 hours"
ExpiresByType application/javascript "now plus 2 hours"
ExpiresByType application/x-shockwave-flash "now plus 2 hours"
# 其他表示方法
# A:客戶端訪問時間
# M: 檔案最後修改的時間
ExpiresByType img/bmp A2592000
ExpiresByType text/html M604800
# 除上述外的檔案指定預設的過期時間
ExpiresDefault "now plus 0 min"
</IfModule>
...
重新載入配置檔案
[[email protected] logs]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[[email protected] logs]# /usr/local/apache2.4/bin/apachectl graceful
效果驗證
- 指定型別(png)的檔案訪問資訊
#
# 設定後的狀態資訊中出現Cache-Control、Expires等資訊
[[email protected] 111.com]# curl -x 192.168.65.133:80 111.com/lvm.png -I
HTTP/1.1 200 OK
Date: ..., ... 13:22:07 GMT
Server: Apache/2.4.28 (Unix) PHP/5.6.30
Last-Modified: ..., ... 13:48:33 GMT
ETag: "23e28-55cec20a0ce40"
Accept-Ranges: bytes
Content-Length: 146984
Cache-Control: max-age=86400 //該時間等於Expires-Date
Expires: ..., ... 13:22:07 GMT // 改行顯示了檔案的過期時間
Content-Type: image/png
- 預設檔案型別(php)檔案訪問資訊
# 預設檔案訪問後馬上過期,max-age為0
[[email protected] ~]# curl -x 127.0.0.1:80 abc.com/abc.php -I
HTTP/1.1 200 OK
Date: ..., ... 12:03:44 GMT
Server: Apache/2.4.28 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Cache-Control: max-age=0
Expires: ..., ... 12:03:44 GMT
Content-Type: text/html; charset=UTF-8