1. 介绍
通过一篇文章了解nginx的错误日志的记录内容和配置参数。错误日志的等级,记录方式等。
我在前篇介绍nginx access日志文件中简单涉及到error日志。今天将会详细解释nginx中的Error日志文档。
2. 配置
nginx中Error的日志等级是要比access日志要高。通常,配置在/etc/nginx/nginx.conf
文件中。配置效果为:
error_log /var/log/nginx/error.log notice;
格式为 关键字 存储路径 错误级别
关键字:error_log
不可变
存储路径:/var/log/nginx/error.log
可以配置任意存储日志的目录(PS:需要拥有访问和修改目录的权限,否则日志文件创建会失败)。也可以使用syslog:
和 memory:
定义。
错误级别:notice
。这个是可以配置多种错误级别的,nginx的错误级别分为:debug | info | notice | warn | error | crit | alert | emerg
。从左到右,级别从低到高。我们其他的各种编译器输出日志的逻辑差不多。级别越低输出的错误日志就会越多。生产环境建议跳转到warn及以上。否则会有大量的IO请求,耗费系统资源。
2.1 存储路径- syslog
通常默认情况下log日志存储在本机,而如果有一个远程服务器专门存储错误日志等,那么我们可以通过关键字进行配置。
例如:error_log syslog:server=192.168.1.1:1234 debug;
除此之外,还可以是更多的变量
例如:kern
, user
, mail
, daemon
, auth
, intern
, lpr
, news
, uucp
, clock
, authpriv
, ftp
, ntp
, audit
, alert
, cron
, local0
..local7
.等等
例如效果为:
error_log syslog:ftp=192.168.1.1:1234 debug;
也可以多参数拼接:
error_log syslog:server=192.168.1.1:1234,facility=local7,tag=nginx debug ;
2.2 存储路径-memory
我们在配置存储路径时,除了了地址或者指定其他配置以外,还可以配置memory。示例效果如下:
error_log memory:32m debug;
而这种配置效果,更多的是在测试Debug阶段。正式上线阶段
2.3 权限范围
error_log 可以在main
,http
,mail
,stream
,server
,loaction
范围中定义。
通常默认情况下会在main
中创建。我们也可以根据自己的需求,在不同的权限范围中定义不同的error错误输出等级和地址。
stream(需要nginx 1.7.11版本及以上),mail(需要nginx 1.9.0版本及以上)。
示例:
error_log /path/to/log debug;
http {
server {
error_log /path/to/log debug;
...
PS: 大部分情况下,我们都是创建一个main级别的就可以了。没有必要创建server级别的。如果我们定义了server级别的,建议可以注释掉main级别的。
2.4 日志存储时间
error日志和运行access日志的存储时间是一个值,配置路径为:
vim /etc/logrotate.d/nginx
通过修改rotate参数值,就可以修改日志的存储时间了。
更多介绍,可以参考文章:
https://zinyan.com/?p=444#2.2.1-%E9%85%8D%E7%BD%AE%E6%97%A5%E5%BF%97%E4%BF%9D%E7%95%99%E6%97%B6%E9%97%B4 来了解。
3. 格式阅读
我们默认安装,没有修改过error日志时,nginx提供的默认日志为:
error_log /var/log/nginx/error.log notice;
我们将error.log 文件导出后效果如下:
2022/11/17 03:35:10 [warn] 2121534#2121534: *1779322 an upstream response is buffered to a temporary file 后面我就省略了
2022/11/17 09:08:44 [crit] 2121534#2121534: *1783300 SSL_do_handshake() failed (SSL: error:141CF06C:SSL routines:tls_parse_ctos_key_share:bad key share) while SSL handshaking,后面我就省略了
2022/11/17 17:07:17 [emerg] 2312144#2312144: unknown directive "if($http_user_agent" in /etc/nginx/nginx.conf:8
通过格式可以看到,开头就是时间格式,然后是[错误等级],后面的2312144#2312144
,之后的就是错误内容了。我们可以根据错误内容进行搜索相关的解决方法。
同时,例如emerg格式会将我们配置nginx.conf后,通过nginx -t 进行代码检测时,出现的错误内容也会进行记录操作。
同我们开发的时候关注日志差不多,error | crit | alert | emerg
关注error以及以上的错误消息就可以了。如何严谨一些,也可以将warn提示的警告信息进行解决。
warn警告 不会影响我们的nginx正常使用,但是它会告诉我们有哪些需要优化改进的问题。
3.1 Error错误
- 问题:
[warn] 2121534#2121534: *1779322 an upstream response is buffered to a temporary file
问题介绍:意思是nginx默认的buffer太小,每个请求的缓存太小,请求头header太大时会出现缓存不足,内存放不下上传的文件,就写入到了磁盘中,使nginx的io太多,造成访问中断。
解决方法:
在http目录下添加:
http {
...
proxy_buffer_size 256k;
proxy_buffering on;
proxy_buffers 64 128k;
proxy_busy_buffers_size 512k;
fastcgi_buffer_size 512k;
fastcgi_buffers 6 512k;
fastcgi_busy_buffers_size 512k;
fastcgi_temp_file_write_size 512k;
fastcgi_intercept_errors on;
...
}
然后通过nginx -t
检查输入的是否规范后service nginx reload
刷新nginx服务器配置就可以了。
- 问题:
[notice] 2121534#2121534: signal 1 (SIGHUP) received from 2335675, reconfiguring
完整效果如下: 2022/11/21 13:54:55 [notice] 2121534#2121534: signal 1 (SIGHUP) received from 2121534, reconfiguring 2022/11/21 13:54:55 [notice] 2121534#2121534: reconfiguring 2022/11/21 13:54:55 [notice] 2121534#2121534: using the "epoll" event method 2022/11/21 13:54:55 [notice] 2121534#2121534: start worker processes 2022/11/21 13:54:55 [notice] 2121534#2121534: start worker process 2121534 2022/11/21 13:54:56 [notice] 2121534#2121534: gracefully shutting down 2022/11/21 13:54:56 [notice] 2121534#2121534: exiting 2022/11/21 13:54:56 [notice] 2121534#2121534: exit 2022/11/21 13:54:56 [notice] 2121534#2121534: signal 17 (SIGCHLD) received from 2121534 2022/11/21 13:54:56 [notice] 2121534#2121534: worker process 2121534 exited with code 0 2022/11/21 13:54:56 [notice] 2121534#2121534: signal 29 (SIGIO) received notice 通知时间,上面当我们通过命令service nginx reload
进行刷新配置的时候,就会在error中输出上面的notice提示。 上面的消息只是告诉我们服务器进行了重启而已。 - 问题:
[warn] 2121534#2121534: *2121534 a client request body is buffered to a temporary file
是取客户端请求体的缓冲区太小导致的,把client_body_buffer_size 进行调整就可以了。 示例: client_body_buffer_size 50m; 可以添加到http{}
中,也可以添加到server中{}
。决定了针对的范围而已。
PS:如果你的nginx的error中有很多很多的消息和日志。例如warn也有不少那么,我们就很有必要进行优化配置了。 大量的warn只能说明我们有部分配置不符合规范,可能造成了额外的性能开支。
如果使用nginx做后台的代理转发,作为服务器维护。我们需要一段时间内对error等日志信息做巡检。这样我们才能在出现问题的时候,尽快处理问题。
参考
http://nginx.org/en/docs/ngx_core_module.html#error_log