Table of Contents

 

一、Nginx状态信息功能实战

二、Nginx错误日志的配置

三、Nginx访问日志

四、Nginx访问日志轮询切割


一、Nginx状态信息功能实战

1、检测是否安装status模块

[root@server html]# nginx -V
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
configure arguments: --with-http_stub_status_module --add-module=echo-nginx-module-0.61

有这个--with-http_stub_status_module就对了

2、注意事项

如果你没有这个模块,则需要增加这个模块,具体增加方式请看:


注意:增加完模块一定记得用ps -ef查看nginx进程,看是否是新的添加了status模块的nginx在启动,如果是nginx.bak在启动,

则kill  -QUIT这个进程,再删两个配置文件,再nginx -s stop ,再nginx启动。不要用nginx -s reload ,因为这样还是会启动nginx.bak。我就是因为没看启动的是旧的nginx,所以查看信息一直没成功。

3、为一个虚拟主机配置status

server {
        listen       80;
        server_name  www.xixi.com;
        location /nginx.status{
            stub_status on;        //开启状态信息开关
            access_log off;        //因为只允许本机访问,所以不用开启访问日志
            allow 172.16.193.154;  //172.16.193.154这个ip地址是本机ip,只允许本机访问这个页面
            deny all;              //拒绝所有人访问这个页面,因此allow要放在deny前面
        }
        location /{
            root html;
            index xixi.html;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

注意:在配置状态信息时,一定要避免被外部用户访问,最好在一个虚拟主机中单独用一个location区块配置状态信息并限制访问的ip。

 

3、状态信息的查看

[root@server html]# curl www.xixi.com/nginx.status
Active connections: 1            //表示Nginx正在处理的活跃的链接数
server  accepts   handled requests
   5       5             5 
Reading: 0 Writing: 1 Waiting: 0 

//第一个server:表示nginx启动到现在共处理了5个链接
//第二个accepts:表示启动到现在共成功创建了5次握手
//第三个handled requests:表示共处理了5次请求

二、Nginx错误日志的配置

1、错误日志的级别

debug:基本什么都会记录进错误日志。

info:仅是一些基本的讯息说明而已;

notice:比 info 还需要被注意到的一些信息内容;

warn:警示讯息,可能有问题,但是还不至于影响到某个 daemon 运作。

error :一些重大的错误讯息,这就要去找原因了。

crit:比 error 还要严重的错误信息,crit 是临界点 (critical) 的缩写,已经很严重了!

alert:警告警告,已经很有问题的等级,比 crit 还要严重!

emerg :疼痛等级,意指系统已经几乎要当机的状态! 很严重的错误信息了。

注意:生产场景一般都是warn|error|crit这三个级别之一。

2、编辑主配置文件nginx.conf,增加错误日志的配置方法:

读取5分钟内nginx错误日志的脚本_读取5分钟内nginx错误日志的脚本

注意:一般错误日志都配置为warn就好。logs/error.log这个其实是指定了错误日志的存储路径。

三、Nginx访问日志

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

1、访问日志参数

(1)Nginx日志格式中默认的参数配置:

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可以这样理解:为后面所有定义的格式起一个名字,方便Nginx记录日志对格式进行引用。

(2)Nginx记录日志的默认参数配置:

access_log  logs/access.log  main;

注意:上面这句话指定了访问日志的文件名及其路径,该日志文件引用了那种日志格式。如果没有指定日志文件引用了那种日志格式,则采用默认格式combined。

 

2、Nginx日志变量说明

读取5分钟内nginx错误日志的脚本_nginx_02

3、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 syslog:server=address[,parameter=value] [format [if=condition]];
access_log off;  //不记录日志

buffer=size:为存放访问日志的缓冲区大小
flush=time:为将缓冲区的日志刷到磁盘的时间
gzip[=level]:表示压缩级别
[if=condition]:表示其他条件

注意:一般的场景中以上的参数都无需配置,除非极端优化才可能会考虑这些参数

access_log指令的配置段支持:http, server, location, if in location, limit_except

日志格式默认为combined

4、访问日志配置实战

(1)查看主配置文件中的日志配置

读取5分钟内nginx错误日志的脚本_nginx_03

(2)用客户端对其进行访问,再查看日志

[root@server html]# tail -1 ../logs/access.log
172.16.193.1 - - [08/Nov/2019:20:00:45 +0800] "GET / HTTP/1.1" 200 13 "-" "Mozilla/5.0 (Macintosh; Intel
 Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.2 Safari/605.1.15"

根据前面的Nginx日志变量,我们可以分析一下这个日志:

⭕️$remote_addr              //对应的是真实日志里的172.16.193.1,即客户端的IP,参考解释理解
⭕️$remote_user              //对应的是第二个中杠"-",代表没有远程用户
⭕️[$time_local]             //对应的是[08/Nov/2019:20:00:45 +0800],代表请求发起时间
⭕️"$request"                //对应的是"GET / HTTP/1.1"
⭕️$status                   //对应的是200状态码,表示正常访问
⭕️$body_bytes_sent          //对应的是13,代表响应body的大小为13字节
⭕️"$http_referer"           //对应"-" ,由于是打开域名浏览的,一次refer无值

⭕️"$http_user_agent"        //对应的是"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 
(KHTML, like Gecko) Version/13.0.2 Safari/605.1.15"这里显示了你使用的浏览器的信息

⭕️"$http_x_forwarded_for"   //对应的是"-" ,因为Web服务未使用代理,所以为"-"

解释:下面是我电脑的各个主要接口的ip:

shijianhundeMBP:~ shijiandingyiqingchun$ ifconfig
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
     options=400<CHANNEL_IO>
     ether a4:5e:60:ba:bd:51
     inet6 fe80::10ba:bc95:e586:34e5%en0 prefixlen 64 secured scopeid 0x4
     inet 192.168.43.159 netmask 0xffffff00 broadcast 192.168.43.255
     nd6 options=201<PERFORMNUD,DAD>
     media: autoselect
     status: active
vmnet1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
     ether 00:50:56:c0:00:01
     inet 192.168.17.1 netmask 0xffffff00 broadcast 192.168.17.255
vmnet8: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
     ether 00:50:56:c0:00:08
     inet 172.16.193.1 netmask 0xffffff00 broadcast 172.16.193.255

vmnet 8是NAT,我配置的虚拟机选取的就是NAT模式,所以返回的就是上面的172.16.193.1。有人可能会认应该是en0接口的IP才对,你要想和虚拟机进行交流和建立桥梁的是vmnet 8,所以虚拟机只知道一个vmnet 8的IP,所以不是en0接口。

四、Nginx访问日志轮询切割

1、shell脚本实现

2、logrotate工具实现