8月14

一、访问日志不记录指定类型的文件

一个网站会有很多元素,尤其是图片、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 ,这个的确是没有必要记录的。

转载于:https://my.oschina.net/u/3869429/blog/1928002

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值