如何在UbuntuVPS上的Nginx中配置日志记录和日志轮换

来自菜鸟教程
跳转至:导航、​搜索

登录 Nginx

为您的 Web 服务器省去麻烦的最简单方法之一是立即配置适当的日志记录。 在您的服务器上记录信息使您可以访问数据,这些数据将帮助您在出现问题时进行故障排除和评估。

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

Error_log 指令

Nginx 使用一些不同的指令来控制系统日志记录。 核心模块中包含的一个称为“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”的消息。

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

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 ]

首先,我们将当前日志移动到一个新文件进行归档。 一种常见的方案是用“.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;
. . .

轮换之后,我们执行“sleep 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 在轮换完成后重新加载日志文件。

结论

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

密切关注服务器日志以维护正常运行的站点并确保您不会暴露敏感信息非常重要。 本指南仅用于介绍您的日志记录体验。

贾斯汀·艾林伍德