帮助中心
如何配置Nginx错误和访问日志



Nginx是一个开源的、高性能的HTTP和反向代理服务器,负责处理互联网上一些大型网站的负载。在管理NGINX网站服务器时,最经常执行的任务之一是检查日志文件。

知道如何配置和阅读日志,在排除服务器或应用程序问题时非常有用,因为它们提供了详细的调试信息。

Nginx在两种类型的日志中写入事件记录:访问日志和错误日志。访问日志写的是关于客户端请求的信息,而错误日志写的是关于服务器和应用程序问题的信息。

本文概述了如何配置和阅读Nginx的访问和错误日志。

配置访问日志


每当处理一个客户端请求时,Nginx都会在访问日志中生成一个新的事件。每条事件记录都包含一个时间戳,并包括关于客户端和请求资源的各种信息。访问日志可以显示访问者的位置,他们访问的页面,他们在页面上花了多少时间,等等。

log_format指令允许你定义日志信息的格式。access_log指令启用并设置日志文件的位置和使用的格式。

access_log指令的最基本语法如下:

access_log log_file log_format;

其中log_file是日志文件的完整路径,log_format是日志文件使用的格式。

访问日志可以在http、服务器或位置指令块中启用。

默认情况下,访问日志在Nginx主配置文件的http指令中被全局启用

/etc/nginx/nginx.conf
http {
  ...
  access_log  /var/log/nginx/access.log;
  ...
}

为了提高可读性,建议为每个服务器块设置一个单独的访问日志文件。在服务器指令中设置的access_log指令覆盖了在http(更高层次)指令中设置的指令。

/etc/nginx/conf.d/domain.com.conf
http {
  ...
  access_log  /var/log/nginx/access.log;
  ...

  server {
    server_name domain.com
    access_log  /var/log/nginx/domain.access.log;
    ...
  }
}

如果没有指定日志格式,Nginx使用预定义的组合格式,看起来像这样。

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

要改变日志格式,要么覆盖默认设置,要么定义一个新的格式。例如,要定义一个新的名为custom的日志格式,它将用显示X-Forwarded-For头的值来扩展组合格式,在http或服务器指令中添加以下定义。

log_format  custom  '$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 custom;

虽然访问日志提供了非常有用的信息,但它占用磁盘空间,并可能影响服务器的性能。如果你的服务器资源不足,而且你有一个繁忙的网站,你可能想禁用访问日志。要做到这一点,将access_log指令的值设置为off。

access_log  off;


配置错误日志


Nginx在错误日志文件中写入有关应用程序和一般服务器错误的信息。如果你的Web应用程序遇到错误,错误日志是排查问题的第一个起点。

error_log指令启用并设置错误日志的位置和严重程度。它采取以下形式,可以在http、服务器或位置块中设置。

error_log log_file log_level

log_level参数设置了日志记录的级别。下面是按严重程度列出的级别(从低到高):

  • debug - 调试信息
  • info - 信息性消息
  • notice - 通知
  • warn - 警告
  • error - 处理请求时的错误
  • crit - 关键问题。需要及时采取行动
  • alert - 警报。必须立即采取行动
  • emerg - 紧急状况。系统处于无法使用的状态

每个日志级别都包括更高的级别。例如,如果你将日志级别设置为警告,Nginx也将记录错误、批评、警报和紧急情况等信息。

当没有指定log_level参数时,默认为error。

默认情况下,error_log指令被定义在nginx.conf主文件中的http指令中。

/etc/nginx/nginx.conf
http {
  ...
  error_log  /var/log/nginx/error.log;
  ...
}

和访问日志一样,建议为每个服务器块设置一个单独的错误日志文件,它将覆盖从上级继承的设置。

例如,要将domain.com的错误日志设置为警告,你可以使用。

http {
  ...
  error_log  /var/log/nginx/error.log;
  ...

  server {
    server_name domain.com
    error_log  /var/log/nginx/domain.error.log warn;
    ...
  }
}

无论何时修改配置文件,都必须重启Nginx服务以使修改生效。

日志文件的位置


在大多数Linux发行版上,如Ubuntu、CentOS和Debian,访问和错误日志都位于/var/log/nginx目录中。

阅读和理解Nginx的日志文件


你可以使用标准命令,如cat、less、grep、cut、awk等,打开并解析日志文件。

下面是一个访问日志文件的例子记录,它使用了默认的组合Nginx日志格式。

192.168.33.1 - - [15/Oct/2019:19:41:46 +0000] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"

让我们来分析一下记录的每个字段意味着什么。

  • $remote_addr - 192.168.33.1 - 提出请求的客户端的IP地址
  • $remote_user - - - HTTP认证的用户。当用户名没有设置时,这个字段显示为
  • [$time_local] - [15/Oct/2019:19:41:46 +0000] - 本地服务器时间
  • "$request" - "GET / HTTP/1.1" - 请求类型、路径和协议
  • $status - 200 - 服务器的响应代码
  • $body_bytes_sent - 396 - 服务器响应的字节大小
  • "$http_referer" - "-" - 转介的URL
  • "$http_user_agent" - Mozilla/5.0 ... - 客户端(网络浏览器)的用户代理

使用tail命令来实时观察日志文件。

$ tail -f  access.log 


结论


日志文件为你提供了关于服务器问题和访问者如何与你的网站互动的有用信息。

Nginx允许你根据自己的需要配置访问和错误日志。

文章相关标签: 配置Nginx日志
购物车