• nginx访问日志(access_log)


    一、nginx访问日志介绍

    nginx软件会把每个用户访问网站的日志信息记录到指定的日志文件里,供网站提供者分析用户的浏览行为等,此功能由ngx_http_log_module模块负责,对应的官方地址为:http://nginx.org/en/docs/http/ngx_http_log_module.html.

    二、访问日志参数

     nginx的访问日志主要有以下2个参数控制

    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;
    

     三、访问日志配置说明

    日志格式的定义说明

     语法如下:

    定义语法    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标签选择指定的格式。其后所接的所有内容都是可以记录的日志信息,所有的日志段以空格分割,一行可以记录多个。不同列的意义如下:

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

     在没有特殊要求的情况下,采用默认的配置即可,更多可以设置的记录日志信息的变量见:http://nginx.org/en/docs/http/ngx_http_log_module.html

    记录日志的access_log参数说明

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

    语法如下:

    access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
    
    access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition];
    
    access_log syslog:server=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@nginx conf]# sed -n '21,23 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@nginx conf]# cat nginx.conf
    worker_processes  1;
    error_log	logs/error.log	error;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        sendfile        on;
        keepalive_timeout  65;
    include extra/dmtest1.conf;
    include extra/dmtest2.conf;
    include extra/dmtest3.conf;
    }
    

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

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

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

    检查语法重新加载配置文件:

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

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

    [root@nginx conf]# curl www.dmtest1.com
    www.dmtest1.com
    
    [root@nginx conf]# ls -l ../logs/access_dmtest1.log 
    -rw-r--r-- 1 root root 95 8月  27 06:24 ../logs/access_dmtest1.log
    
    [root@nginx conf]# tail -1 ../logs/access_dmtest1.log 
    192.168.200.102 - - [27/Aug/2018:06:24:36 +0800] "GET / HTTP/1.1" 200 16 "-" "curl/7.29.0" "-"
    

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

    [root@nginx conf]# tail -10  ../logs/access_dmtest1.log 
    192.168.200.1 - - [27/Aug/2018:06:36:58 +0800] "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" "-"
    

     日志格式和日志内容对应说明如下:

    $remote_addr	对应的是真实日志里的192.168.200.1,即客户端的IP。
    
    $remote_user	对应的是第二个中杠"-",没有远程用户,所以用"-"填充。
    
    [$time_local	对应的是[27/Aug/2018:06:36:58 +0800]。
    
    "$request"	对应的是"GET/HTTP/1.1"。
    
    $tatus	对应的是200状态码,200表示正常访问。
    
    $body_bytes_sent	对应的是16字节,即响应body的大小。
    
    "$http_referer"		对应的是"-",由于是直接打开域名浏览的,因此,referer没有值。
    
    $http_user_agent	对应的是"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
    
    "$http_x_forwarded_for"	对应的是"-",因为web服务没有使用代理,因此此处为"-"
    

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

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

    access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
    
    access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition];
    
    access_log syslog:server=address[,parameter=value] [format [if=condition]];
    
    access_log off;
    

    具体配置如下:

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

     五、nginx访问日志轮训切割

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

    具体切割脚本如下:

    [root@nginx shell]# cat cut_nginx_log.sh 
    #!/bin/bash
    #Author:Mr.Ding
    #Created Time:2018-08-27 07:19:30
    #Name:cut_nginx_log.sh
    #Description:
    Dateformat=`date +%Y%m%d`
    Basedir="/application/nginx"
    Nginxlogdir="$Basedir/logs"
    Logname="access_dmtest1"
    [ -d $Nginxlogdir ] && cd $Nginxlogdir || exit 1
    [ -f ${Logname}.log ] || exit 1
    /bin/mv ${Logname}.log ${Dateformat}_${Logname}.log
    #$Basedir/sbin/nginx -s reload
    systemctl reload nginx
    

     脚本实现切割nginx的思想为将正在写入的nginx日志(access_dmtest1.log)改名为带日期的格式文件(20180827_access_dmtest1.log),然后平滑重新加载nginx,生成新的nginx日志(access_dmtest1.log)。

    把脚本加入计划任务:

    [root@nginx shell]# cat >>/var/spool/cron/root << EOF
    > #cut ngixn access log by dm 2018-8-27
    > 00 00 * * * /bin/sh /server/scripts/shell/cut_nginx_log.sh >/dev/null 2&1
    > EOF
    [root@nginx shell]# crontab -l
    #time sync by dm at 2018-8-20
    */5 * * * * /usr/sbin/ntpdate -u ntp.api.bz >/dev/null 2>$1
    #cut ngixn access log by dm 2018-8-27
    00 00 * * * /bin/sh /server/scripts/shell/cut_nginx_log.sh >/dev/null 2&1
    

    最终日志切割效果如下:

    [root@nginx logs]# ll
    总用量 32
    -rw-r--r-- 1 root root     0 8月  27 07:35 20180827_access_dmtest1.log
    -rw-r--r-- 1 root root     0 8月  27 07:35 access_dmtest1.log
    -rw-r--r-- 1 root root 14076 8月  27 04:41 access.log
    -rw-r--r-- 1 root root 10098 8月  27 06:36 error.log
    -rw-r--r-- 1 root root     5 8月  26 21:56 nginx.pid
    
  • 相关阅读:
    GlusterFS安装部署
    glusterfs peer失败
    GlusterFs 启动报错
    利用idea反编译jar包
    hive 错误记录 之moveing 失败
    节点不可用,显示noReady
    kafka 配置认证与授权
    flink (2) 读取kafka数据
    Flink (1) 安装部署
    redis the cluster is down
  • 原文地址:https://www.cnblogs.com/Mr-Ding/p/9539867.html
Copyright © 2020-2023  润新知