competeking 2020-07-04
参考文档:Nginx基本配置和日志处理
在 nginx 配置文件的最外层,我们可以配置 error_log,这个 error_log 能够记录 nginx 启动过程中的异常,也能记录日常访问过程中遇到的错误。
在 http 段中可以配置 error_log 和 access_log,可以用于记录整个访问过程中成功的,失败的,错误的访问。
在 server 内部配置属于专门 server 的 error_log 和 access_log,这是我们常用的,不同业务日志分开。
最后我们需要知道的,越往配置里层,优先级越高,意味着 server 的日志记录以后并不会因为你在外层写了日志而再次记录。
error_log logs/error.log error; -> 错误日志,级别:debug/info/notice/warn/error/crit/alert/emerg access_log logs/access.log main; -> 正常访问日志,可以关闭:access_log off open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2; -> 日志写入都是经过打开,写入,关闭文件。该参数用于设置日志文件的缓存,默认 off log_not_found on | off; -> 是否在 error_log 中记录不存在的错误,默认 on log_subrequest on | off; -> 是否在 access_log 中记录子请求的记录,默认 off rewrite_log on | off; -> 重写的日志,该日志只有在 rewrite 时候起作用,一般用于调试,默认 off
另外我们需要单独拿出来谈谈的是日志格式关键字:log_format
我们需要先知道的是,在 nginx 中内置了很多变量,我们都可以直接拿来使用,在日志这里我们常用的变量:
$remote_addr 客户端的 IP 地址 $remote_user 客户端用户名称 $time_local 当前时区时间 $time_iso8601 ISO8601 标准格式下的本地时间 $request 请求的 URL 与 HTTP 协议 $status 请求状态,成功 200 $body_bytes_sent 发送给客户端的主体文件大小 $http_referer 从哪个页面来的 $http_user_agent 客户端浏览器信息 $http_x_forwarded_for 客户端真实 IP $connection 连接的序列号 $connection_requests 当前通过一个连接获取的请求数量 $msec 日志写入时间 $pipe pipeline 标识 $request_length 请求长度 $request_time 请求处理时间
我们先看下默认的配置:
log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘ ‘$status $body_bytes_sent "$http_referer" ‘ ‘"$http_user_agent" "$http_x_forwarded_for"‘;
我们可以进行简单的改写,便于查看:
log_format mylog ‘$remote_addr - $status $remote_user [$time_local] "$request" ‘ ‘[Bytes: $body_bytes_sent - Time: $request_time] "$http_referer" ‘ ‘"$http_user_agent" "$http_x_forwarded_for"‘;
此时我们删除配置中原来的日志配置,修改为我们新的:
... http { ... log_format mylog ‘$remote_addr - $status $remote_user [$time_local] "$request" ‘ ‘[Bytes: $body_bytes_sent - Time: $request_time] "$http_referer" ‘ ‘"$http_user_agent" "$http_x_forwarded_for"‘; access_log /data/logs/nginx/access.log mylog; ... }
红色部分需要特别注意,我们改了这个格式的名字,自然使用的时候也要换成这个名字。
重载 nginx 后访问查看日志 /data/logs/nginx/access.log:
至于为啥状态码是 304 而不是 200,原因在于对于这种静态文件,nginx 在第一次访问的时候状态码 200,再次访问就是 304 了。
如果你还想 200,可以 ctrl + F5 强制刷新浏览器就是 200 了。 而且 304 可以发现其实服务器发送大小是 0 的。
至于针对单个 server(虚拟主机) 增加专门的日志,我们可以修改 demo.conf:
# 80 端口测试 server { listen 80; ... error_log /data/logs/nginx/demo-error.log info; access_log /data/logs/nginx/demo-access.log mylog; } ...
重载配置访问测试我们可以发现:
原本的 access.log 无论专门刷新也没有日志写入了。
在 /data/logs/nginx 目录下生成了我们刚刚配置的日志:
日志已经写到了新的文件里面!