LAMP架构之访问日志的设置及切割、静态文件失效设置

Wesley13
• 阅读 616

本文索引

  • 访问日志不记录静态文件
  • 访问日志切割
  • 静态文件过期时间

访问日志不记录静态文件

为什么要这样设置

网站大多为静态网页,网页内部的图片、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: Thu, 21 Dec 2017 11:19:25 GMT
Server: Apache/2.4.28 (Unix) PHP/5.6.30
Last-Modified: Thu, 21 Dec 2017 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 - - [21/Dec/2017: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: Thu, 21 Dec 2017 11:22:38 GMT
Server: Apache/2.4.28 (Unix) PHP/5.6.30
Last-Modified: Thu, 21 Dec 2017 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 - - [21/Dec/2017: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: Mon, 20 Nov 2017 13:22:07 GMT Server: Apache/2.4.28 (Unix) PHP/5.6.30 Last-Modified: Wed, 01 Nov 2017 13:48:33 GMT ETag: "23e28-55cec20a0ce40" Accept-Ranges: bytes Content-Length: 146984 Cache-Control: max-age=86400 //该时间等于Expires-Date Expires: Tue, 21 Nov 2017 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: Thu, 21 Dec 2017 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: Thu, 21 Dec 2017 12:03:44 GMT Content-Type: text/html; charset=UTF-8


点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
LNMP架构之访问日志、日志切割、静态文件不记录及过期时间设置
本文索引:Nginx访问日志Nginx日志切割静态文件不记录日志和过期时间Nginx访问日志修改nginx配置文件root@localhostvhostvim/usr/local/nginx/conf/nginx.conf搜索:/log_format
Stella981 Stella981
3年前
LAMP架构之php禁止解析、user_agent限定及php配置文件常规设置
本文索引:禁止某目录PHP解析限制user\_agentPHP相关配置查看PHP配置文件的位置安全函数设定设置时区错误信息日志安全相关的参数禁止某目录PHP解析某些目录可以上传图片等文件,如果不设置禁止PHP
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Logstash收集nginx访问日志和错误日志
1、收集访问日志1)、首先是要在nginx里面配置日志格式化输出log_formatmain"$http_x_forwarded_for|$time_local|$request|$status|$body_bytes_sent|$request_body|$content_length|$http_ref
Stella981 Stella981
3年前
Linux日志安全分析技巧
0x00前言我正在整理一个项目,收集和汇总了一些应急响应案例(不断更新中)。GitHub地址:https://github.com/Bypass007/EmergencyResponseNotes本文主要介绍Linux日志分析的技巧,更多详细信息请访问Github地址,欢迎Star。0x01日志简介Lin
Wesley13 Wesley13
3年前
Apache优化——日志管理 11.22 访问日志不记录静态文件 11.23 访问日志切割 11.24 静态元素过期时间
11.22访问日志不记录静态文件网站大多元素为静态文件,如图片、css、js等,这些元素可以不用记录编辑虚拟主机配置文件“httpdvhosts.conf”:root@cham002~vim/usr/local/apache2.4/conf/extra/httpdvhosts.conf
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究