如何在Ubuntu 16.04上将日志模块添加到Nginx

介绍

服务器管理不仅仅与服务的初始配置有关。它还涉及监督这些服务并确保它们尽可能顺利地运行。管理员最重要的知识来源之一是日志文件,其中包含有关系统事件的信息。

对于Web服务器(如Nginx),日志包含有关通过Web服务器访问资源的每次尝试的有价值信息。每个网站访问者和看到的图像或下载的文件都在日志中精心注册。发生错误时,它们也会保存在日志中。使用结构良好的日志文件要容易得多。

在本指南中,我们将了解如何使用Nginx的日志模块。我们将为不同的服务器块设置单独的日志文件,然后定制日志输出。我们还将向访问日志添加关于请求的附加信息(在本教程的示例中,附加信息是为请求提供服务所需的时间),这些信息超出Nginx默认包含的内容。

先决条件

要学习本教程,您需要:

  • 一个Ubuntu 16.04服务器,包括一个sudo非root用户,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器
  • 在Ubuntu 16.04服务器上安装Nginx。

第1步 - 创建测试文件

在此步骤中,我们将在默认的Nginx网站目录中创建多个测试文件。我们将使用它们来测试我们的日志配置。

当Nginx(或任何其他Web服务器)收到文件的HTTP请求时,它会打开该文件,并通过网络传输其内容将其提供给用户。文件越小,传输速度越快。当文件完全传输时,该请求被认为是完整的,然后才会传输记录。

在本教程的后面,我们将修改日志记录配置,以包含有关每个请求花费多少时间的有用信息。测试修改后的配置并注意不同请求之间差异的最简单方法是创建多个不同大小的测试文件,这些文件将在不同的时间内传输。

让我们使用truncate创建一个在默认Nginx目录中命名为1mb.test的1兆字节文件。

sudo truncate -s 1M /var/www/html/1mb.test

类似地,我们再创建两个不同大小的文件,首先是10兆字节,然后是100兆字节,并相应地命名它们。

sudo truncate -s 10M /var/www/html/10mb.test
sudo truncate -s 100M /var/www/html/100mb.test

最后但同样重要的是,让我们创建一个空文件:

sudo touch /var/www/html/empty.test

在下一个步骤中,我们将使用这些文件用默认配置填充日志文件,然后在本教程的后面将演示定制的配置。

第2步 - 了解默认配置

日志模块是核心Nginx模块,这意味着它不需要单独安装即可使用。但是,默认配置是最低限度。在此步骤中,我们将看到默认配置的工作原理。

在全新安装中,Nginx将所有请求记录到两个单独的文件:访问日志和错误日志。位于/var/log/nginx/error.log的错误日志存储有关异常服务器错误或或处理请求错误的信息。

位于/var/log/nginx/access.log其中的访问日志更常用。这是保存所有Nginx请求的信息的地方。在此日志中,您可以看到用户正在访问哪些文件,他们正在使用哪些Web浏览器,他们拥有哪些IP地址,以及Nginx响应每个请求的HTTP状态代码。

让我们看看访问日志文件的示例行是什么样子的。首先,请求我们在步骤1中从Nginx创建的空文件,这样日志文件就不会是空的。

curl -i http://localhost/empty.test

作为响应,您应该看到几个HTTP响应标头:

HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Thu, 30 Jun 2016 18:10:15 GMT
Content-Type: application/octet-stream
Content-Length: 0
Last-Modified: Thu, 30 Jun 2016 18:10:07 GMT
Connection: keep-alive
ETag: "5775607f-0"
Accept-Ranges: bytes

通过此响应,您可以了解以下几点:

  • HTTP/1.1 200 OK告诉我们当Nginx回复200 OK状态代码,是告诉我们没有错误。
  • Content-Length: 0 表示返回的文档为零长度。
  • 请求在Thu, 30 Jun 2016 18:10:15 GMT已处理完毕。

让我们看看这是否与Nginx在其访问日志中存储的内容相匹配。日志文件只能由管理用户读取,因此必须使用sudo来访问它们。

sudo tail /var/log/nginx/access.log

日志将包含这样的一行,对应于我们之前发布的测试请求。

127.0.0.1 - - [30/Jun/2016:14:10:15 -0400] "GET /empty.test HTTP/1.1" 200 0 "-" "curl/7.47.0"

Nginx使用组合日志格式,这是Web服务器常用于互操作性的访问日志的标准格式。在这种格式中,每条信息都由一个空格分隔; 连字符代表缺少的信息。

从左到右,类别是:

  • 请求资源的用户IP地址。因为您在本地使用curl,所以地址指向本地主机--127.0.0.1
  • 远程日志信息。这将始终是一个连字符,因为Nginx不支持此信息。
  • 根据HTTP基本身份验证登录用户用户名。对于所有匿名请求,这将为空。
  • 请求日期。您可以看到这与我们的响应标头中的日期相匹配。
  • 请求路径,它包括请求方法(GET),该路径所请求的文件(/empty.text),以及所使用的协议(HTTP/1.1)。
  • 响应状态代码,这是200 OK,这意味着成功。
  • 传输文件长度,这是0因为文件为空。
  • HTTP引用头,它包含其中该请求来源文档的地址。在此示例中,它是空的,但如果这是一个图像文件,则引用者将指向使用该图像的页面。 HTTP Referer标头是单词“referrer”的拼写错误,它可以追溯到HTTP的起源并且是HTTP标准的一部分。
  • 用户代理,在这里是curl

即使访问日志中的单个日志条目也包含大量有关请求的有价值信息。但是,当缺少一个重要的信息时,虽然我们已经请求了http://localhost/empty.test的确切位置,但只有/empty.test文件的路径在日志条目中; 有关主机名(此处为localhost)的信息也将丢失。

第3步 - 配置单独的访问日志

接下来,我们将覆盖默认日志配置(Nginx为所有请求存储一个访问日志文件),并让Nginx为clean Nginx安装时附带的默认服务器块存储单独的日志文件。您可以通过阅读腾讯云+社区中的相关文章来熟悉Nginx服务器块。

为每个服务器块存储单独的日志文件是一种很好的做法,可以有效地将来自不同网站的日志彼此分开。这不仅使日志文件变小,而且重要的是使日志更容易分析以发现错误和可疑活动。

要更改默认的Nginx服务器块配置,请在nano或其他您喜欢的文本编辑器中打开服务器块Nginx配置文件。

sudo nano /etc/nginx/sites-available/default

找到server配置块,如下所示:

. . .
# Default server configuration
#
​
server {
    listen 80 default_server;
    listen [::]:80 default_server;
​
. . .

并将最后两行添加到配置中:

. . .
# Default server configuration
#
​
server {
    listen 80 default_server;
    listen [::]:80 default_server;
​
    access_log /var/log/nginx/default-access.log;
    error_log /var/log/nginx/default-error.log;
. . .

access_log指令设置存储访问日志的文件路径,并对error_log错误日志执行相同操作。我们使用相同的目录作为默认的Nginx logs(/var/log/nginx),但使用不同的文件名。如果您有多个服务器块,最好以一致且有意义的方式命名日志文件,例如使用文件名中的域名。

保存并关闭文件以退出。

注意:请记住,为了为每个服务器块维护单独的日志文件,每次在Nginx配置中创建新的服务器块时,都必须应用上述配置更改。

要启用新配置,请重新启动Nginx。

sudo systemctl restart nginx

要测试新配置,请像以前一样对我们的空测试文件执行相同的请求。

curl -i http://localhost/empty.test

检查与我们之前看到的日志行相同的日志行是否写入我们刚刚配置的单独文件中。

sudo tail /var/log/nginx/default-access.log

在下一步中,我们将自定义此新文件中的日志格式并包含其他信息。

第4步 - 配置自定义日志格式

在这里,我们将设置一个自定义日志记录格式,以使Nginx记录其他信息(处理请求需要多长时间),并配置默认服务器块以使用此新格式。

我们需要在使用之前定义新的日志格式。在Nginx中,每种日志格式都有一个唯一的名称,对于整个服务器而言是全局的。可以单独的服务器块可以配置为稍后仅通过引用它们的名称就可以使用这些格式。

要定义新的日志记录格式,请在Nginx额外配置目录中创建一个名为timed-log-format.conf的新配置文件。

sudo nano /etc/nginx/conf.d/timed-log-format.conf

添加以下内容:

log_format timed '$remote_addr - $remote_user [$time_local] '
                 '"$request" $status $body_bytes_sent '
                 '"$http_referer" "$http_user_agent" $request_time';

保存并关闭文件以退出。

log_format设置指令定义了新的日志格式。下一个元素是此格式的唯一标识符; 这里我们使用的是定时,但您可以选择任何名称。

接下来是日志格式本身,为了便于阅读,分为三行。Nginx公开了有关以美元符号开头的命名系统变量中所有请求的信息。在将请求详细信息写入访问日志时,这些将被有关请求的实际信息所取代(例如,$request_addr将替换为访问者的IP地址)。

上面的格式与前面讨论的通用日志格式相同,只有一个区别:在最后添加了$request_time系统变量。Nginx使用此变量来存储请求花费的时间(以毫秒为单位),并且通过在我们的日志格式中使用此变量,我们告诉Nginx将该信息写入日志文件。

现在我们在Nginx配置中定义了一个名为timed的自定义日志格式,但默认服务器块尚未使用此格式。接下来,打开服务器块Nginx配置文件。

sudo nano /etc/nginx/sites-available/default

找到我们之前修改的配置块server,并将timed日志格式名称添加到access_log设置中:

. . .
# Default server configuration
#
​
server {
    listen 80 default_server;
    listen [::]:80 default_server;
​
    access_log /var/log/nginx/default-access.log timed;
    error_log /var/log/nginx/default-error.log;
. . .

保存并关闭文件以退出。

要启用新配置,请重新启动Nginx。

sudo systemctl restart nginx

现在一切都已设置好,让我们检查它是否有效。

第5步 - 验证新配置

我们可以通过调用对Nginx的一些请求来测试新配置curl,就像我们在第2步中所做的那样。这次我们将使用在步骤1中创建的示例文件:

curl -i http://localhost/empty.test
curl -i http://localhost/1mb.test
curl -i http://localhost/10mb.test
curl -i http://localhost/100mb.test

您会注意到每个后续命令将花费更长的时间来执行,因为文件变大所以传输它们需要更多时间。

让我们在执行这些请求后显示访问日志。

sudo tail /var/log/nginx/default-access.log

日志现在将包含更多行,但最后四行将对应您刚刚执行的测试请求。

127.0.0.1 - - [04/Jul/2016:14:57:02 -0400] "GET /empty.test HTTP/1.1" 200 0 "-" "curl/7.47.0" 0.000
127.0.0.1 - - [04/Jul/2016:14:57:51 -0400] "GET /1mb.test HTTP/1.1" 200 1048576 "-" "curl/7.47.0" 0.000
127.0.0.1 - - [04/Jul/2016:14:57:57 -0400] "GET /10mb.test HTTP/1.1" 200 10485760 "-" "curl/7.47.0" 1.901
127.0.0.1 - - [04/Jul/2016:14:58:52 -0400] "GET /100mb.test HTTP/1.1" 200 104857600 "-" "curl/7.47.0" 49.232

您将看到每次路径都不同,显示正确的文件名,每次请求大小都会增加。重要的部分是最后突出显示的数字,即我们刚刚以自定义日志格式配置的请求处理时间(以毫秒为单位)。正如您所期望的那样,文件越大,传输所需的时间就越长。

如果是这种情况,您已成功在Nginx中配置自定义日志格式!

结论

虽然看到更大的文件需要更长的传输时间并不是特别有用,但当Nginx用于服务动态网站时,请求处理时间可能非常有用。它可以用来跟踪网站的瓶颈,并很容易地找到比应该花的时间更长的请求。

$request_time只是Nginx公开的许多系统变量之一,可以在自定义日志记录配置中使用。其他包括,例如,响应发送到客户端的响应标头的值。将其他变量添加到日志格式就像将它们放入日志格式字符串一样简单,就像我们添加$request_time一样。它是一个功能强大的工具,您可以在为网站配置日志记录时使用它。

Nginx日志模块文档中描述了可与Nginx日志格式一起使用的变量列表。

更多Ubuntu 教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Add the log Module to Nginx on Ubuntu 16.04

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Pythonista

Linux之文档与目录结构

Linux目录结构的组织形式和Windows有很大的不同。首先Linux没有“盘(C盘、D盘、E盘)”的概念。已经建立文件系统的硬盘分区被挂载到某一个目录下,用...

1493
来自专栏C/C++基础

GitHub Desktop常见用法

这里记录我使用git的点滴,以需要完成的功能为切入点来讲解需要使用的命令,供日后参考,当然再结合“git命令大全”这类较全面的git命令介绍的文章,会更好的熟悉...

2143
来自专栏技术之路

[个人翻译]Redis 集群教程(上)

   官方原文地址:https://redis.io/topics/cluster-tutorial    水平有限,如果您在阅读过程中发现有翻译的不合理的地...

2529
来自专栏章鱼的慢慢技术路

Linux中的环境变量PATH

2372
来自专栏哈雷彗星撞地球

Node.js 撸第一个Web应用

使用Node.js 创建Web 应用与使用PHP/Java 语言创建Web应用略有不同。 使用PHP/Java 来编写后台代码时,需要Apache 或者 Ng...

1004
来自专栏云计算教程系列

如何在CentOS 7上编写自定义系统审计规则

Linux审计系统创建审计跟踪,这是一种跟踪系统上各种信息的方法。它可以记录大量数据,如事件类型,日期和时间,用户ID,系统调用,进程,使用的文件,SELinu...

5152
来自专栏IT可乐

Redis详解(一)------ redis的简介与安装

  工作中一直在用 Redis,但是一直没有进行系统的总结,这个系列的博客将整体的介绍 Redis 的用法。

1830
来自专栏Pythonista

Golang之go 命令用法

(注:实际上,package名在Go语言规范中指代码中“package”后使用的名称,此名称可以与文件夹名不同。默认生成的可执行文件名是文件夹名。)

7942
来自专栏杂烩

Redis linux下安装配置 原

make命令执行完成后,会在当前目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-sta...

712
来自专栏ytkah

30个redis.conf 配置项说明

1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程

1023

扫码关注云+社区

领取腾讯云代金券