当前位置: 首页 > Linux

超级详细!Nginx日志配置实践

时间:2023-04-06 06:29:28 Linux

前言Nginx日志对于统计和系统服务故障排除很有用。Nginx日志主要分为两种:access_log(访问日志)和error_log(错误日志)。通过访问日志,我们可以得到用户的IP地址、浏览器信息、请求处理时间等信息。错误日志记录了访问错误信息,可以帮助我们定位错误原因。本文将详细介绍如何配置Nginx日志。设置access_log访问日志主要记录客户端请求。客户端向Nginx服务器发起的每一次请求都记录在这里。客户端IP、浏览器信息、referer、请求处理时间、请求URL等都可以在访问日志中获取。当然你可以通过log_format命令定义具体记录哪些信息。语法access_log路径[格式[buffer=size][gzip[=level]][flush=time][if=condition]];#设置访问日志access_logoff;#closeaccesslogpath指定日志的存放位置。format指定日志的格式。默认情况下使用预定义组合。buffer用于指定写入日志时的缓冲区大小。默认值为64k。gzip日志在写入之前被压缩。可以指定压缩率,1到9之间的值越大,压缩率越高,压缩速度越慢。默认为1。flush设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空。if条件判断。如果指定条件的计算结果为0或空字符串,则不会记录请求。此外,还有一项特殊的超值优惠。如果指定此值,则关闭当前范围内的所有请求日志记录。范围access_log指令可以应用的范围是http、server、location和limit_except。也就是说,如果这条指令在这些范围之外使用,Nginx就会报错。以上就是access_log命令的基本语法和参数含义。让我们看几个例子来加深我们的理解。基本用法access_log/var/logs/nginx-access.log本例指定日志写入路径为/var/logs/nginx-access.log,日志格式使用默认组合。access_log/var/logs/nginx-access.logbuffer=32kgzipflush=1m本例指定日志写入路径为/var/logs/nginx-access.log,日志格式使用默认组合,并指定日志cachesize为32k,写入日志前启用gzip压缩,压缩率使用默认值1,缓存数据有效时间为1分钟。使用log_format自定义日志格式。Nginx有一个预定义的日志格式,叫做combined。如果未明确指定日志格式,则默认使用此格式:如果不想使用Nginx预定义的格式,可以通过log_format命令自定义。语法log_formatname[escape=default|json]string...;name格式名称。在access_log指令中引用。escape设置变量中的字符编码是json还是default,默认为default。string要定义的日志格式的内容。可以有多个参数。Nginx变量可以在参数中使用。以下是log_format命令中一些常用的变量:$bytes_sent发送给客户端的总字节数$body_bytes_sent发送给客户端的字节数,不包括响应头的大小$connection连接序列号$connection_requests当前的数量通过连接发送的请求$msec日志写入时间,单位为秒,精度为毫秒$pipe如果通过http管道发送请求,其值为“p”,否则为“.”$request_length查找长度(包括请求行、请求头和请求Body)$request_time请求处理时间,单位秒,精度为毫秒,从第一个字节读取到客户端到最后一个字符发送到客户端写入日志$status响应状态码$time_iso8601standard格式为本地时间,如"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/”如下图使用自定义日志格式:access_log/var/logs/nginx-access.logmainlog_formatmain'$remote_addr-$remote_user[$time_local]"$request"''$status$body_bytes_sent"$http_referer"''"$http_user_agent""$http_x_forwarded_for"';我们使用log_format指令定义了一个主格式,并在access_log指令中引用了它。如果客户端发起请求:https://suyunfe.com/,我们看一下我截获的一个请求的日志记录:112.195.209.90--[20/Feb/2018:12:12:14+0800]“GET/HTTP/1.1”200190“-”“Mozilla/5.0(Linux;Android6.0;Nexus5Build/MRA58N)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132MobileSafari/537.36”“-”我们看到在最后的日志记录中,$remote_user、$http_referer、$http_x_forwarded_for都对应一个-,因为这些变量都是空的。设置error_log错误日志在Nginx中通过error_log指令实现。该指令在请求处理期间记录服务器和错误消息。该语法配置错误日志文件的路径和日志级别。error_log文件[级别];默认:error_log日志/error.log错误;第一个参数指定写入日志的位置。第二个参数指定日志级别。level可以是debug、info、notice、warn、error、crit、alert、emerg中的任意值。可以看出,取值范围是按紧迫性由低到高排列的。只有当日志的错误级别等于或高于level指定的值时,才会写入错误日志。默认值为错误。基本用法error_log/var/logs/nginx/nginx-error.log可以配置在:main,http,mail,stream,server,location范围。示例中指定错误日志的路径为:/var/logs/nginx/nginx-error.log,日志级别使用默认错误。open_log_file_cache每条日志记录的写入都是先打开文件,然后写入记录,再关闭日志文件。如果您在日志文件路径中使用变量,例如access_log/var/logs/$host/nginx-access.log,以提高性能,您可以使用open_log_file_cache指令来设置日志文件描述符缓存。语法open_log_file_cachemax=N[inactive=time][min_uses=N][valid=time];max设置缓存中文件描述符的最大数量,如果满了,使用LRU算法关闭描述符。inactive设置缓存生命周期,默认为10s。min_uses在非活动时间段内,日志文件至少被使用几次,日志文件描述符记录在缓存中,默认为1次。valid:设置多长时间检查日志文件名是否有变化,默认为60s。off:不使用缓存。默认关闭。基本使用open_log_file_cachemax=1000inactive=20svalid=1mmin_uses=2;可以在http、server、location范围内配置。在示例中,将缓存设置为最多缓存1000个日志文件描述符。如果缓存中的日志文件描述符在20秒内至少被访问两次,则不会被缓存关闭。每隔1分钟检查缓存中文件描述符的文件名是否还存在。综上所述,访问日志和错误日志是通过Nginx中的access_log和error_log指令配置的,我们可以通过log_format自定义日志格式。如果日志文件路径中使用了变量,我们可以通过open_log_file_cache命令设置缓存来提高性能。另外access_log和log_format中用到了很多变量,这些变量就不一一列举了。详细的变量信息可以参考Nginx官方文档:http://nginx.org/en/docs/vari...作者:antwangjuejin。我/后/5aa09bb3f265da238f121b6c