03 . Nginx日志配置及日志切割

Nginx日志

日志对于统计排错来说是非常有利的,Nginx日志主要分为两种: access_log(访问日志)和error_log(错误日志),通过访问日志可以得到用户的IP地址、浏览器的信息,请求的处理时间等信息。错误日志记录了访问出错的信息,可以帮助我们定位错误的原因。

设置Access_log日志

访问日志主要记录客户端的请求。客户端向Nginx服务器发起的每一次请求都记录在这里。客户端IP,浏览器信息,referer,请求处理时间,请求URL等都可以在访问日志中得到。当然具体要记录哪些信息,你可以通过log_format指令定义。

语法
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; # 设置访问日志
access_log off; # 关闭访问日志

# path 指定日志的存放位置。
# format 指定日志的格式。默认使用预定义的combined。
# buffer 用来指定日志写入时的缓存大小。默认是64k。
# gzip 日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1。
# flush 设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空。
# if 条件判断。如果指定的条件计算为0或空字符串,那么该请求不会写入日志。
# 另外,还有一个特殊的值off。如果指定了该值,当前作用域下的所有的请求日志都被关闭。
作用域

可以应用access_log指令的作用域分别有http,server,location,limit_except,也就是说,这几个作用域使用该命令,Nginx会报错

基本用法

access_log /usr/local/nginx/logs/b_test/access.log;

该例子指定日志的写入路径为/usr/local/nginx/logs/b_test/access.log,日志格式使用默认的combined

log_format指令
# Nginx预定义了名为combined日志格式,如果没有明确指定日志格式默认使用该格式:
# 如果想使用自定义格式,可以使用log_format自定义

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

# 语法:
# log_format name [escape=default|json] string ...;
        
name:               # 表示格式名称,在access_log指令中引用
string:             # 要定义的日志格式内容,该参数可以有多个,参数中可以使用Nginx变量
log_format:         # 有默认的无需设置的combined日志格式,相当于apache的combined格式,日志格式如下.
escape:				# 设置变量中的字符编码方式是json还是default,默认是default
log_format combined '$remote_addr - $remote_user [$time_local] '
                    ' "$request" $status $body_bytes_sent '
                    ' "$http_referer" "$http_user_agent" ';

#如果Nginx位于负载均衡器,squit,nginx反向代理之后,web服务器无法直接获取到客户端真实的IP地址。
#而此时$remote_addr 获取的是反向代理的IP地址.
#反向代理服务器在转发请求的http头信息中,可以增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的IP服务器地址.日志格式如下:

log_format porxy '$http_x_forwarded_for - $remote_user [$time_local] '
                 ' "$request" $status $body_bytes_sent '
                 ' "$http_referer" "$http_user_agent" ';

下面是log_format指令常用的一些变量

变量 含义
$bytes_sent 发送给客户端的总字节数
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小
$connection 连接序列号
$connection_requests 当前通过连接发出的请求数量
$msec 日志写入时间,单位为秒,精度是毫秒
$pipe 如果请求是通过http流水线发送,则其值为"p",否则为“."
$request_length 请求长度(包括请求行,请求头和请求体)
$request_time 请求处理时长,单位为秒,精度为毫秒,从读入客户端的第一个字节开始,直到把最后一个字符发送张客户端进行日志写入为止
$status 响应状态码
$time_iso8601 标准格式的本地时间,形如“2017-05-24T18:31:27+08:00”
$time_local 通用日志格式下的本地时间,如"24/May/2017:18:31:27 +0800"
$http_referer 请求的referer地址。
$http_user_agent 客户端浏览器信息。
$remote_addr 客户端IP
$http_x_forwarded_for 当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置。
$request 完整的原始请求行,如 "GET / HTTP/1.1"
$remote_user 客户端用户名称,针对启用了用户认证的请求
$request_uri 完整的请求地址,如 "https://daojia.com/"

Nginx日志分析

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
 '$status $body_bytes_sent "$http_referer" '  
 '"$http_user_agent" "$http_x_forwarded_for"';  
  
日志条目:  
117.107.143.155 - - [01/Nov/2019:16:29:39 +0800] "GET /favicon.ico HTTP/1.1" 404 555   
"http://39.108.140.0/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/78.0.3904.17 Safari/537.36" "-"  

# Nov,是Novemenber(11)月的缩写  
# Feb是February(2)月的缩写  

设置error_log

错误日志在Nginx中通过error_log指令实现的,该指令记录服务器和请求处理过程中的错误信息

语法

配置错误日志文件的路径和日志级别

error_log file [level];
Default:    
error_log logs/error.log error;

# 第一个参数指定日志的写入位置。

# 第二个参数指定日志的级别。level可以是debug,info,notice,warn,error,crit,alert,emerg中的任意值。可以看到其取值范围是按紧急程度从低到高排列的。只有日志的错误级别等于或高于level指定的值才会写入错误日志中。默认值是error。
基本用法

error_log /var/logs/nginx/nginx-error.log

# 它可以配置在:main, http,mail,stream,location作用域。

# 例子中指定了错误日志的路径为:/var/logs/nginx/nginx-error.log,日志级别使用默认的error。

Open_log_file_cache

每一条日志记录的写入都是先打开文件再写入记录,然后关闭日志文件。如果你的日志文件路径中使用了变量,如access_log /var/logs/$host/nginx-access.log,为提高性能,可以使用open_log_file_cache指令设置日志文件描述符的缓存。

语法
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];

#对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭访问量大的时候IO会变多,会造成速度变慢.
#此时可以使用open_log_file_cache来设置日志文件缓存(默认是off),先将日志写到内存中,等待时机然后写入硬盘,格式如下

# max: 设置缓存中的最大文件描述符数量,如果缓存被占满,采用LRU(least recently used最近最少使用)算法将描述符关闭
# inactive: 设置存活时间,默认是10s
# min_uses: 设置在inactive时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是1次
# valid: 设置检查频率,默认60s
# off: 不使用缓存

#open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
基本用法

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;

# 它可以配置在http、server、location作用域中。

# 例子中,设置缓存最多缓存1000个日志文件描述符,20s内如果缓存中的日志文件描述符至少被被访问2次,才不会被缓存关闭。每隔1分钟检查缓存中的文件描述符的文件名是否还存在

Nginx日志轮转

默认nginx不会自动切割日志,当日志文件越来越大时,不再浪费磁盘空间,nginx的性能也会降低。可以使用Linux的logrotate来解决这个问题。

logrotate可以自动对日志进行切割,压缩和删除。而且自动化处理,不需要人为操作,使用非常方便。

rpm -ql nginx |grep log
/etc/logrotate.d/nginx
/var/log/nginx
#轮转规则文件
vim /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
#-USR1:发送1信号

# 手动运行脚本分割日志
sudo /usr/sbin/logrotate -f /etc/logrotate.d/nginx
logrotate参数说明
# 配置		   # 说明
daily			# 指定转储周期为每天
weekly			# 指定转储周期为每周
monthly			# 指定转储周期为每月
rotate count	# 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
compress		# 通过gzip 压缩转储以后的日志
nocompress		# 不做gzip压缩处理
create mode owner group	# 轮转时指定创建新文件的属性,如create 0777 nobody nobody
nocreate		# 不建立新的日志文件
delaycompress	# 和compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress	# 覆盖 delaycompress 选项,转储同时压缩
missingok		# 如果日志丢失,不报错继续滚动下一个日志
ifempty			# 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项
notifempty		# 当日志文件为空时,不进行轮转
mail address	# 把转储的日志文件发送到指定的E-mail 地址
olddir directory # 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir		# 转储后的日志文件和当前日志文件放在同一个目录下
sharedscripts	# 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
prerotate		# 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
postrotate		# 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
dateext			# 使用当期日期作为命名格式
dateformat .%s	# 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数
size(minsize) log-size	# 当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem),例如 size 100M
添加定时任务
sudo crontab -u root -e
# rotate nginx log erery day
0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx

# 如果要删除上面定时任务,运行如下命令
contab -r

# 如果任务没有正确执行,可以通过如下命令查看任务日志
vim /var/log/cron

# 也可以通过自己写脚本日志分割
#!/bin/bash
base_path='/usr/local/nginx/logs'               # 保存日志的目录
log_path=$(date -d yesterday +"%Y%m")           
day=$(date -d yesterday +"%d")                  # 日期作为日志的标识
mkdir -p $base_path/$log_path                   # 根据年月管理日志
mv $base_path/access.log $base_path/$log_path/access_$day.log
#echo $base_path/$log_path/access_$day.log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`# 信号通知nginx重新开始记录日志

# Crontab执行任务
30 02 * * * /cron/nginx/log.sh //每天2时30分(建议在02-04点之间,系统负载小)

常见的日志分析命令案例

# 1.统计2019年11月1号的pv量
grep '01/Nov/2019' /var/log/nginx/access.log |wc -l
102

# 2.统计2019年11月1号访问最多的10个IP
grep '01/Nov/2019' /var/log/nginx/access.log |awk '{ips[$1]++ } END{for (i in ips){print i,ips[i]}}' |sort -k2 -rn |head -n 10
49.233.69.195 201
190.94.151.52 1
117.107.143.155 1

# 3.统计2019年11月1号访问大于100次的IP
grep '01/Nov/2019' /var/log/nginx/access.log |awk '{ips[$1]++ } END{for(i in ips){if (ips[i]>100) {print i,ips[i]}}}'
49.233.69.195 201

# 4.统计2019年11月1号访问最多的10个页面
grep '01/Nov/2019' /var/log/nginx/access.log |awk '{urls[$7]++ } END{for(i in urls){print urls[i],i}}'|sort -k1 -rn  |head -n 10
202 /
1 /zhou.html
1 /favicon.ico

# 5.统计2019年11月1号每个URL访问内容的总大小($body_bytes_sent)
grep '01/Nov/2019' /var/log/nginx/access.log |awk '{urls[$7]++; size[$7]+=$10} END{for (i in urls){print urls[i],size[i],i}}' |sort -k1 -rn |head -n10
202 123624 /
1555 /favicon.ico
14 /zhou.html


# 6.统计2019年11月1号每个IP访问状态码数量($status)
grep '01/Nov/2019' /var/log/nginx/access.log |awk '{ip_code[$1" "$9]++} END{for (i in ip_code){print i,ip_code[i]}}' |sort -k1 -rn |head -n 10
190.94.151.52 200 1
117.107.143.155 404 1
49.233.69.195 200 202

# 7.统计2019年11月1号 IP访问状态码为404及出现次数($status)    # 此方法有点问题,不是很正确,后期再完善
grep '01/Nov/2019' /var/log/nginx/access.log |awk '{if ($9="404"){ip_code[$1" "$9]++}} END{for(i in ip_code){print i,ip_code[i]}}'
117.107.143.155 404 1
190.94.151.52 404 1
49.233.69.195 404 202

# 8.统计前一分钟的pv量
date1=$(date -d '1 minute ago' +%d/%b/%Y:%H:%M); awk -v date=$date1 '$0 ~ date {i++} END{print i}' /var/log/nginx/access.log
100

# 9.统计两个时间点之间的访问状态码404分别是多少个
awk '$4>="[01/Nov/2019:16:29:38" && $4<="[01/Nov/2019:17:38:36" {if($9="404"){ip_code[$1" "$9]++}} END{for (i in ip_code){print i,ip_code[i]}}' /var/log/nginx/access.log    # 
117.107.143.155 404 1
190.94.151.52 404 1
47.92.24.137 404 1
80.82.70.187 404 1
49.233.69.195 404 404

# 10.统计2019年11月1号各种状态码数量
grep '01/Nov/2019' /var/log/nginx/access.log |awk '{code[$9]++} END{for(i in code){print i,code[i]}}'
200 405
404 3

grep '01/Nov/2019' /var/log/nginx/access.log |awk '{code[$9]++;total++} END{for(i in code) {printf i" "; printf code[i]"\t";printf "%.2f",code[i]/total*100;print "%"}}'
200 405    99.26%
404 3    0.74%

# Nginx日志字段
$remote_addr        $1            # 远程客户端IP
$time_local         $4            # 访问时间
$request            $7            # HTTP请求(方法,http版本,URL地址)
$status             $9            # HTTP状态码
$body_bytes_sent    $10           # 发送给客户端的字节数,不包括响应头的大小,首页多大就是多大

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读3.7k次,点赞2次,收藏5次。Nginx学习笔记一、Nginx 简介1. 什么是Nginx2. 反向代理3. 负载均衡4. 动静分离二、Nginx基本使用1. Nginx常用的操作命令2. Nginx的配置文件提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、Nginx 简介1. 什么是Nginx2. 反向代理3. 负载均衡4. 动静分离二、Nginx基本使用1. Nginx常用的操作命令2. Nginx的配置文件一、Nginx 简介1. 什么是Nginx  Nginx(“engine x”)是一个_nginx代理
文章浏览阅读1.7w次,点赞14次,收藏61次。我们在使用容器的过程中需,有时候需要对容器中的文件进行修改管理,如果不做文件映射的化,我们使用docker exec -it 容器ID/容器名 /bin/bash 才能进入nginx中的文件里面如图。架设在客户机与目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将原本要直接发送到web服务器上的http请求发送到代理服务器中。A想要组C的房子,但是A并不认识C所以租不到,但是B认识C,A找B帮忙租到了C的房子。客户端代理服务器服务器。_docker nginx 配置
文章浏览阅读1.4k次。当用户在访问网站的过程中遇到404错误时,通常情况下应该显示一个友好的错误页面,而不是仅仅显示一个简单的错误提示。在Nginx中,可以通过配置来实现404错误自动跳转到首页的功能。如果您的网站使用动态内容生成页面(如PHP或其他服务器端语言),则应相应地修改配置以适应您的网站架构。这样,当用户访问一个不存在的页面时,Nginx会自动将其重定向到首页。为了使配置生效,需要重新加载Nginx配置。首先,需要打开Nginx的配置文件。现在,当用户访问一个不存在的页面时,Nginx会自动将其重定向到首页。_nginx 404 重定向
文章浏览阅读2.7k次。docker 和 docker-compose 部署 nginx+mysql+wordpress 实战_docker wordpress mariadb
文章浏览阅读1.3k次。5:再次启动nginx,可以正常启动,可以在任务管理器中查看到nginx的进程。重新启动下 直接访问8090端口 ok 访问成功。1 :查看80端口占用情况,pid的值为3960。3:在运行中输入regedit打开注册表编辑器。2: 通过以下命令查看3960所对应的服务名称。4:找到Start,右键修改将其制改为4。_nginx80端口无法访问
文章浏览阅读3.1w次,点赞105次,收藏182次。高性能:Nginx 被设计为能够处理大量并发连接而不显著增加系统负担。它采用异步事件驱动的架构,可以有效地处理高流量的 Web 请求。负载均衡:Nginx 支持负载均衡,可以将请求分发到多个后端服务器,以提高网站性能和可用性。反向代理:Nginx 可以充当反向代理,将客户端请求转发到后端服务器,隐藏后端服务器的真实 IP 地址,增加安全性和可扩展性。静态文件服务:Nginx 可以高效地提供静态文件(如 HTML、CSS、JavaScript、图像等)的服务,减轻应用服务器的负担。
文章浏览阅读976次。nginx作为常用的web代理服务器,某些场景下对于性能要求还是蛮高的,所以本片文章会基于操作系统调度以及网络通信两个角度来讨论一下Nginx性能的优化思路。我们的大学教程大部分讲述七层模型,实际上现代网络协议使用的都是四层模型,如下图,应用层报文经过四层的首部封装到对端。对端链路层拆开首部查看mac地址是自己在网上,拆开ip首部查看目的地址是不是自己,然后到达传输层应用层完成报文接收。文章是基于原有个人知识基础上,对旧知识进行巩固,以及新知识实践学习。
文章浏览阅读5.4k次,点赞9次,收藏15次。最后再说一种情况,就是后端处理了跨域,就不需要自己在处理了(这里吐槽下,某些后端工程师自己改服务端代码解决跨域,但是又不理解其中原理,网上随便找段代码黏贴,导致响应信息可能处理不完全,如method没添加全,headers没加到点上,自己用的那个可能复制过来的并不包含实际项目所用到的,没有添加options请求返回状态码等,导致Nginx再用通用的配置就会可能报以下异常)里面的就好了,因为这里如果是预检请求直接就ruturn了,请求不会再转发到59200服务,如果也删除了,就会报和情况1一样的错误。_nginx 允许跨域
文章浏览阅读2.5k次。项目配置了多个域名,如下,php 代码中有获取的值。当访问a.demo.com时,其获取的值是符合预期的。但是当访问b.demo.com时,其获取的值还是a.demo.com,导致代码中的判断出现错误。_nginxservername多个域名
文章浏览阅读1k次,点赞2次,收藏5次。采用YAML manifest的方式来安装ingress-nginx,用registry.lank8s.cn镜像库来替换 registry.k8s.io的库。_ingress-nginx安装
文章浏览阅读1.6k次,点赞2次,收藏2次。在windows平台编译nginx_windows 编译nginx
文章浏览阅读5.8k次,点赞2次,收藏18次。nginx [engine x] 是 HTTP 和反向代理服务器、邮件代理服务器和通用 TCP/UDP 代理服务器。nginx 的特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在高连接并发的情况下,nginx是Apache服务器不错的替代品,能够支持高达50000个并发连接数的响应。使用epoll and kqueue作为开发模型。_nginx
文章浏览阅读2k次。Linux启动(systemctl start nginx)nginx服务时出现:Failed to start nginx.service: Unit not found._为什么nginx的systemctl start nginx.service不能使用
文章浏览阅读1.3k次。重启之后,打开浏览器,输入http://localhost:8900/myBaidu,这时候就会自动的跳转到百度的页面。按照我们不同的需求修改nginx文件夹中的nginx-1.16.1conf里面的nginx.conf文件。启动nginx:打开nginx的文件夹,然后双击nginx.exe文件,启动nginx。打开之后假设我们需要跳转到百度则在配置文件nginx.conf中的下面加上。1、打开任务管理器关闭nginx的进程。端口在配置文件的(下图)进行查看nginx端口。_nginx 代理百度
文章浏览阅读5.7k次,点赞5次,收藏3次。nginx重定向问题解决(rewrite or internal redirection cycle)_rewrite or internal redirection cycle while internally redirecting to "/inde
文章浏览阅读1.3k次。请注意,上述命令假设 Nginx 已经在系统的 PATH 环境变量中配置。如果没有,请提供正确的 Nginx 安装路径,或者在命令中使用完整的路径来替换。将该命令与所有 Nginx 进程的 PID 一起使用,以终止所有正在运行的 Nginx 进程。此命令将启动一个新的 Nginx 进程来重新加载配置文件并重新启动服务器。使用以下命令来终止所有 Nginx 进程(使用上面的 PID 替换。的进程以及它们的 PID。打开命令提示符(CMD)。此命令将列出所有名为。选项来强制终止进程。_windows 怎么关闭nginx
文章浏览阅读2.7k次,点赞2次,收藏7次。包括 Netflix、GitHub 和 WordPress。Nginx 可以用作 Web 服务器、负载均衡器、反向代理和 HTTP 缓存等。_ubuntu安装nginx
文章浏览阅读915次。轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码。_nginx 短链代理
文章浏览阅读1.1k次,点赞35次,收藏24次。流媒体方案之Nginx——实现物联网视频监控项目Nginx是什么Nginx在流媒体方案中的位置软硬件准备移植编译Nginx运行Ngnix测试流媒体方案浏览器播放_nginx-rtmp-module
文章浏览阅读1.9k次。nginx 配置 wss 协议转发 ws 服务器_nginx 配置wss