Apache日志相关优化

Apache 的VirtualHost中日志的配置默认是这样的

        ErrorLog {APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
在默认配置下,用不了几天,log文件就会变的巨大,难以检索,并占用你的磁盘空间,我遇到过多次log文件塞满磁盘导致Apache无法处理请求的情况。 我会用以下方式对Apache的日志做配置优化 1. 让log按照日期来存储 这里要用到rotatelogs,它的功能就是实现Apache Log的管道重定向,可以直接运行看机器上是否有这个命令,如果没有看看apache的bin目录中是否有,总之找到它的完整路径。 将上面的那两行改为:
        ErrorLog "|/usr/sbin/rotatelogs ${APACHE_LOG_DIR}/error_%Y%m%d.log 86400 480"
        CustomLog "|/usr/sbin/rotatelogs ${APACHE_LOG_DIR}/access_%Y%m%d.log 86400 480" combined
其中86400是指86400秒,正好是1天,表示按照1天的间隔来存储日志。 其中480表示offset,正好8小时,表示UTC+8和标准时间的偏移量。 2. 过滤不必要的日志 日志中一般都没必要记录那些静态的资源文件请求,比如图片、js等,将这些过滤之后能大幅减少日志记录行数。 首先要保证一个叫 setenvif 的mod已经安装并enable,然后在VirtualHost的配置文件中
# ignore the status check request
<FilesMatch ".(ico|gif|jpg|png|bmp|swf|jpge)">
SetEnv dontlog 1
</FilesMatch>
SetEnvIfNoCase Request_URI /test.html dontlog
SetEnvIf User-Agent "(internal dummy connection)" dontlog
其作用依次是过滤各种类型的图片请求;过滤一个叫test.html的请求,因为这是我的host状态检查页面;最后一行是过滤 apache内部自动产生的请求记录; 每行最后的dontlog 表示一个变量,这些过滤器的信息存储在这个变量中。 然后在CustomLog 行尾添加 env=!dontlog
CustomLog "|/usr/sbin/rotatelogs ${APACHE_LOG_DIR}/900pix/blog_access_%Y%m%d.log 86400 480" combined env=!dontlog
  1. 快速查看访问次数最多的用户

    tail -40000 access.log |awk '{print $1}'| sort | uniq -c |sort -n
    

    如果发现有异常访问,可以结合iptables做屏蔽防护