Nginx访问日志(access_log)实践指南

原创 陈宝佳  2019-03-16 09:34  阅读 8 次 评论 0 条
行云管家,新手有礼

一、Nginx访问日志介绍

Nginx软件会把每个用户访问网站的日志信息记录到指定的日志文件里,供网站提供者分析用户的浏览行为等,此功能由ngx_http_log_module模块负责。

1、访问日志参数

Nginx的访问日志主要是两个参数控制的。

参数:

log_format:用来定义记录日志的格式(可以定义多种日志格式,取不同名字即可)

access_log:用来指定日志文件的路径及使用何种日志格式记录日志

Nginx日志格式中默认的参数配置如下:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'

Nginx记录日志的默认参数配置如下:

access_log  logs/access.log  main

2、访问日志配置说明

1)日志格式的定义说明

先看看其语法:

定义语法    log_format name string ...;

其配置位置在http标签内。

日志格式说明如下:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'

其中,log_format为日志格式关键参数,不能变。

main是为日志格式指定的标签,记录日志时通过这个main标签选择指定的格式。其后所接的所有内容都是可以记录的日志信息,具体见表5-5。注意,所有的日志段以空格分隔,一行可以记录多个,不同列的意义也在表5-5中进行了说明。

表5-5 Nginx日志变量说明

Nginx 日志变量 说明
$remote_addr: 记录访问网站的客户端地址
$http_x_forwarded_for: 当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器上也进行了相关的x_forwarded_for设置
$remote_user: 远程客户端用户名称
$time_local: 记录访问时间与时区
$request: 用户的http请求起始行信息
$status: http状态码,记录请求返回的状态,例如:200、404、301等
$body_bytes_sents: 服务器发送给客户端的响应body字节数
$http_referer: 记录此请求是从哪个链接访问过来的,可以根据referer进行防盗链设置
$http_user_agent: 记录客户端访问信息,例如:浏览器,手机客户端等。

在没有特殊要求的情况下,采用默认的配置即可,更多可以设置的记录日志信息的变量。

2)记录日志的access_log参数说明

下面是有关access_log参数的官方说明。

语法如下:

access_log path [format [buffer=size [flush=time]] [if=condition]]
access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition]
access_log syslogserver=address[parameter=value] [format [if=condition]]

参数解释:


buffer=size	# 为存放访问日志的缓冲区大小,

flush=time	# 为将缓冲区的日志刷到磁盘的时间,

gzip[=level]	# 表示压缩级别,

[if=condition]	# 表示其他条件。

一般的场景中,这些参数都无须配置,极端优化时才可能会考虑这些参数。

access_log off中的off,表示不记录访问日志。

默认配置:access_log logs/access.log combined;

放置位置在http、server、location、if in location、limit_except中。

二、访问日志配置实战

编辑主配置文件nginx.conf配置日志的格式如下:

[root@Cloudbility conf]# sed -n '2123 s/#//gp' nginx.conf.default
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'

把上述内容放到nginx.conf的http标签的首部,如下:

[root@Cloudbility conf]# cat -n nginx.conf
     1worker_processes  1
     2error_log  logs/error.log
     3events {
     4    worker_connections  1024
     5}
     6http {
     7    include       mime.types
     8    default_type  application/octet-stream
     9    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    10                    '$status $body_bytes_sent "$http_referer" '
    11                    '"$http_user_agent" "$http_x_forwarded_for"'
    12    sendfile        on
    13    keepalive_timeout  65
    14include extra/www.conf
    15include extra/bbs.conf
    16include extra/blog.conf
    17include extra/status.conf
    18}

然后在每个虚拟主机里进行配置,使其使用上述格式记录用户访问日志。以www.cloudbility.com站点为例,命令如下:

[root@Cloudbility conf]# cat extra/www.conf 
    server {
        listen       80;
        server_name  www.cloudbility.com cloudbility.com;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        access_log logs/access_www.log main;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

如果不指定日志格式就会用默认的combined格式记录日志。

接下来,要检查语法,重新加载配置,命令如下:

[root@Cloudbility conf]# ../sbin/nginx -t
nginx: the configuration file /application/nginx-1.6.3//conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.6.3//conf/nginx.conf test is successful

[root@Cloudbility conf]# ../sbin/nginx -s reload

下面用浏览器模拟用户访问生成日志,在服务器上查看日志结果,命令如下:

[root@Cloudbility conf]# curl www.Cloudbility.com
http: //www.Cloudbility.com

[root@Cloudbility conf]# ls -l ../logs/access_www.log 
-rw-r--r-- 1 root root 186 Feb  3 17:00 ../logs/access_www.log

[root@Cloudbility conf]# curl www.Cloudbility.com
http: //www.Cloudbility.com

[root@Cloudbility conf]# tail -1 ../logs/access_www.log 
10.0.0.8 - - [03/Feb/2017:17:01:07 +0800] "GET / HTTP/1.1" 200 26 "-"  "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-"

使用谷歌浏览器访问的日志结果如下:

[root@Cloudbility conf]# tail -5 ../logs/access_www.log 
10.0.0.8 - - [03/Feb/2017:17:00:20 +0800] "GET / HTTP/1.1" 200 26 "-"  "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-"

10.0.0.8 - - [03/Feb/2017:17:01:07 +0800] "GET / HTTP/1.1" 200 26 "-"  "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-"

10.0.0.1 - - [03/Feb/2017:17:02:26 +0800] "GET / HTTP/1.1" 304 0 "-"  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36" "-"

我们可以根据生成的日志对比上述log_format的日志格式,看是否对应。

定义的日志格式如下:

'$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'

真实的日志内容如下:

10.0.0.1 - - [03/Feb/2017:17:02:26 +0800] "GET / HTTP/1.1" 304 0 "-"  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36" "-"

对应说明如下:

·$remote_addr 对应的是真实日志里的10.0.0.1,即客户端的IP。

·$remote_user 对应的是第二个中杠“-”,没有远程用户,所以用“-”填充。

·[$time_local] 对应的是[05/Apr/2015:12:16:00+0800]。代表访问的日期和时间。

·"$request" 对应的是"GET/HTTP/1.1"。GET ——代表访问的方法

·$status 对应的是200状态码,200表示正常访问。304 ——304返回码。这里表示客户端已经执行了GET,但文件未变化

·$body_bytes_sent 对应的是25字节,即响应body的大小。

·"$http_referer" 对应的是"-",由于是直接打开域名浏览的,因此,referer没有值。

·"$http_user_agent" 对应的是"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"

·"$http_x_forwarded_for" 对应的是"-",因为Web服务没有使用代理,因此此处为"-"。


下面针对日志配置进行深入说明

可以在记录日志参数中加上buffer和flush选项,这样可在高并发场景下提升网站访问性能。加该选项的命令如下:

access_log path [format [buffer=size [flush=time]] [if=condition]]
access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition]
access_log syslogserver=address[parameter=value] [format [if=condition]]
access_log off

具体配置如下:

[root@Cloudbility conf]# cat extra/www.conf
    server {
        listen       80;
        server_name  www.cloudbility.comc cloudbility.com;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        #access_log logs/access_www.log main;
        access_log logs/access_www.log main gzip buffer=32k flush=5s;
    	#access_log off;
	    error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

三、Nginx询问日志轮询切割

默认情况Nginx会把所有的访问日志生成到一个指定的访问日志文件access.log里,但这样一来,时间长了就会导致日志个头很大,不利于日志的分析和处理,因此,有必要对Nginx日志、按天或按小时进行切割,使其分成不同的文件保存。这里使用按天切割的方法。

具体切割脚本如下:

[root@Cloudbility logs]# cat /server/scripts/cut_nginx_log.sh
#/bin/sh
Dateformat=`date +%Y%m%d`
Basedir="/application/nginx"
Nginxlogdir="$Basedir/logs"
Logname="access_www"
[ -d $Nginxlogdir ] && cd $Nginxlogdir||exit 1
[ -f ${Logname}.log ]||exit 1
/bin/mv ${Logname}.log ${Dateformat}_${Logname}.log
$Basedir/sbin/nginx -s reload

注意:脚本实现切割Nginx日志的思想为将正在写入的Nginx日志(access_www.log)改名为带日期的格式文件(20150417_access_www.log),然后平滑重新加载Nginx,生成新的Nginx日志(access_www.log)。

下面通过定时任务实现每天00点整定时执行/server/script/cut_nginx_log.sh切割日志。

操作命令如下:

cat >>/var/spool/cron/root << EOF
#cut nginx access log by oldboy
00 00 * * * /bin/sh /server/scripts/cut_nginx_log.sh >/dev/null 2>&1
EOF

操作后结果如下:

[root@Cloudbility logs]# crontab -l
#time sync by oldboy at 2010-2-1
*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
#cut nginx access log by oldboy
00 00 * * * /bin/sh /server/script/cut_nginx_log.sh >/dev/null 2>&1

最终日志切割效果如下:

[root@Cloudbility conf]# ll ../logs/
total 28
-rw-r--r-- 1 root root    0 Feb  3 17:41 20170203_access_www.log
-rw-r--r-- 1 root root 8970 Feb  3 10:42 access.log
-rw-r--r-- 1 root root    0 Feb  3 17:43 access_www.log
-rw-r--r-- 1 root root 9011 Feb  3 17:43 error.log
-rw-r--r-- 1 root root    5 Feb  2 20:26 nginx.pid

Nginx常用的日志收集及分析工具有rsyslog、awstats、flume、ELK(Elasticsearch logstash Kibana)、storm等。

(完)

本文地址:https://www.cloudbility.com/club/10202.html
关注我们:请关注一下我们的微信公众号:扫描二维码,公众号:cloudbility
版权声明:本文为原创文章,版权归 陈宝佳 所有,欢迎分享本文,转载请保留出处!

发表评论


表情