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;