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_referer | referer |
$http_user_agent | user_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/;