nginx 日志管理

nginx 日志官网教程:https://nginx.org/en/docs/http/ngx_http_log_module.html

nginx 日志类别

Nginx3 支持多种日志

  • 访客日志

· client 给 server 发出请求,基于访问某一个 URL 来的

· clienti 请求报文发来了,包含了 client 的具体信息,服务端如何提取这些信息,以

及后续的处理

· nginx 支持了大量的内置变量,提取这些请求报文中的数据。然后后续的处

理。

  • 错误日志

Nginx 访问日志 由 ngx_http_log_module 模块负责。

对应官方地址为: http://nginx.org/en/docs/http/ngx_http_log_module.html.

Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
Default:  
access_log logs/access.log combined; 
Context:  http, server, location, if in location, limit_except

Nginx 访问日志主要有两个参数控制

log_format #用来定义记录日志的格式(可以定义多种日志格式,取不同名字即可)

​ log_format log_name string

access_log #用来指定日至文件的路径及使用的何种日志格式记录日志

access_log logs/access.log main;

日志格式字段

nginx.conf 中日志定义如下:
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';		# 日志具体提取的信息;

    access_log  /var/log/nginx/access.log  main;		# 日志存储路径及格式;


log_format 变量解释:
$remote_addr  		# 记录访问网站的客户端地址;如果客户端走了代理,这里进来的是代理的ip地址;这种情况下,一般会添加 				  
    									$http_x_forwarded_for 或者 添加 X-Real-IP ;X-Real-IP 在代理多的时候,更准确;
$remote_user  	  # 远程客户端用户名,一般没有该值使用 - 代替
$time_local  			# 记录访问时间与时区
$request  				# 用户的http请求起始行信息(请求方法,http协议)
$status  					# http状态码,记录请求返回的状态码,例如:200、301、404等
$body_bytes_sent  # 服务器发送给客户端的响应body字节数 
$http_referer  		# 记录此次请求是从哪个连接访问过来的,可以根据该参数进行防盗链设置。;
    										如果直接访问服务端,在请求日志中是不会有 referer 字端的,如果客户是从 A 网站 跳转过来的,
    										就会带有 referer(A)网站标记;如果没有该值 使用 - 代替
$http_user_agent  # 记录客户端访问信息,例如:浏览器、手机客户端等
$http_x_forwarded_for  # 当前端有代理服务器时,设置web节点记录客户端地址的配置,
    												此参数生效的前提是代理服务器也要进行相关的 x_forwarded_for 设置

备注:
$remote_addr 			# 可能拿到的是繁星代理的IP地址
$http_x_forwarded_for	# 可以获取客户端真实IP地址

更多参数请参考 Nginx 内置日志变量

nginx 所有变量索引页:https://nginx.org/en/docs/varindex.html

自定义一个json格式的访问日志


    # 启用压缩,buffer 32k, 每5s 刷新 buffer 到磁盘;
     access_log logs/access_json.log main_json gzip buffer=32k flush=5s;

日志内容

# 日志配置格式如下
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;
# cat /var/log/nginx/access.log
172.16.40.1 - - [16/Jul/2022:20:18:19 +0800] "GET / HTTP/1.1" 200 3700 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6.1 Safari/605.1.15" "-"
172.16.40.1 - - [16/Jul/2022:20:18:19 +0800] "GET /nginx-logo.png HTTP/1.1" 200 368 "http://172.16.40.141/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6.1 Safari/605.1.15" "-"

解释:

172.16.40.1   $remote_addr 、
- -						$remote_user
[16/Jul/2022:20:18:19 +0800]		[$time_local]
"GET / HTTP/1.1" 				"$request"
.... 后边自己解析吧

开、关 nginx 日志 并配置 单主机

# 关闭日志功能: 配置 off 字段
# 全局配置 access_log ,放在 http 模块下,局部配置 access_log ,放在对应的 server 主机中;
# access_log  /var/log/nginx/access.log  main;
access_log off;

server(虚拟主机) 配置日志

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    server {
    		access_log  /var/log/nginx/access-aaa.bbb.com.log  main;
    	 
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  aaa.bbb.com;
        root         /usr/share/nginx/html;
        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }
    }
}

# log_format 定义在 http 全局中,access_log 可以定义在单独的 server、location、if...等

也可以将 log_format 的定义单独放到一个文件,在 http 下引用;


全局配置

全局日志配置默认使用 http 中的 access_log ,单 server 没有配置日志存放路径的,使用该配置;

error_log

https://nginx.org/en/docs/ngx_core_module.html#error_log

Syntax:	error_log file [level];		# 语法
Default:	
error_log logs/error.log error;			# 默认的级别,级别越高记录的信息越少,生产场景一般是 warn error crit 这三个级别之一,注意不要配置 info 等较低级别,会带来巨大 磁盘I/O 消耗。
Context:	main, http, mail, stream, server, location		# 适用的 位置

level: debug, info, notice, warn, error, crit, alert, or emerg.		# 支持的级别
# 
error_log /var/log/nginx/error.log;
# 单 server 配置 error log
server {
    error_log /var/log/nginx/aaa.com.log error;
    
    listen 80;
    server_name aaa.com;
    .....
}

日志截断

mv access.log access.log.0
# 重新生成一个日志;重载配置文件
killall -USR1 nginx # 服务名
`cat /usr/local/nginx/logs/nginx.pid`
sleep 1
gzip access.log.0

优雅升级 nginx 参考链接:https://www.zsythink.net/archives/3260

错误页面优化

https://nginx.org/en/docs/http/ngx_http_core_module.html#error_page

Syntax:	error_page code ... [=[response]] uri;
Default:	—
Context:	http, server, location, if in location
Example:
error_page	响应状态码			相对路径的html文件/填入url;
error_page 404             /404.html;		# 它的意思是访问:http://aaa.com/404.html
error_page 500 502 503 504 /50x.html;		# http://aaa.com/50x.html
# 所以需要将 错误页面写在 网站的 根目录下。

优化错误页面,指向本地 html 文件;

        error_page 404 /404.html;
            location = /40x.html {
        }

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

也可以定义到 一个 url

        error_page 403 http://aaa.com/404.html;