如何在 Ubuntu VPS 上的 Nginx 中配置日志记录和日志轮换
介绍
为了避免在使用 Web 服务器时遇到一些麻烦,您可以配置日志记录。在您的服务器上记录信息使您可以访问数据,这些数据将帮助您在出现问题时进行故障排除和评估。
在本教程中,您将检查 Nginx 的日志记录功能并了解如何配置这些工具以最好地满足您的需求。您将使用 Ubuntu 22.04 虚拟专用服务器作为示例,但任何现代发行版都应该具有类似的功能。
先决条件
要学习本教程,您需要:
- 一台 Ubuntu 22.04 服务器,具有非根
sudo
启用的用户和防火墙。按照我们的初始服务器设置开始。 - 服务器上安装了 Nginx。按照我们的如何在 Ubuntu 22.04 上安装 Nginx 教程进行安装。
在 Ubuntu 22.04 服务器上运行 Nginx 后,您就可以开始了。
了解 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
:系统处于不可用状态的紧急情况。alert
:需要立即采取行动的严重情况。crit
:需要解决的重要问题。error
:发生错误,未成功。警告
:发生了异常情况,但无需担心。notice
:一些正常的事情,但值得注意的是发生了什么。info
:可能很高兴知道的信息性消息。debug
:可用于查明问题发生位置的调试信息。
列表中较高的级别被认为具有较高的优先级。如果指定级别,日志将捕获该级别以及高于指定级别的任何级别。
例如,如果您指定 error
,日志将捕获标记为 error
、crit
、alert
和 <代码>出现。
使用该指令的一个示例是在主配置文件中。使用您喜欢的文本编辑器访问以下配置文件。此示例使用 nano
:
- sudo nano /etc/nginx/nginx.conf
向下滚动文件到 # Logging Settings
部分并注意以下指令:
. . .
##
# Logging Settings
##
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 预定义了一种格式,称为 combined
。这是许多服务器使用的通用格式。
如果内部没有定义,需要用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
部分提到的 combined
格式。您可以使用 log_format
定义定义的任何格式。
缓冲区大小是 Nginx 在将所有数据写入日志之前将保留的最大数据大小。您还可以通过将 gzip
添加到定义中来指定日志文件的压缩:
access_log /path/to/log/location format_of_log gzip;
与 error_log
指令不同,如果您不想记录日志,可以通过在配置文件中更新它来关闭它:
. . .
##
# 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
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
部分包含一个类似于以前使用的手动旋转机制的命令:
. . .
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
. . .
这部分告诉 Nginx 在轮换完成后重新加载日志文件。
结论
如果您的服务器出现问题,正确的日志配置和管理可以节省您的时间和精力。获得有助于您诊断问题的信息可能是微不足道的修复和持续性头痛之间的区别。
请务必密切关注服务器日志,以维护站点的正常运行并确保您不会泄露敏感信息。本指南仅作为您对日志记录体验的介绍。您可以在我们关于如何解决常见 Nginx 错误的教程中了解更多一般提示。