如何在Debian 8上将log日志模块添加到Nginx

介绍

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

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

在本教程中,我们将了解如何使用Nginx的log日志记录模块。我们将为不同的服务器块设置单独的log日志文件,然后自定义log日志记录输出。我们还将向访问log日志添加有关请求的附加信息(在本教程的示例中,提供请求所需的时间),超出Nginx默认包含的范围。

准备

要学习本教程,您需要:

  • 一个包括可以使用sudo命令的非root用户的Debian 8服务器
  • 安装Nginx。 没有服务器的用户可以购买和使用腾讯云服务器

第一步 - 创建测试文件

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

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

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

让我们使用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

我们将在下一步中使用这些文件使用默认配置填充log日志文件,然后稍后演示自定义配置。

第二步 - 了解默认配置

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

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

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

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

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

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

Nginx response headers

HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Fri, 09 Dec 2016 23:05:18 GMT
Content-Type: application/octet-stream
Content-Length: 0
Last-Modified: Fri, 09 Dec 2016 23:05:13 GMT
Connection: keep-alive
ETag: "584b38a9-0"
Accept-Ranges: bytes

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

  • HTTP/1.1 200 OK告诉我们Nginx会回复200 OK状态代码是告诉我们没有错误。
  • Content-Length: 0 表示返回的文档为零长度。
  • 请求已在Fri, 09 Dec 2016 23:05:18 GMT上处理完毕。

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

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

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

Access log entry

127.0.0.1 - - [09/Dec/2016:23:07:02 +0000] "GET /empty.test HTTP/1.1" 200 0 "-" "curl/7.38.0"

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

从左到右,类别是:

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

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

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

接下来,我们将覆盖默认log日志记录配置(其中Nginx为所有请求存储一个访问日志文件),并使Nginx存储单独的log日志文件,用于Nginx安装附带的默认服务器块。

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

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

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

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

/etc/nginx/sites-available/default

. . .
# Default server configuration
#

server {
    listen 80 default_server;
    listen [::]:80 default_server;

. . .

并将红色标记的两行添加到配置中:

/etc/nginx/sites-available/default

. . .
# 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),但使用不同的文件名。如果您有多个服务器块,最好以一致且有意义的方式命名日志文件,例如使用文件名中的域名。

保存并关闭文件以退出。

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

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

$ sudo systemctl restart nginx.service

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

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

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

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

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

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

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

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

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

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

添加以下内容:

/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设置指令定义了新的log日志格式。下一个元素是此格式的唯一标识符;这里我们使用的是timed,但您可以选择任何名称。

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

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

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

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

找到server我们之前修改的配置块,并将timed日志格式名称添加到access_log设置中,如下面突出显示为红色:

/etc/nginx/sites-available/default

. . .
# 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.service

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

第五步 - 验证新配置

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

$ 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

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

Access log entries

127.0.0.1 - - [09/Dec/2016:23:07:02 +0000] "GET /empty.test HTTP/1.1" 200 0 "-" "curl/7.38.0"
127.0.0.1 - - [09/Dec/2016:23:08:28 +0000] "GET /empty.test HTTP/1.1" 200 0 "-" "curl/7.38.0" 0.000
127.0.0.1 - - [09/Dec/2016:23:08:28 +0000] "GET /1mb.test HTTP/1.1" 200 1048576 "-" "curl/7.38.0" 0.000
127.0.0.1 - - [09/Dec/2016:23:08:28 +0000] "GET /10mb.test HTTP/1.1" 200 10485760 "-" "curl/7.38.0" 0.302
127.0.0.1 - - [09/Dec/2016:23:08:39 +0000] "GET /100mb.test HTTP/1.1" 200 68516844 "-" "curl/7.38.0" 7.938

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

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

结论

虽然看到更大的文件需要更长的传输时间并不是特别有用,但是当使用Nginx为动态网站提供服务时,请求处理时间非常有用。它可用于跟踪网站中的瓶颈,并轻松查找花费时间超过应有的请求。

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


参考文献:《How To Add the log Module to Nginx on Debian 8》

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT派

看完这篇文章还能不懂Flask这种Web框架吗?

Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于...

852
来自专栏应用案例

Linux常用软件安装总结

首先说xshell一个好用的功能,如果你同时要管理几台一样的服务器组成的集群,一台一台操作很麻烦,可以使用xshell菜单栏——工具——勾选发送键输入到所有会话...

3198
来自专栏程序员叨叨叨

一招搞定Windows无法安装到GPT分区形式磁盘疑难

今天给堂弟的电脑重装系统时,遇到了以往USB安装系统经常出现的问题,“Windows无法安装到这个磁盘。选中的磁盘采用GPT分区形式”。之前在CSDN的博客上有...

702
来自专栏吴伟祥

Linux系统关机过程 原

最常用的Linux关机命令用init、shutdown、halt和reboot等。这些命令都可以达到关机重启的目的,但是每个命令的内部工作过程是不同的。下面就详...

1131
来自专栏Flutter入门到实战

React Native初探--从安装运行首个app到填坑指南

好多人说rn好用,一直要推荐我用,我就不信了,来安装玩一下试试效果。实践出真知!安装过程各种坑,工具太多了,太麻烦了,差点放弃(还好坚持下来呢)。

1723
来自专栏jmeter高手高高手

Jmeter(二十二)_jenkins配置gitlab插件与ant插件

服务器中的Jenkins通过Gitlab插件读取远程Git远程仓库中的代码,然后通过ant插件进行构建

1223
来自专栏JavaEdge

Spring Data JPA踩坑记:与Bootstrap Table的分页协作@PersistenceContext和@Resource的区别

注入一堆保存实体类状态的数据结构,针对实体类的不同状态(四种,managedh或detached等)可以做出不同的反应(merge,persist等等),其实就...

1171
来自专栏Laoqi's Linux运维专列

NFS客户端创建文件属主显示nobody

相信使用CentOS6搭建NFS的朋友大多都遇到过如此问题,NFS服务搭建好后,在客户端挂载成功了,但是创建文件时,属主和属组却显示为nobody。 这是NFS...

3627
来自专栏谈补锅

http协议笔记

1、连接(Connection):浏览器和服务器之间传输数据的通道。一般请求完毕就关闭,http不保持连接,不保持连接会降低处理速度(因为建立连接速度很慢),保...

1724
来自专栏散尽浮华

Gitlab上采用rpm方式快速安装的操作记录

之前梳理了一篇Gitlab的安装CI持续集成系统环境---部署Gitlab环境完整记录,但是这是bitnami一键安装的,版本比较老。下面介绍使用rpm包安装G...

2535

扫码关注云+社区

领取腾讯云代金券