1. 程式人生 > >2018.3.5 10周4次課

2018.3.5 10周4次課

Linux學習

十周四次課(3月5日)

11.22 訪問日誌不記錄靜態文件

11.23 訪問日誌切割

11.24 靜態元素過期時間

11.22 訪問日誌不記錄靜態文件

一個網站會有很多元素,尤其是圖片、js、css等靜態的文件非常多,用戶每請求一個頁面就會訪問諸多的圖片、js等靜態元素,這些元素的請求都會被記錄在日誌中。如果一個站點訪問量很大,那麽訪問日誌文件增長會非常快,一天就可以達幾GB這不僅對於服務器的磁盤空間造成影響,更重要的是會影響磁盤的讀寫速度。訪問日誌很重要,我們又不能不記錄。還好這些巨量的靜態元素請求記錄到日誌裏意義並不大,所以可以限制這些靜態元素去記錄日誌

  • 網站大多元素為靜態文件,如圖片、css、js等,這些元素可以不用記錄

在打開的網頁上按F12,會出現如下的頁面

技術分享圖片

默認定位Network,刷新後會出現很多頁面的元素,每一行代表一個元素。每一行都是一個請求,每個請求都會記錄訪問日誌。

  • 把虛擬主機配置文件改成如下:

<VirtualHost *:80>

DocumentRoot "/data/wwwroot/111.com"

ServerName 111.com

ServerAlias www.example.com 2111.com.cn

#<Directory /data/wwwroot/111.com>

#<FilesMatch 123.php>

# AllowOverride AuthConfig

# AuthName "111.com user auth"

# AuthType Basic

# AuthUserFile /data/.htpasswd

# require valid-user

#</FilesMatch>

#</Directory>

<IfModule mod_rewrite.c>

RewriteEngine on

RewriteCond %{HTTP_HOST} !^111.com$

RewriteRule ^/(.*)$ http://111.com/$1 [R=301,L]

</IfModule>

ErrorLog "logs/111.com-error_log"

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

</VirtualHost>

先定義了一個image環境變量,把gif、jpg、png、bmp、swf、js、css等格式的文件全部歸類到image裏,後面的env=!image有用到一個“ !" 這相當於取反了,意思是把 image以外的類型文件記錄到日誌裏。

技術分享圖片

分別加載jpg1和jpg格式

技術分享圖片

查詢日誌:tail /usr/local/apache2.4/logs/111.com-access_log

技術分享圖片

可以看到只記錄了jpg1,沒有記錄jpg

上傳一張baidu.php測試

技術分享圖片

技術分享圖片

技術分享圖片

日誌裏面沒有:tail /usr/local/apache2.4/logs/111.com-access_log

技術分享圖片

11.23 訪問日誌切割

日誌一直記錄總有一天會把整個磁盤占滿,所以有必要讓它自動切割,並刪除老的日誌文件

打開虛擬主機配置文件:vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

更改CustomLog這行配置為:CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img

正常應該CustomLog後面為日誌文件名,但在這裏用了一個管道,它會把日誌內容交給後面的rotatelogs命令處理。這個rotatelogs為httpd自帶切割日誌的工具,它會把訪問日誌按我們定義的文件名格式進行切割

-l:以當前系統的時間為基準,如果不指定就以UTC格式的時間為基準來切割(中國是CST,美國是UTC)

%Y%m%d :年月日

86400單位是“秒":相當於“一天"。

保存配置文件後,測試配置文件是否有錯誤,沒有錯誤重新加載服務

技術分享圖片

用curl測試:curl -x127.0.0.1:80 111.com/123.php

技術分享圖片

11.24 靜態元素過期時間

在上面的日誌裏,如果你觀察地很仔細,會發現有一個狀態碼為304,這個狀態碼表示該文件已經緩存到用戶的電腦裏了,再次請求它的時候不用從服務器上下載,而是直接訪問用戶電腦裏面的緩存。這樣做的目的是降低服務器的資源消耗,還可以提升用戶訪問網站的速度。平時我們訪問一個網站時,很多元素為靜態的小圖片,那這些小圖片完全可以緩存在咱們的電腦裏,這樣再次訪問該站點時,速度就會很快。

那到底能緩存多久呢?如果服務器上的某個圖片更改了,那麽應該訪問新的圖片才對。這就涉及一個靜態文件緩存時長的問題,也叫作“緩存過期時間"。在httpd的配置文件中,我們是可以控制這個時間的。

  • 瀏覽器訪問網站的圖片時會把靜態的文件緩存在本地電腦裏,這樣下次再訪問時就不用去遠程下載了,狀態碼為304

  • 編輯虛擬主機配置文件:vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

<VirtualHost *:80>

DocumentRoot "/data/wwwroot/abc.com"

ServerName abc.com

ServerAlias www.abc.com www.123.com

ErrorLog "logs/abc.com-error_log"

CustomLog "logs/abc.com-access_log" common

</VirtualHost>

DocumentRoot "/data/wwwroot/111.com"

ServerName 111.com

ServerAlias www.example.com 2111.com.cn

#<Directory /data/wwwroot/111.com>

#<FilesMatch 123.php>

# AllowOverride AuthConfig

# AuthName "111.com user auth"

# AuthType Basic

# AuthUserFile /data/.htpasswd

# require valid-user

#</FilesMatch>

#</Directory>

<IfModule mod_rewrite.c>

RewriteEngine on

RewriteCond %{HTTP_HOST} !^111.com$

RewriteRule ^/(.*)$ http://111.com/$1 [R=301,L]

</IfModule>

<IfModule mod_expires.c>

ExpiresActive on //打開該功能的開關

ExpiresByType image/gif "access plus 1 days" //gif格式的文件過期時長為1天

ExpiresByType image/jpeg "access plus 24 hours" //jpeg格式的文件過期時長為24小時

ExpiresByType image/png "access plus 24 hours" //png格式的文件過期時長為24小時

ExpiresByType text/css "now plus 2 hour" //css格式的文件過期時長為2小時

ExpiresByType application/x-javascript "now plus 2 hours" //js格式的文件過期時長為2小時

ExpiresByType application/javascript "now plus 2 hours" //js格式的文件過期時長為2小時

ExpiresByType application/x-shockwave-flash "now plus 2 hours" //flash格式的文件過期時長為2小時

ExpiresDefault "now plus 0 min" //其他文件過期時長為0,就是不緩存

</IfModule>

ErrorLog "logs/111.com-error_log"

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 "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img

</VirtualHost>

檢測:/usr/local/apache2.4/bin/apachectl –t

技術分享圖片

  • 檢查是否加載了expires模塊:/usr/local/apache2.4/bin/apachectl -M |grep expires

技術分享圖片

沒有任何輸出,說明沒有加載

編輯主配置文件:vim /usr/local/apache2.4/conf/httpd.conf

LoadModule expires_module modules/mod_expires.so //去掉行首的#

重新加載:/usr/local/apache2.4/bin/apachectl graceful

技術分享圖片

  • 使用curl來測試

技術分享圖片

可以看到cache-control:max-age=86400,php的圖片將緩存86400秒。還有按理說既然有緩存,那我們請求該圖片時狀態碼應該為304才對,但這裏是200。這是因為我們使用curl工具來請求的,它並不像瀏覽器那樣可以緩存這些文件,另max-age=0,說明沒有緩存該類型的文件。


2018.3.5 10周4次課