1。Nginx日志功能介绍 通常,在生产环境中使用Nginx进行反向代理和负载均衡或者各种其他处理时,良好的日志记录是非常关键的一环。通过精心配置的Nginx日志,我们可以获取用户的真实ip、浏览器信息,请求处理时间,请求URL等,这样方便我们排查和回溯错误。具体要记录哪些信息,可以通过Nginx中的logformat指令定义,由它定义日志的格式。而对于使用哪种日志格式和设置日志的保存路径则由accesslog指令指定的。另外在Nginx中还有一个配置服务器和请求处理过程中的错误信息的指令,那就是errorlog指令。最后,如果在配置的日志文件路径中使用了变量,我们可以通过openlogfilecache指令来设置缓存,提升性能。对于大型的网站而言,大量的http请求意味着大量的日志记录,及时按天或按大小进行Nginx日志备份也至关重要的。 在Nginx的日志模块主要有2个,ngxstreamlogmodule和ngxhttplogmodule,分别表示四层的日志模块和七层的日志模块,其指令和用法都是一致的,接下来我们只针对http请求的日志进行说明和使用。2。日志相关指令说明 在ngxhttplogmodule模块中,只3个指令,分别是accesslog、logformat和openlogfilecache。这些指令具体的格式如下:Syntax:accesslogpath〔format〔buffersize〕〔gzip〔level〕〕〔flushtime〕〔ifcondition〕〕;accesslogoff;Default:accessloglogsaccess。logcombined;Context:http,server,location,ifinlocation,limitexceptSyntax:logformatname〔escapedefaultjsonnone〕string。。。;Default:logformatcombined。。。;Context:httpSyntax:openlogfilecachemaxN〔inactivetime〕〔minusesN〕〔validtime〕;openlogfilecacheoff;Default:openlogfilecacheoff;Context:http,server,location ngxhttplogmodule模块用来按某个格式来记录请求的日志。模块中的logformat指令就是用来设置打印日志的格式,该指令中可以使用Nginx中的各种变量,比如保存远端ip地址的变量remoteaddr等。一个简单的示例如下:logformatmainremoteaddrremoteuser〔timelocal〕requeststatusbodybytessenthttprefererhttpuseragenthttpxforwardedfor; 接下来是accesslog指令。参考前面的指令格式。关闭日志记录,直接是写accesslogoff,如果打开access日志,它的写法是:accesslogpath〔format〔buffersize〕〔gzip〔level〕〕〔flushtime〕〔ifcondition〕〕;path是指定日志的写入路径,默认写入logsaccess。log文件中。注意日志路径可以包变量,但是会一些限制。format就是指定打的日志格式,也就是前面logformat指令定义好的格式。每个格式会设置一个格式名,这里取对应的格式名称,默认使用预定义的combined。buffer用来指定日志写入时的缓存大小。默认是64k。gzip日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1。flush设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空。if条件判断。如果指定的条件计算为0或空字符串,那么该请求不会写入日志。 accesslog指令示例:确保Nginx源码编译时安装了zlib库accesslogpathtolog。gzcombinedgzipflush5m;mapstatusloggable{〔23〕0;default1;}if条件判断,如果请求的相应码是2xx或者3xx,那么loggable变量为0,这样请求日志不会被打印accesslogpathtoaccess。logmainifloggable; 每一条日志记录的写入都是先打开文件再写入记录,然后关闭日志文件。如果你的日志文件路径中使用了变量,如accesslogvarlogshostaccess。log,为提高性能,可以使用openlogfilecache指令设置日志文件描述符的缓存。可以通过openlogfilecacheoff关闭该缓存。该指令的几个参数选项说明如下:max:设置缓存中最多容纳的文件描述符数量,如果被占满,采用LRU算法将描述符关闭。inactive:设置缓存存活时间,默认是10s。minuses:在inactive时间段内,日志文件最少使用几次,该日志文件描述符记入缓存,默认是1次。valid:设置多久对日志文件名进行检查,看是否发生变化,默认是60s。openlogfilecachemax100inactive15svalid1mminuses2; 最后errorlog是错误日志配置指令,主要记录客户端访问Nginx出错时的日志,它不不支持自定义日志格式。通过检查错误日志,可以快速定位线上问题,所以也是很重要的。关闭错误日志的方式和accesslog不一样,没有errorlogoff这样关错误日志的用法,反而会将错误日志打到名为off的文件中。常用的关闭方式是:errorlogdevnull; 就像在Linux系统中,输出到devnull的内容实际上等价于丢弃一样。3。Nginx日志切割 Nginx的日志切割实现的核心是使用nginx命令的reopen参数实现,该参数的含义是重新开始记录日志文件。人工切的做法就是凌晨将日志备份,然后执行带reopen参数的命令:备份相关的日志〔rootserversbin〕mv。。logsaccess。log。。logsbakaccess20200204。log〔rootserversbin〕mv。。logserror。log。。logsbakerror20200204。log〔rootserversbin〕。nginxsreopen 执行后会重新生成access。log和error。log,这就是手工切割的方式。通常我们会用shell脚本和定时任务来帮我我们完成自动切割。首先准备如下的shell脚本,它完成日志的备份以及给nginx进程发生reopen信号。!binbashNGXDIRrootnginxNGXLOGPATHNGXDIRlogsNGXLGOBAKPATHvarlogngxlogbakYESTERDAY(datedyesterdayYmd)mv{NGXLOGPATH}access。log{NGXLGOBAKPATH}access{YESTERDAY}。logmv{NGXLOGPATH}error。log{NGXLGOBAKPATH}error{YESTERDAY}。log想Nginx主进程发生USR1信号,等价于sreopen选项,重新打开日志文件killUSR1{NGXDIR}lognginx。pid 接下来,只要将这个脚本加入到crontab中即可,如下操作:crontabe上面打开的页面中输入如下行:00rootnginxnginxlogrotate。sh查看定时任务crontabl00rootnginxnginxlogrotate。sh4。案例演示 我们在nginx。conf中添加如下的日志配置:。。。http{logformatmainremoteaddrremoteuser〔timelocal〕requeststatusbodybytessenthttprefererhttpuseragenthttpxforwardedfor;mapstatusloggable{〔34〕0;default1;}accessloglogsaccess。logmainifloggable;server{listen8000;return2008000,server;}server{listen8001;return3008001,server;}server{listen8002;return4018002,server;}。。。}。。。 这里我们综合了前面涉及的知识,这里只简单测试日志配置中if功能。我们设置请求的相应码为3xx和4xx时,日志不会记录。接下来,启动或者热加载Nginx,然后分别对应三个端口发送http请求并观察access。log日志:〔shenshen〕curlhttp:180。76。152。113:8000IHTTP1。1200OKServer:nginx1。17。6Date:Tue,04Feb202013:31:03GMTContentType:applicationoctetstreamContentLength:13Connection:keepalive〔shenshen〕curlhttp:180。76。152。113:8001IHTTP1。1300Server:nginx1。17。6Date:Tue,04Feb202013:31:06GMTContentType:applicationoctetstreamContentLength:13Connection:keepalive〔shenshen〕curlhttp:180。76。152。113:8002IHTTP1。1401UnauthorizedServer:nginx1。17。6Date:Tue,04Feb202013:31:08GMTContentType:applicationoctetstreamContentLength:13Connection:keepalive到Nginx主机上观察access。log日志,发现只有响应码为200的请求记录了日志〔rootservernginx〕tailflogsaccess。log171。82。186。225〔04Feb2020:21:33:240800〕HEADHTTP1。12000curl7。29。05。小结 本小节我们介绍了log相关的指令,包括访问日志和错误日志的指令。此外还介绍了Nginx中对日志切割的常用处理方法,这也是生产环境上使用日志备份的手段。