如何在Ubuntu VPS上配置Nginx日志记录和日志轮转
介绍
为了节省您的网络服务器的麻烦,您可以配置日志记录。在服务器上记录信息可以让您获取数据,帮助您在问题出现时进行排查和评估情况。
在本教程中,你将探索Nginx的日志功能,并了解如何配置这些工具以最好地满足你的需求。我们将以Ubuntu 22.04虚拟私有服务器为例,但其他现代发行版应该有类似的功能。
先决条件
要跟着这个教程,你需要:
- One Ubuntu 22.04 server with a non-root sudo-enabled user with a firewall. Follow our Initial Server Setup to get started.
- Nginx installed on the server. Follow our How to Install Nginx on Ubuntu 22.04 tutorial to get it installed.
在您的Ubuntu 22.04服务器上运行Nginx,您就可以开始了。
理解Error_log指令
Nginx 使用几个不同的指令来控制系统日志记录。其中核心模块中包含的一个指令叫做 error_log。
错误日志语法
错误日志指令用于处理一般的错误消息记录。如果您熟悉Apache,这与Apache的ErrorLog指令非常相似。
错误日志指令应用以下语法:
error_log log_file log_level
日志文件指定了日志将被写入的文件。日志级别指定了您希望记录的最低日志级别。
日志级别
可以根据需要配置error_log指令以记录更多或更少的信息。日志记录级别可以是以下任意一种:
- emerg: Emergency situations where the system is in an unusable state.
- alert: Severe situations where action is needed promptly.
- crit: Important problems that need to be addressed.
- error: An error has occurred and something was unsuccessful.
- warn: Something out of the ordinary happened, but is not a cause for concern.
- notice: Something normal, but worth noting what has happened.
- info: An informational message that might be nice to know.
- debug: Debugging information that can be useful to pinpoint where a problem is occurring.
列表中排名较高的级别被视为较高优先级。如果您指定一个级别,日志将捕获该级别及比指定级别更高的任何级别。
例如,如果您指定错误,日志将捕获标记为错误、严重、警报和紧急的信息。
这个指令的一个应用示例是在主配置文件中。请使用您喜欢的文本编辑器访问以下配置文件。这个示例使用的是nano。
- sudo nano /etc/nginx/nginx.conf
向下滚动文件到“日志设置”部分,并注意以下指令:
/etc/nginx/nginx.conf 可以被简化为以下一种中文表达:
– Nginx 的配置文件 nginx.conf
. . .
##
# 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指令,可以使用纯文本和变量描述日志条目的格式。
有一种预定义的格式在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指令的语法格式如下:
nginx.conf 文件位于 /etc/nginx 目录中。
access_log /path/to/log/location [ format_of_log buffer_size ];
access_log的默认值是在log_format部分中提到的组合格式。您可以使用由log_format定义的任何格式。
缓冲区大小是Nginx在将所有数据写入日志之前所能容纳的最大数据量。您还可以通过在定义中添加gzip来指定日志文件的压缩。
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
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部分包含与先前使用的手动旋转机制类似的命令。
以下是对“/etc/logrotate.d/nginx”进行本地化汉语的转述:
NGINX的日志轮换配置文件位于“/etc/logrotate.d/nginx”。
. . .
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
. . .
这部分内容告诉Nginx在日志文件轮换完成后重新加载日志文件。
结论
适当的日志配置和管理可以在服务器出现问题时为您节省时间和精力。拥有能够帮助您诊断问题的信息,可能是解决问题的轻而易举与持续头痛之间的区别。
为了保持一个正常运行的网站,并确保不暴露敏感信息,密切关注服务器日志是非常重要的。此指南仅作为您对日志的使用经验的介绍。您还可以在我们的教程《如何排除常见Nginx错误》中学习更多常规的技巧。