一个网站会有很多元素,比如图片、js、css等静态文件比较多,用户每请求一个页面就会访问很多的静态元素,这些元素的请求都会被记录到日志中去。如果一个网站访问量比较大,那么访问日志就会增加的非常快,甚至一天就可以达到几个GN。这不仅会对服务器的磁盘空间造成影响,更重要的是会影响磁盘的读写速度。
把这些静态元素的请求记录到日志里意义并不是很大,所以可以限制这些静态元素去记录日志。
编辑虚拟主机配置文件,定义了一个img的环境变量,把gif、jpg、png、bmp、swf等格式的文件全部归类到img里,后面的env=!img表示取反,意思是把除img以外的文件全部记录到日志中:
DocumentRoot "/data/wwwroot/aaa.com"
ServerName aaa.com
RewriteEngine on
RewriteCond %{HTTP_HOST} !^aaa.com$
RewriteRule ^/(.*)$ http://aaa.com/$1 [R=301,L]
ServerAlias www.aaa.com
ErrorLog "logs/aaa.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/aaa.com-access_log" combined env=!img
重新加载配置;
[root@yuioplvlinux-128 ~]# /usr/local/apache2/bin/apachectl -t
Syntax OK
[root@yuioplvlinux-128 ~]# /usr/local/apache2/bin/apachectl graceful
为了测试,在/data/wwwroot/aaa.com/目录下上传一张图片;
[root@yuioplvlinux-128 ~]# cd /data/wwwroot/aaa.com/
[root@yuioplvlinux-128 aaa.com]# ls
123.php index.html
[root@yuioplvlinux-128 aaa.com]# rz
[root@yuioplvlinux-128 aaa.com]# ls
123.php 2959d05a089225a9bcfeccb039a5fe62.jpg index.html
[root@yuioplvlinux-128 aaa.com]# curl -x192.168.30.128:80 aaa.com/2959d05a089225a9bcfeccb039a5fe62.jpg -I
HTTP/1.1 200 OK
Date: Wed, 30 May 2018 12:54:58 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
Last-Modified: Thu, 05 Apr 2018 05:45:54 GMT
ETag: "3cf5-5691373f0a880"
Accept-Ranges: bytes
Content-Length: 15605
Content-Type: image/jpeg
也可以在浏览器中访问;
查看访问日志,可以看到并没有访问图片的记录;
[root@yuioplvlinux-128 ~]# tail /usr/local/apache2/logs/aaa.com-access_log
127.0.0.1 - - [29/May/2018:22:51:08 +0800] "HEAD HTTP://aaa.com/ HTTP/1.1" 200 -
127.0.0.1 - - [29/May/2018:22:51:24 +0800] "HEAD HTTP://www.aaa.com/ HTTP/1.1" 301 -
192.168.30.1 - - [29/May/2018:23:00:23 +0800] "GET / HTTP/1.1" 304 -
192.168.30.1 - - [29/May/2018:23:00:24 +0800] "GET /favicon.ico HTTP/1.1" 404 209
127.0.0.1 - - [29/May/2018:23:53:51 +0800] "HEAD HTTP://www.aaa.com/ HTTP/1.1" 301 - "-" "curl/7.29.0"
192.168.30.1 - - [29/May/2018:23:55:46 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
192.168.30.1 - - [29/May/2018:23:55:47 +0800] "GET / HTTP/1.1" 200 8 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
192.168.30.1 - - [29/May/2018:23:55:48 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
192.168.30.1 - - [29/May/2018:23:55:48 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
192.168.30.1 - - [29/May/2018:23:55:49 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
修改虚拟主机配置主机,将其写入日志的配置改为如下所示:
CustomLog "|/usr/local/apache2/bin/rotatelogs -l logs/aaa.com-access_%Y%m%d_log 86400" combined env=!img
使用管道符,将日志内容交给rotatelogs工具处理,rotatelogs工具是httpd自带切割日志的工具,它会把访问日志按定义的文件格式进行切割。-l表示以当前系统的时间为基准,如果不指定这个选项,就会以UTC时间格式切割;%Y%m%d表示年月日,86400单位是“秒”,表示一天;
重新加载;
[root@yuioplvlinux-128 ~]# /usr/local/apache2/bin/apachectl -t
Syntax OK
[root@yuioplvlinux-128 ~]# /usr/local/apache2/bin/apachectl graceful
使用curl访问,查看/usr/local/apache2/logs/目录,可以看到生成了名为aaa.com-access_20180530_log的日志文件。
[root@yuioplvlinux-128 ~]# curl -x192.168.30.128:80 aaa.com/123.php -I
HTTP/1.1 200 OK
Date: Wed, 30 May 2018 13:34:23 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8
[root@yuioplvlinux-128 ~]# cd /usr/local/apache2/logs/
[root@yuioplvlinux-128 logs]# ls
123.com-access_log aaa.com-access_log access_log httpd.pid yu.com-error_log
aaa.com-access_20180530_log aaa.com-error_log error_log yu.com-access_log
[root@yuioplvlinux-128 logs]# cat aaa.com-access_20180530_log
192.168.30.128 - - [30/May/2018:21:34:23 +0800] "HEAD HTTP://aaa.com/123.php HTTP/1.1" 200 - "-" "curl/7.29.0"
平时访问网站时,会将一些页面的数据缓存到本地,如果服务器上的某个图片更改了,那么就应该访问新的图片才对,这涉及到一个静态文件缓存时长的问题,也叫作“缓存过期时间”。
修改虚拟主机配置文件为:
DocumentRoot "/data/wwwroot/aaa.com"
ServerName aaa.com
RewriteEngine on
RewriteCond %{HTTP_HOST} !^aaa.com$
RewriteRule ^/(.*)$ http://aaa.com/$1 [R=301,L]
ServerAlias www.aaa.com
ErrorLog "logs/aaa.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/bin/rotatelogs -l logs/aaa.com-access_%Y%m%d_log 86400" combined env=!img
ExpiresActive on
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 hour"
ExpiresByType application/x-javascript "now plus 2 hours"
ExpiresByType application/javascript "now plus 2 hours"
ExpiresByType application/x-shockwave-flash "now plus 2 hours"
ExpiresDefault "now plus 0 min"
这部分配置用到了mod_expires模块,这里gif、jpeg、png格式的文件过期时长为1天,css、js、flash格式的文件过期时间为2小时,其它文件过期时长为0,也就是不缓存。
使用命令“ /usr/local/apache2/bin/apachectl -M | grep expires”查看是否加载了expires模块,若是没有结果,要去主配置文件中打开该模块;
重新加载;
[root@yuioplvlinux-128 ~]# /usr/local/apache2/bin/apachectl -t
Syntax OK
[root@yuioplvlinux-128 ~]# /usr/local/apache2/bin/apachectl -M | grep expires
expires_module (shared)
[root@yuioplvlinux-128 ~]# /usr/local/apache2/bin/apachectl graceful
使用curl来测试效果;
[root@yuioplvlinux-128 ~]# curl -x192.168.30.128:80 aaa.com/2959d05a089225a9bcfeccb039a5fe62.jpg -I
HTTP/1.1 200 OK
Date: Wed, 30 May 2018 14:19:22 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
Last-Modified: Thu, 05 Apr 2018 05:45:54 GMT
ETag: "3cf5-5691373f0a880"
Accept-Ranges: bytes
Content-Length: 15605
Cache-Control: max-age=86400
Expires: Thu, 31 May 2018 14:19:22 GMT
Content-Type: image/jpeg
可以看到“Cache-Control: max-age=86400”这一行,说明jpg的图片将缓存86400秒,Date为当前时间,是GMT格式的;Expires为过期时间。
也可以在浏览器中查看,第一次打开浏览器访问,状态码是200;
重新刷新这个页面,状态码显示为304,表示页面数据未发生更新,从缓存中调用的内容。