Nginx访问日志

1. 日志配置

在Nginx的配置文件中:

……省略一些配置……

# 这个是Nginx的日志,已经定义了日志文件的存放路径
error_log /usr/local/nginx/logs/nginx_error.log crit;
……省略一些配置……

http {
……省略一些配置……

    # 这个是网站日志的格式,可以自行调节先后顺序进行排版
    log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
    ' $host "$request_uri" $status'
    ' "$http_referer" "$http_user_agent"';

……省略一些配置……
}

参数说明:

参数释义
$remote_addr客户端IP(公网IP)
$http_x_forwarded_for代理服务器的IP
$time_local服务器本地时间
$host访问主机名(域名)
$request_uri访问的url地址
$status状态码
$http_refererreferer
$http_user_agentuser_agent

然后在虚拟主机配置文件中配置:

server
{
    listen 80;
    server_name www.example.com www.123.com;
    index index.html index.htm index.php;
    root /data/www/example;
    # 定义日志文件的存放位置
    access_log /tmp/1.log combined_realip;
}

2. 日志切割

Nginx的日志不像httpd那样,自带切割工具,所以对于Nginx来说只能自定义切割脚本:

#! /bin/bash
## 假设nginx的日志存放路径为/data/logs/
d=`date -d "-1 day" +%Y%m%d` 
logdir="/data/logs"
nginx_pid="/usr/local/nginx/logs/nginx.pid"
cd $logdir
for log in `ls *.log`
do
    mv $log $log-$d
done
/bin/kill -HUP `cat $nginx_pid`

把脚本添加到任务计划,使其自动切割:

0 0 * * * /bin/bash /usr/local/sbin/nginx_log_rotate.sh

3. 静态元素不记录日志并添加过期时间

访问一些图片等信息是不需要记录日志的,在虚拟主机配置文件中这样配置:

server
{
    listen 80;
    server_name www.example.com;
    index index.html index.htm index.php;
    root /data/www/example;
    # 定义静态元素的类型
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
    {
        # 过期时间
        expires      7d;
        # 关闭日志记录
        access_log   off;
    }
}

4. 防盗链

设么是防盗链?

假如把别人网站上的一段视频或一张图片,复制链接,然后放在自己的网站上,用户来自己网站访问这些内容的时候,承受负担和流量的是别人的服务器。

在HTTP协议中,有一个表头字段叫referer,使用URL格式来表示从哪里来的链接到当前网页的资源。这里要用到的HTTP referer是header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上referer,告诉我服务器我是从哪个页面链接过来的。

通过它,可以检测目标访问的来源网页,如果是资源文件,可以跟踪到显示它的网页地址,一旦检测出来不是本站,马上执行阻止或者返回指定图片、错误信息等。虽然配置防掉链可以防止别人盗取网站的内容,但是这个Referer很容易仿造,因此,使用这个模块的目的不是100%阻止这些请求,而是阻止来自典型浏览器的大量请求。

在虚拟主机配置文件中,防盗链可以和上面的配置结合起来:

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
    {
        expires    7d;
        access_log off;
        # 这里定义白名单
        valid_referers none blocked *.example.com ;
        # 条件语句
        if ($invalid_referer) {
            return 403;
        }
    }

参数说明:

  • valid_referers:用来获取Referer头域中的值;
  • none:表示空的来路,也就是直接访问,比如直接在浏览器打开一个图片;
  • blocked:表示被防火墙标记过的来路。如果Referer头域中没有符合valid_referers指令后面配置的值,$invalid_referer变量将会被赋值为1,然后执行if语句。
  • f{}:里面内容的意思是,如果来路不是指定来路就跳转到403错误页面。当然直接返回404也是可以的,也可以是图片,也可以像这样定义直接跳转到一个地址:
        rewrite ^/ http://server_names/;

标签: web, 优化

添加新评论