[nginx] 说明如何查看、配置和查找访问日志

目录
大家好,
我是系统解决方案部的中野。我每天都过着这样的生活:不想睡的时候困得不行,想睡的时候却睡不着。
这次,我们将讨论“访问日志”,在操作和维护 Web 服务器时,您肯定会经常接触到它。
其中,近年来,nginx 终于在全球市场份额上超越了 Apache,我想解释一下如何查看、配置和定位 nginx 访问日志。
测试环境
- Linux 环境
操作系统:AlmaLinux 9.2 版(VirtualBox 7.0.12 环境)
中间件:nginx (1:1.20.1-14.el9_2.1.alma.1),HTTP(80) - 浏览器:
Chrome:120.0.6099.217(正式版本)(64 位)
测试页
- 域名:example.com
*由于是本地主机环境,访问需要修改 hosts 文件。 - HTML:index.html(首页),FAQ.html(常见问题解答页面)
nginx 访问日志的位置和日志示例
访问日志的默认位置是“/var/log/nginx/access.log”。
如果您只想快速查看访问日志,建议使用资源占用较少的 less 命令打开它们。
删除 /var/log/nginx/access.log
1️⃣ URL:example.com (index.html) 访问日志
192.168.33.1 - - [17/Jan/2024:08:47:50 +0000] "GET / HTTP/1.1" 200 37 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
2️⃣ index.html(页面内链接)→ FAQ.html 访问日志
192.168.33.1 - - [17/Jan/2024:08:50:33 +0000] "GET /FAQ.html HTTP/1.1" 200 34 "http://example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
我在本地环境中创建了一个网站,该网站接受来自 example.com 的请求,并从浏览器中访问该网站时摘录了一些日志。
这是从 example.com 的首页 (index.html) 和 FAQ 页面 (FAQ.html) 访问时输出的日志。
初始 IP 地址和时间很容易理解,但其余部分可能比较难理解,所以我将通过与设置项进行比较来解释它们。
日志格式设置
nginx 的基本配置文件是“/etc/nginx/nginx.conf”。
其中,“log_format”指令(设置)定义了访问日志的格式(样式)。
* 访问日志的输出目标位置也在此处定义。
less /etc/nginx/nginx.conf ~Excerpt~ http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
“log_format main”部分将格式名称定义为“main”。
接下来是输出内容的格式(语法),由[nginx变量+连字符、括号等用于格式化显示]组成。
日志格式说明/与访问日志的比较表 2️⃣
| 日志格式 | 内容 | 访问日志 2️⃣ 值 | 备注栏 |
| 远程地址 | 已连接的 IP 地址 | 192.168.33.1 | 因为 IP 地址是直接发出请求的地址,所以 如果请求通过负载均衡器 (LB),则会记录负载均衡器的 IP 地址。 |
| - | 分隔符 | - | |
| 远程用户 | 基本身份验证指定的用户名 | - (空白的) | 使用 在开发和维护期间 基本上是空的。 |
| [$time_local] | 处理完成时的当地时间 | [2024年1月17日 08:27:22 +0000] |
“+0000”部分表示时间差。 “+0000”是UTC(世界协调时) ,“+0900”是JST(日本标准时间)。 |
| “$request” | 请求详情 (方法、请求路径、HTTP 版本) |
"GET /FAQ.html HTTP/1.1" |
已使用“HTTP/1.1”收到对“FAQ.html”的 GET(显示)请求 这意味着 |
| 状态 | 状态码 | 200(成功) | |
| 已发送的字节数 | “已发送至客户端的字节数” | 34(字节) | FAQ.html 等文件的 主要数据(正文)部分包含的字节数。 |
| "$http_referer" | “来源网址” (访问来源的URL) |
"http://example.com/" *首页 |
访问首页 ⇨ FAQ 。 需要直接指定 URL |
| "$http_user_agent" | 用户代理 (浏览器和操作系统信息) |
“Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML,如 Gecko) Chrome/120.0.0.0 Safari/537.36” |
来自 Windows (OS) 系统上的 Chrome 浏览器的访问尝试 。 |
| "$http_x_转发_for" | "X-Forwarded-For" (源 IP 地址) |
"-" | 通过代理或负载均衡器路由时, 会显示代理之前的源 IP 地址。 |
有很多信息可供参考。
上表可以更简单地概括如下:
- IP : 192.168.33.1
- 用户名 :无(= 未通过身份验证)
- 访问时间 :2024年1月17日08:27:22(UTC,比日本标准时间早9小时)
- 访问 :常见问题解答页面 (FAQ.html)
- 连接状态 :成功(200)
- 数据大小 :4B(字节)
- 访问来源 :来自主页(http://example.com)
- 环境 :Windows操作系统,搭配基于Chrome的浏览器(如声明所述)
- 它是否经过负载均衡器或代理 ?:否(因为它是空的)
如您所见,我们可以从访问日志中获取大量信息。
通过以各种方式汇总这些数据,我们可以分析访问趋势,并判断访问尝试是否具有恶意。
默认日志格式非常有用,请务必加以利用。
术语
基本身份验证
这是一个简单的身份验证功能,需要输入预先设定的用户名和密码。它
仅用于临时用途,例如系统设置或紧急维护期间,因为它只是一种基本的、简化的身份验证方法。
尤其需要注意的是,HTTP(80) 通信存在安全漏洞,因为身份验证信息以明文(未加密)形式传输。
即使是临时使用,网站也最好仅使用 HTTPS(443) 通信。
推荐人
指的是所访问页面的前一个 URL。
如果通过 Google 搜索打开主页,则 Google 网址会被记录在日志中;如果从网站主页打开 FAQ,则主页网址会被记录在日志中。
这个术语实际上是英文单词“referrer”(意思是:参考来源)的拼写错误,但它的历史很有趣,因为在规范制定过程中,人们决定使用这种拼写错误,而且这种拼写错误一直沿用至今。
HTTP 状态码
这段代码用于告诉你执行 HTTP(S) 通信时的处理结果。
为了简洁起见,我将省略完整的代码,但第三位数字很重要。
- 2xx:响应成功
- 3xx:重定向响应
- 4xx:客户端错误响应
- 5xx:服务器错误响应
如上所示,该数字的第三位数字通常表示状态。
常见的错误代码包括 200(成功)、302(临时重定向)、404(无法访问不存在的位置)和
503(服务器无法处理)。
用户代理
用户代理一词指的是“用于与网站通信的软件”。
通常情况下,网站是通过浏览器访问的,因此从扩展意义上讲,它被视为“有关用户正在使用的浏览器(和操作系统等)的信息”。
X-转发
这是负载均衡器或代理通信时描述源 IP 的项目(标头)。
当客户端(用户)与 Web 服务器之间通过负载均衡器(LB)或代理等方式进行通信时,Web 服务器会记录 LB 或代理的 IP 地址,但它并不知道 LB 或代理之前的源客户端的 IP 地址。
因此,当流量通过负载均衡器 (LB) 或代理时, X-Forwarded-For 将源 IP 地址保存在事实上的标准已成为
附注:在日志格式中定义名称“main”
定义名称是“在配置日志输出时,要使用的日志格式由名称指定”。
less /etc/nginx/nginx.conf ~部分摘录~ access_log /var/log/nginx/access.log main;
它用于“access_log”指令中,该指令是一个设置(指令),用于指定日志输出目标。由于定义的项和使用的项目不同,因此需要一个名称。
这意味着您可以设置多个定义。
例如,您可以将简化的日志格式定义为“简单”,以减少不必要的信息;或者,如果您想要更详细的信息,您可以将包含更多项目(变量)的日志格式定义为“详细”。
这意味着您可以为每个域和环境使用不同的定义。
如果在 access_log 指令中不指定格式名称会发生什么情况?
你们中的一些人可能身处一个未指定格式名称的环境中。
在这种情况下,语法检查或操作都没有问题。
此 access_log 指令中未指定格式名称内置但未写入配置文件的“combined”定义则将使用
log_format combined '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';
上述定义的使用方法在 nginx 官方文档中有详细说明。
就内容而言,其格式与 conf 中编写的默认“main”略有不同,并且末尾没有指定“$http_x_forwarded_for”。
顺便一提,这个定义与 Apache 中的默认定义名称“combined”相同,输出内容的格式也相同。
最后
Apache 日志是我们经常接触的内容,其中包含大量信息。
相比之下,我没有太多机会接触 nginx,所以我认为整理相关信息会更方便,因此我写了这篇文章。
就我个人而言,我觉得它比 Apache 的日志格式规范更容易理解。
希望这篇文章能为读者提供一些有用的信息。
感谢您读到这里。
*如果您想了解更多关于 Nginx 的信息,也请查看这篇博客:
【超级新手指南】阅读本文,您就能轻松上手!即使是初学者也能理解的 Nginx 讲解。
参考资料
模块 ngx_http_log_module
https://nginx.org/en/docs/http/ngx_http_log_module.html
模块 ngx_http_core_module
https://nginx.org/en/docs/http/ngx_http_core_module.html
“基本”HTTP身份验证方案
https://datatracker.ietf.org/doc/html/rfc7617
引荐来源网址
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Referer
HTTP 响应状态码
https://developer.mozilla.org/ja/docs/Web/HTTP/Status
用户代理:
https://developer.mozilla.org/ja/docs/Glossary/User_agent
X-Forwarded-For
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/X-Forwarded-For
9
