Ubuntu VPS Nginx日志配置:高效记录与自动轮转优化指南

引言

为了避免您的网络服务器出现问题,您可以配置日志记录。在服务器上记录信息可以帮助您获取数据,从而在问题出现时进行排查和评估情况。

在本教程中,您将探索 Nginx 的日志功能,并了解如何配置这些工具以最好地满足您的需求。我们将以 Ubuntu 22.04 虚拟私有服务器为例,但其他现代发行版应该有类似的功能。

先决条件

要跟着本教程操作,您需要:

在您的 Ubuntu 22.04 服务器上运行 Nginx 后,您就可以开始了。

理解 error_log 指令

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

错误日志语法

error_log 指令用于处理一般的错误消息记录。如果您熟悉 Apache,这与 Apache 的 ErrorLog 指令非常相似。

error_log 指令应用以下语法:

Nginx 的配置文件 /etc/nginx/nginx.conf 中:

error_log log_file log_level;

log_file 指定了日志将被写入的文件。log_level 指定了您希望记录的最低日志级别。

日志级别

可以根据需要配置 error_log 指令以记录更多或更少的信息。日志记录级别可以是以下任意一种:

  • emerg: 紧急情况,系统处于不可用状态。
  • alert: 严重情况,需要立即采取行动。
  • crit: 需要解决的重要问题。
  • error: 发生了错误,并且操作不成功。
  • warn: 发生了不寻常的事情,但不是引起关注的原因。
  • notice: 正常情况,但值得注意。
  • info: 信息性消息,可能有用。
  • debug: 调试信息,有助于查明问题发生的位置。

列表中排名较高的级别被视为较高优先级。如果您指定一个级别,日志将捕获该级别及比指定级别更高的任何级别。

例如,如果您指定 error,日志将捕获标记为 errorcritalertemerg 的信息。

这个指令的一个应用示例是在主配置文件中。请使用您喜欢的文本编辑器访问以下配置文件。这个示例使用的是 nano。

sudo nano /etc/nginx/nginx.conf

向下滚动文件到“日志设置”部分,并注意以下指令:

Nginx 的配置文件 /etc/nginx/nginx.conf

. . .
##
# Logging Settings
##

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
. . .

如果你不想让 error_log 记录任何内容,你必须将输出发送到 /dev/null

Nginx 的配置文件 /etc/nginx/nginx.conf

. . .
error_log /dev/null crit;
. . .

关于其他日志记录指令 access_log,将在接下来的部分进行讨论。

了解 HttpLogModule 的日志记录指令

虽然 error_log 指令是核心模块的一部分,但 access_log 指令则是 HttpLogModule 的一部分。这提供了自定义日志的能力。

这个模块还包含了一些其他指令,可以帮助配置自定义日志。

日志格式指令

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

有一种预定义的格式在 Nginx 中称为 combined。这是许多服务器都使用的常见格式。

以下是一个示例,如果未在内部定义并且需要使用 log_format 指令来指定,可以采用下述的组合格式:

Nginx 的配置文件 /etc/nginx/nginx.conf

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

这个定义会一直延伸到找到分号(;)为止。

以美元符号($)开头的行代表变量,而像“-”、“[”和“]”这样的字符则按字面意义解释。

指令的一般语法是:

Nginx 的配置文件 /etc/nginx/nginx.conf

log_format format_name string_describing_formatting;

您可以使用核心模块支持的变量来构建日志字符串。

理解 access_log 指令

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

access_log 指令的语法格式如下:

Nginx 的配置文件 /etc/nginx/nginx.conf

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

access_log 的默认值是在 log_format 部分中提到的组合格式。您可以使用由 log_format 定义的任何格式。

缓冲区大小是 Nginx 在将所有数据写入日志之前所能容纳的最大数据量。您还可以通过在定义中添加 gzip 来指定日志文件的压缩。

Nginx 的配置文件 /etc/nginx/nginx.conf

access_log /path/to/log/location format_of_log gzip;

如果你不想记录日志,可以通过更新配置文件来关闭它,与 error_log 指令不同。

Nginx 的配置文件 /etc/nginx/nginx.conf

. . .
##
# Logging Settings
##

access_log off;
error_log /var/log/nginx/error.log;

. . .

在这种情况下,不需要向 /dev/null 写入。

管理日志的轮转

随着日志文件的增长,管理日志机制以避免填满磁盘空间变得必要。日志轮转是一种将日志文件切换出去并可能归档旧文件一段时间的过程。

Nginx 没有提供管理日志文件的工具,但它包含帮助日志轮转的机制。

手动日志轮转

要手动旋转日志,您可以创建一个脚本来进行旋转。例如,将当前日志文件移动到一个新文件以进行归档。一种常见的方案是将最近的日志文件命名为后缀为 .0,然后将较旧的文件命名为 .1,依此类推。

mv /path/to/access.log /path/to/access.log.0

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

kill -USR1 `cat /var/run/nginx.pid`

/var/run/nginx.pid 文件是 Nginx 存储主进程的 PID 的地方。它在 /etc/nginx/nginx.conf 配置文件的顶部使用以 pid 开头的行来指定。

sudo nano /etc/nginx/nginx.conf

Nginx 的配置文件位于 /etc/nginx/nginx.conf 中:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
...

旋转后,执行 sleep 1 以使进程完成转移。然后,您可以压缩旧文件,或进行任何您想要的后续旋转处理。

sleep 1
[ post-rotation processing of old log file ]

日志轮转与 logrotate

logrotate 应用程序是用于轮换日志的程序。它默认安装在 Ubuntu 上,而 Ubuntu 上的 Nginx 附带了一个自定义的 logrotate 脚本。

请使用您偏好的文本编辑器来打开旋转脚本。这个示例使用 nano 来演示。

sudo nano /etc/logrotate.d/nginx

文件的第一行指定了后续行所适用的位置。如果在 Nginx 配置文件中切换日志记录位置,请记住这一点。

文件的其他部分规定日志将每天进行轮转,并保留 52 份旧副本。

请注意,postrotate 部分包含与先前使用的手动旋转机制类似的命令。

NGINX 的日志轮换配置文件位于 /etc/logrotate.d/nginx

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

这部分内容告诉 Nginx 在日志文件轮换完成后重新加载日志文件。

结论

适当的日志配置和管理可以在服务器出现问题时为您节省时间和精力。拥有能够帮助您诊断问题的信息,可能是解决问题的轻而易举与持续头痛之间的区别。

为了保持一个正常运行的网站,并确保不暴露敏感信息,密切关注服务器日志是非常重要的。本指南仅作为您对日志的使用经验的介绍。您还可以在我们的教程《如何排除常见 Nginx 错误》中学习更多常规的技巧。

bannerAds