11月16日任务
11.22 访问日志不记录静态文件
11.23 访问日志切割
11.24 静态元素过期时间
 
 

访问日志不记录静态文件

为什么要这样设置

网站大多为静态网页,网页内部的图片、css文件等同样有其网址链接,如果不设置,这些无效的信息也将被存入访问日志中,会导致访问日志文件大小快速增加,占用大量存储空间。我们可以通过设置不记录某些文件来减少无效信息,节省内存资源。

如何设置

修改虚拟主机配置文件httpd-vhost.conf

[root@localhost 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
...

# 重启服务,使配置生效
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost logs]# /usr/local/apache2.4/bin/apachectl graceful

效果验证

# 访问包含.jpg等的路径,访问日志不会记录;访问其他则被记录
[root@localhost ~]# 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文件访问记录!
[root@localhost ~]# 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去掉(记得重启服务!!),看是否会记录

# 修改配置并重启访问
[root@localhost logs]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl graceful

# 重新测试
[root@localhost ~]# 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

# 查看是否记录
[root@localhost ~]# 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"

访问日志切割

就算不记录某些无效信息,随之服务器的运行,访问日志文件大小也将会不断变大,通过设置日志文件自动切割以及一段时间后删除旧的日志就变得较为必要。

如何设置

修改虚拟主机配置文件

[root@localhost 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
...

[root@localhost logs]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost logs]# /usr/local/apache2.4/bin/apachectl graceful

效果测试

查看是否生成新格式的日志文件

[root@localhost ~]# curl -x 127.0.0.1:80 111.com/111.php
abc.com

# logs目录下已经产生当天格式的访问日志
[root@localhost ~]# 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命令,可以实现。

[root@localhost ~]# 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模块

[root@localhost logs]# vim /usr/local/apache2.4/conf/httpd.conf
// 添加expire模块,删除行首的#
#LoadModule expires_module modules/mod_expires.so

// 查看expire模块是否已加载,没有的话要修改httpd.conf文件去加载
[root@localhost logs]# /usr/local/apache2.4/bin/apachectl -M | grep expire
 expires_module (shared)

在虚拟主机配置文件内增加如下配置

[root@localhost 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>
...

重新加载配置文件

[root@localhost logs]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost logs]# /usr/local/apache2.4/bin/apachectl graceful

效果验证

  • 指定类型(png)的文件访问信息
#
# 设置后的状态信息中出现Cache-Control、Expires等信息
[root@localhost 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
[root@localhost ~]# 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
11-17 03:16