如何在Ubuntu VPS上配置Nginx中的日志和日志轮换

了解您的服务器的日志记录机制将有助于您诊断问题并避免更大的问题。在本文中,我们将探讨Nginx的日志记录功能。我们将讨论配置选项和工具

登录Nginx

保存自己的Web服务器的麻烦的最简单的方法之一是今天配置适当的日志记录。 通过在服务器上记录信息,您可以访问这些数据,帮助您排查故障并评估出现的情况。

在本文中,我们将研究Nginx的日志记录功能,并发现如何配置这些工具以最好地满足您的需求。 在本指南中,我们将使用Ubuntu 12.04 VPS作为示例,但任何现代分发应以类似的方式运行。

Error_log指令

Nginx使用几个不同的指令来控制系统日志记录。 核心模块中包含的一个称为“error_log”。

Error_log语法

“error_log”伪指令用于处理记录一般错误消息。 如果你来自Apache,这非常类似于Apache的“ErrorLog”指令。

error_log指令采用以下语法:

error_log log_file [ log_level ]

示例中的“log_file”指定将写入日志的文件。 “log_level”指定要记录的最低级别的日志记录。

日志级别

可以将error_log配置参数配置为根据需要记录更多或更少的信息。 日志记录级别可以是以下任一级别:

  • EMERG:紧急情况下系统处于不可用状态。
  • 提醒 :其中立即需要采取行动严峻的形势。
  • 暴击 :需要解决的重要问题。
  • 错误 :发生了错误。 有东西不成功。
  • 警告 :发生了异常的发生,但不能引起人们的关注。
  • 声明 :正常的东西,但值得一提的发生。
  • 信息 :信息性消息,可能是很好的了解。
  • 调试 :调试信息,可以有效查明,其中一个问题发生。

列表上的级别被认为是更高的优先级。 如果指定级别,日志将捕获该级别以及高于指定级别的任何级别。

例如,如果指定“error”,日志将捕获标记为“error”,“crit”,“alert”和“emerg”的消息。

我们可以看到这个指令在使用中,如果我们看看主配置文件:

sudo nano /etc/nginx/nginx.conf
. . .
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
. . .

如果你不想让error_log记录任何东西,你必须将输出发送到“/ dev / null”:

error_log /dev/null crit;

我们在上面看到的其他日志指令,“access_log”指令,将在下一节讨论。

HttpLogModule日志指令

尽管error_log指令是核心模块的一部分,但access_log指令是HttpLogModule的一部分。 它提供了自定义日志的能力。

此模块中包含一些其他指令,有助于配置自定义日志。

Log_format指令

log_format伪指令用于描述使用纯文本和变量的日志条目的格式。

有一种格式预定义与Nginx称为“组合”。 这是许多服务器使用的通用格式。

这是组合格式,如果它没有在内部定义,需要使用log_format指令指定:

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

此定义跨多行,直到找到分号(;)。

以美元符号($)开头的片段表示变量,而类似“ - ”,“[”和“]”的字符按字面解释。

该命令的一般语法是:

log_format format_name string_describing_formatting;

您可以使用由核心模块支持的变量来制定你的日志字符串。

Access_log指令

access_log指令使用与error_log指令类似的语法,但是更灵活。 它用于配置自定义日志记录。

access_log命令使用以下语法:

access_log /path/to/log/location [ format_of_log buffer_size ];

access_log的默认值是我们在log_format节中看到的“组合”格式。 您可以使用由log_format定义定义的任何格式。

缓冲区大小是Nginx在将其全部写入日志之前将保持的数据的最大大小。 您还可以通过在定义中添加“gzip”来指定日志文件的压缩:

access_log location format gzip;

与error_log指令不同,如果您不想记录日志,可以通过指定:

access_log off;

在这种情况下,不必写入“/ dev / null”。

日志旋转

随着日志文件增长,必须管理日志记录机制,以避免填满磁盘空间。 日志轮换是关闭日志文件并可能在一定时间内归档旧文件的过程。

Nginx不提供管理日志文件的工具,但它包括使日志轮换简单的机制。

手动日志旋转

如果你想手动旋转日志(或者更有可能创建一个脚本来旋转日志),你可以按照Nginx wiki中的例子:

mv /path/to/access.log /path/to/access.log.0
kill -USR1 `cat /var/run/nginx.pid`
sleep 1
[ post-rotation processing of old log file ]

首先,我们将当前日志移动到一个新文件进行归档。 一个常见的方案是使用Stapling“.0”命名最近的日志文件,然后用“.1”命名旧文件,以此类推。

实际旋转日志的命令是“kill -USR1 /var/run/nginx.pid”。 这不会杀死Nginx进程,而是发送一个信号,使其重新加载其日志文件。 这将导致新的请求被记录到刷新的日志文件。

“/var/run/nginx.pid”文件是Nginx存储主进程的pid的位置。 它在配置文件中以“pid”开头的行指定:

sudo nano /etc/nginx/nginx.conf
. . .
pid /path/to/pid/file;
. . .

在旋转之后,我们执行“睡眠1”以允许该过程完成传送。 然后,我们可以压缩旧文件或执行任何我们想要的旋转后过程。

使用logrotate记录旋转

logrotate应用程序是一个旋转日志的简单程序。 它默认安装在Ubuntu上,Ubuntu上的Nginx自带了一个自定义logrotate脚本。

我们可以通过键入以下内容查看日志循环脚本:

sudo nano /etc/logrotate.d/nginx

文件的第一行指定后续行将应用于的位置。 如果你在Nginx配置文件中切换日志记录的位置,记住这一点。

文件的其余部分指定日志将每天轮换,并且将保留52个较旧的副本。 logrotate的一般配置超出了本文的范围。

我们可以看到,“postrotate”部分包含一个类似于我们使用的手动旋转机制的命令:

postrotate
	[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript

这部分告诉Nginx一旦旋转完成后重新加载日志文件。

结论

正确的日志配置和管理可以节省您在服务器出现问题时的时间和精力。 轻松访问有助于诊断问题的信息可能是一个小的修复和持续性头痛之间的区别。

重要的是要注意服务器日志,以维护一个功能性网站,并确保您不暴露敏感信息。 本指南仅作为介绍您的日志记录的经验。

作者:Justin Ellingwood