Nginx Error_log 错误日志配置和解释

2022-12-08 18:00:22 浏览数 (1)

1. 介绍

通过一篇文章了解nginx的错误日志的记录内容和配置参数。错误日志的等级,记录方式等。

我在前篇介绍nginx access日志文件中简单涉及到error日志。今天将会详细解释nginx中的Error日志文档。

2. 配置

nginx中Error的日志等级是要比access日志要高。通常,配置在/etc/nginx/nginx.conf文件中。配置效果为:

代码语言:javascript复制
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;

也可以多参数拼接:

代码语言:javascript复制
error_log  syslog:server=192.168.1.1:1234,facility=local7,tag=nginx debug ;

2.2 存储路径-memory

我们在配置存储路径时,除了了地址或者指定其他配置以外,还可以配置memory。示例效果如下:

代码语言:javascript复制
error_log memory:32m debug;

而这种配置效果,更多的是在测试Debug阶段。正式上线阶段

2.3 权限范围

error_log 可以在mainhttpmailstreamserverloaction 范围中定义。

通常默认情况下会在main中创建。我们也可以根据自己的需求,在不同的权限范围中定义不同的error错误输出等级和地址。

stream(需要nginx 1.7.11版本及以上),mail(需要nginx 1.9.0版本及以上)。

示例:

代码语言:javascript复制
error_log /path/to/log debug;

http {
    server {
        error_log /path/to/log debug;
        ...

PS: 大部分情况下,我们都是创建一个main级别的就可以了。没有必要创建server级别的。如果我们定义了server级别的,建议可以注释掉main级别的。

2.4 日志存储时间

error日志和运行access日志的存储时间是一个值,配置路径为:

代码语言:javascript复制
vim /etc/logrotate.d/nginx

通过修改rotate参数值,就可以修改日志的存储时间了。

更多介绍,可以参考文章:

https://zinyan.com/?p=444#2.2.1-配置日志保留时间 来了解。

3. 格式阅读

我们默认安装,没有修改过error日志时,nginx提供的默认日志为:

代码语言:javascript复制
error_log  /var/log/nginx/error.log notice;

我们将error.log 文件导出后效果如下:

代码语言:javascript复制
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错误

  1. 问题:[warn] 2121534#2121534: *1779322 an upstream response is buffered to a temporary file

问题介绍:意思是nginx默认的buffer太小,每个请求的缓存太小,请求头header太大时会出现缓存不足,内存放不下上传的文件,就写入到了磁盘中,使nginx的io太多,造成访问中断。

解决方法:

在http目录下添加:

代码语言:javascript复制
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服务器配置就可以了。

  1. 问题:[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提示。 上面的消息只是告诉我们服务器进行了重启而已。
  2. 问题:[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

0 人点赞