本文介绍了如何在Ubuntu22.04服务器上配置Nginx的日志记录,包括error_log和access_log的使用,记录级别设置,以及如何使用log_format和logrotate进行日志管理。旨在帮助用户更好地监控和维护服务器性能。
简介
为了避免在 Web 服务器上遇到麻烦,您可以配置日志记录。在服务器上记录信息可以让您访问数据,帮助您在出现问题时进行故障排除和评估情况。
在本教程中,您将了解 Nginx 的日志记录功能,并发现如何配置这些工具以最好地满足您的需求。我们将以 Ubuntu 22.04 虚拟专用服务器为例,但任何现代发行版都应该有类似的功能。
先决条件
要按照本教程操作,您需要:
- 一个安装了防火墙的非root
sudo
-启用用户的 Ubuntu 22.04 服务器。请参考我们的《初始化服务器设置》进行开始。 - 在服务器上安装了 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
:发生错误,某些操作失败。warn
:发生了一些不寻常的情况,但不值得关注。notice
:正常的事情,但值得注意发生了什么。info
:可能值得了解的信息性消息。debug
:可以用于准确定位问题发生位置的调试信息。
列表中级别较高的级别被视为更高优先级。如果指定了级别,日志将捕获该级别及高于指定级别的任何级别的消息。
例如,如果指定了 error
,日志将捕获标记为 error
、crit
、alert
和 emerg
的消息。
在主配置文件中使用此指令的示例位于以下位置。使用您喜欢的文本编辑器访问以下配置文件。此示例使用 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
指令指定 combined
格式:
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
指令不同,如果您不希望记录日志,可以通过在配置文件中更新它来关闭它:
. . . ## # 日志设置 ## 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 [ 对旧日志文件进行轮转后处理 ]
使用 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 错误》中了解更多一般提示。