Nginx 是一个开源的、高性能的 HTTP 和反向代理服务器负责处理互联网上一些最大网站的负载。管理时NGINX对于 Web 服务器,您将执行的最常见的任务之一是检查日志文件。
了解如何配置和读取日志在排除服务器或应用程序问题时非常有用,因为它们提供了详细的调试信息。
Nginx 将其事件记录写入两种类型的日志中:访问日志和错误日志。访问日志写入有关客户端请求的信息,错误日志写入有关服务器和应用程序问题的信息。
本文概述了如何配置和读取 Nginx 访问和错误日志。
配置访问日志#
每当处理客户端请求时,Nginx 都会在访问日志中生成一个新事件。每个事件记录都包含一个时间戳,并包含有关客户端和所请求资源的各种信息。访问日志可以向您显示访问者的位置、他们访问的页面、他们在页面上花费的时间等等。
The log_format
指令允许您定义记录消息的格式。这access_log
指令启用并设置日志文件的位置和使用的格式。
最基本的语法access_log
指令如下:
access_log log_file log_format;
Where log_file
是日志文件的完整路径,并且log_format
是日志文件使用的格式。
可以在以下任一位置启用访问日志http
, server
, or location
指令块。
默认情况下,访问日志在全局启用http
主 Nginx 配置文件中的指令。
/etc/nginx/nginx.conf
http {
...
access_log /var/log/nginx/access.log;
...
}
为了更好的可读性,建议为每个服务器块设置单独的访问日志文件。这access_log
指令中设置的server
指令会覆盖其中的一组指令http
(更高级别)指令。
/etc/nginx/conf.d/domain.com.conf
http {
...
access_log /var/log/nginx/access.log;
...
server {
server_name domain.com
access_log /var/log/nginx/domain.access.log;
...
}
}
如果没有指定日志格式,Nginx 使用预定义的combined格式如下:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
要更改日志记录格式,请覆盖默认设置或定义新设置。例如定义一个名为的新日志记录格式custom这将延长combined格式与显示的值X-Forwarded-For
header中添加以下定义http
or server
指示:
log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
要使用新格式,请在日志文件后指定其名称,如下所示:
access_log /var/log/nginx/access.log custom;
虽然访问日志提供了非常有用的信息,但它会占用磁盘空间并可能影响服务器性能。如果您的服务器资源不足并且网站繁忙,您可能需要禁用访问日志。为此,请设置access_log
指示off
:
配置错误日志#
Nginx 将有关应用程序和一般服务器错误的消息写入错误日志文件中。如果您在 Web 应用程序中遇到错误,错误日志是解决问题的首要位置。
The error_log
指令启用并设置错误日志的位置和严重性级别。它采用以下形式,并且可以在http
, server
, or location
block:
error_log log_file log_level
The log_level
参数设置日志记录的级别。以下是按严重程度列出的级别(从低到高):
-
debug
- 调试消息。
-
info
- 信息性消息。
-
notice
- 通知。
-
warn
- 警告。
-
error
- 处理请求时出错。
-
crit
- 关键问题。需要立即采取行动。
-
alert
- 警报。必须立即采取行动。
-
emerg
- 紧急情况。系统处于无法使用的状态。
每个日志级别都包含更高级别。例如,如果将日志级别设置为warn
,Nginx 也会记录error
, crit
, alert
, and emerg
消息。
当。。。的时候log_level
未指定参数,默认为error
.
默认情况下,error_log
指令定义在http
主 nginx.conf 文件中的指令:
/etc/nginx/nginx.conf
http {
...
error_log /var/log/nginx/error.log;
...
}
与访问日志相同,建议为每个服务器块设置单独的错误日志文件,这会覆盖从更高级别继承的设置。
例如,将domain.com的错误日志设置为warn
你会使用:
http {
...
error_log /var/log/nginx/error.log;
...
server {
server_name domain.com
error_log /var/log/nginx/domain.error.log warn;
...
}
}
每当修改配置文件时,都必须重启 Nginx 服务以使更改生效。
日志文件的位置#
默认情况下,在大多数 Linux 发行版上,例如Ubuntu
, CentOS
, and Debian,访问和错误日志位于/var/log/nginx
目录。
阅读和理解 Nginx 日志文件#
您可以使用标准命令打开并解析日志文件,例如cat
, less
, grep
, cut
, awk, 等等。
以下是访问日志文件中的示例记录,它使用默认的组合 Nginx 日志格式:
192.168.33.1 - - [15/Oct/2019:19:41:46 +0000] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
我们来分析一下记录的每个字段的含义:
-
$remote_addr
- 192.168.33.1
- 发出请求的客户端的 IP 地址。
-
$remote_user
- -
- HTTP 认证用户。当未设置用户名时,该字段显示-
.
-
[$time_local]
- [15/Oct/2019:19:41:46 +0000]
- 本地服务器时间。
-
"$request"
- "GET / HTTP/1.1"
- 请求类型、路径和协议。
-
$status
- 200
- 服务器响应代码。
-
$body_bytes_sent
- 396
- 服务器响应的大小(以字节为单位)。
-
"$http_referer"
- "-"
- 推荐的 URL。
-
"$http_user_agent"
- Mozilla/5.0 ...
- 客户端的用户代理(Web 浏览器)。
Use the tail实时查看日志文件的命令:
tail -f access.log
结论#
日志文件为您提供有关服务器问题以及访问者如何与您的网站交互的有用信息。
Nginx 允许您根据需要配置访问日志和错误日志。
如果您有任何问题或反馈,请随时发表评论。