访问日志不记录静态文件、配置访问日志切割、配置静态元素过期时间

一、访问日志不记录指定类型的文件
一个网站会有很多元素,尤其是图片、js、css等静态的文件非常多,用户每请求一个页面就会访问诸多的图片、js等静态元素,这些元素的请求都会被记录在日志中。如果一个站点访问量很大,那么访问日志文件增长会非常快,这不仅对于服务器的磁盘空间造成影响,更重要的是会影响磁盘的读写速度。实际上这些巨量的静态元素请求记录到日志里的意义并不大,所以可以限制这些静态元素去记录日志,并且需要把日志按天归档,一天一个日志,这样也可以防止单个日志文件过大。
1. 编辑虚拟主机配置文件
vim /usr/local/httpd2.4/conf/extra/httpd-vhosts.conf
2. 在配置文件里添加如下内容
    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
    SetEnvIf                设置匹配条件
    img                       定义的别名
    env=!img             排除别名是ima的项
    先定义一个img环境变量,把gif、jpg、png、bmp、swf、js、css等格式的文件全部归类到img里,后面的env=!imge有用到一个“!”,这相当于取反了,意思是把img以外的类型文件记录到日志里。
3. 配置完成后需要检查配置文件以及重新加载配置文件才会生效
/usr/local/httpd2.4/bin/apachectl -t
/usr/local/httpd2.4/bin/apachectl graceful

二、配置访问日志切割
Apache日志一直记录总有一天会把整个磁盘占满,所以有必要让它自动切割,并删除老的日志文件
1. 编辑虚拟主机配置文件
vim /usr/local/httpd2.4/conf/extra/httpd-vhosts.conf
2. 编辑Customlog这一行进行编辑
CustomLog "|/usr/local/httpd2.4/bin/rotatelogs -l logs/ 111.com -access_log_%Y%m%d.log 86400" combined env=!img
/usr/local/httpd2.4/bin/rotatelogs      这时apache自带的一个日志切割文件
-l      表示按照本机时间进行,如果不加那么表示使用UTC时间,中国使用的是CST时间
%Y%m%d.log 表示年月日,日志切割的时候后缀名会加上年月日,
86400 表示没过86400秒就切割一次,86400就是一天的时间
3. 配置完成后需要检查配置文件以及重新加载配置文件才会生效
/usr/local/httpd2.4/bin/apachectl -t
/usr/local/httpd2.4/bin/apachectl graceful

三、配置静态元素过期时间
我们知道在使用浏览器浏览网页时,浏览器会把网页资料快取(Cache)下来储存在本机端,用以加快下回浏览相同网页时不必再重新由网站上下载,进 而有加速的效果.使用mod_expires模组来加速网页浏览,这里所谓的”加速”,其实是利用”mod_expires”的功能,来设定网页文件的过 期时间,加长网页文件被浏览器快取(Cache)保存的时间.如此一来,只要网页文件的过期时间未到,浏览器就会引用快取的资料,而不用花时间再去下载网 站上的资料.另一方面带给站长的好处是,可以减少浏览者对网站的流量耗用(例如有些虚拟主机有限制网站可使用的流量)
1. 编辑虚拟主机配置文件
vim /usr/local/httpd2.4/conf/extra/httpd-vhosts.conf
2. 在配置文件中添加以下内容
   <IfModule mod_expires.c>
      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"
    </IfModule>
    内容说明:
    使用<IfModule></IfModule>来包夹指令可以避免在mod_expires模组没有启用的情况下还要去执行.如果mod_expires模组确定已经启用,那不写<IfModule></IfModule>也没关係.
    ExpiresActive on:    启用mod_expires功能,相对的Off就是关闭功能
    ExpiresByType :      ExpiresByType指令是依照不同的网页文件型态来做过期时间设定
    access :                 过期起算时间有三种,分别是access、now 以及modification.其中access与now意义相同,而modification指的是网页文件的”最后编辑时间”.所以如果要以档桉的最 后编辑时间起算,可以写成这样,”modification plus 10 days”.而时间的指定也很简单,就是英文单字(years、months、weeks、days、hours、minutes、seconds).例 如,可以写成这样,”access plus 1 month 15 days 2 hours”
 ExpiresDefault:    表示其它的设置默认,不用管

3. 检查expire模块是否打开,如果没有打开需要在Apache主配置文件中开启
    检查模块是否加载  
/usr/local/httpd2.4/bin/apachectl -M |grep expire   expires_module (shared)
    如果模块未加载,编辑主配置文件
vim /usr/local/httpd2.4/conf/httpd.conf
    搜索关键字:,找到这一行:
#LoadModule expires_module modules/mod_expires.so
    去掉前面的# 保存即可
4. 配置完成后需要检查配置文件以及重新加载配置文件才会生效
/usr/local/httpd2.4/bin/apachectl -t
/usr/local/httpd2.4/bin/apachectl graceful
5. 可以手动进行测试
[root@localhost 111.com ]# curl -x127.0.0.1:80 111.com/cc.jpg  -I        #测试为111.com下的cc.jpg
HTTP/1.1 200 OK
Date: Sun, 04 Mar 2018 17:36:43 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
Last-Modified: Mon, 21 Aug 2017 14:32:40 GMT                  #上一次访问时间
ETag: "54bcb-5574459d3d200"
Accept-Ranges: bytes
Content-Length: 347083
Cache-Control: max-age=86400                                             
Expires: Mon, 05 Mar 2018 17:36:43 GMT                               #过期的时间
Content-Type: image/jpeg


apache 日志中记录代理IP以及真实客户端
默认情况下log日志格式为:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
其中%h 是记录访问者的IP,如果在web的前端有一层代理,那么这个%h其实就是代理机器的IP,这不是我们想要的。在这种情况下,
%{X-FORWARDED-FOR}i  字段会记录客户端真实的IP。所以log日志改为:
LogFormat "%h %{X-FORWARDED-FOR}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

apache只记录指定URI的日志
我的需求是,把类似请求  www.aaa.com/aaa/... 这样的请求才记录日志。
在httpd.conf 或者 相关的虚拟主机配置文件中添加
SetEnvIf Request_URI "^/aaa/.*" aaa-request
CustomLog "|/usr/local/apache/bin/rotatelogs -l /usr/local/apache/logs/aaa-access_%Y%m%d.log 86400" combined env=aaa-request


apache的日志是可以自动切割的。
方法一: 使用 cronolog 为每一天建立一个新的日志
CustomLog "|bin/cronolog logs/access_%Y%m%d.log" combined
也可以按小时 
CustomLog "|bin/cronolog logs/access_%Y%m%d%h.log" combined
方法二:使用 rotatelogs 每一天记录一个日志
CustomLog "|bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined
每小时 
CustomLog "|bin/rotatelogs -l logs/access_%Y%m%d%H.log 3600" combined

再看apache rotatelogs语法
rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]
选项
-l
使用本地时间代替GMT时间作为时间基准。注意:在一个改变GMT偏移量(比如夏令时)的环境中使用-l会导致不可预料的结果。所以一定要加上-l 否则出现的日志时间和实际时间是相差8小时的。
logfile
它加上基准名就是日志文件名。如果logfile中包含”%”,则它会被视为用于strftime()的格式字符串;否则它会被自动加上以秒为单位的”.nnnnnnnnnn”后缀。这两种格式都表示新的日志开始使用的时间。
rotationtime
日志文件滚动的以秒为单位的间隔时间。
offset
相对于UTC的时差的分钟数。如果省略,则假定为”0″并使用UTC时间。比如,要指定UTC时差为”-5小时”的地区的当地时间,则此参数应为”-300″。
filesizeM
指定以filesizeM文件大小滚动,而不是按照时间或时差滚动。

apache日志记录客户端请求的域名
正常情况下,根本就没有必要记录这一项,毕竟大都根据虚拟主机来设置相应的访问日志,但也有个别的情况,比如
ServerName *.abc.com
这样泛解析的形式,所以有必要记录一下用户请求的域名到底是哪个。
而apache的LogFormat 中正好有一项值满足了这个需求。即 %V  这里是大写的V ,小写的v 记录的是咱们在虚拟主机中设置的ServerName ,这个的确是没有必要记录的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值