[nginx] 讲解访问日志的查看、设置、位置等
目录
大家好。
我是系统解决方案部门的一名成员,每天,当我不想睡觉时就会犯困,而当我想睡觉时却难以入睡。
这次我们说到Web服务器的运维,肯定会说到我们经常接触到的“访问日志”。
其中,我想介绍一下如何查看、配置和定位nginx的访问日志,近几年来,nginx在全球市场份额上终于超越了Apache。
测试环境
- Linux环境
操作系统:AlmaLinux版本9.2(VirtualBox 7.0.12环境)
中间件:nginx(1:1.20.1-14.el9_2.1.alma.1),HTTP(80) - 浏览器
:120.0.6099.217(官方版本)(64位)
测试页
- 域名:example.com
* 因为是localhost环境,通过重写hosts来访问 - HTML:index.html(首页)、FAQ.html(常见问题解答页面)
Nginx访问日志位置及日志示例
默认访问日志位置是“/var/log/nginx/access.log”。
如果您想先检查访问日志,我们建议使用 less load 命令打开它。
少/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) ,如 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,如 Gecko)Chrome/120.0.0.0 Safari/537.36" "-"
我在本地环境中构建了一个接受 example.com 的网站,并在从浏览器访问时摘录了一些日志。
这是访问 example.com 的首页 (index.html) 和 FAQ 页面 (FAQ.html) 时的日志输出。
第一个IP地址和时间很容易理解,但其余的可能很难理解,所以我将通过与设置项进行比较来解释它们。
关于设置日志格式(log format)
nignx的基本配置文件是“/etc/nginx/nginx.conf”。
其中,“log_format”指令(设置)定义了访问日志的格式。
*还定义了访问日志输出目的地。
less /etc/nginx/nginx.conf ~摘录~ 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的时候会记录LB IP。 |
- | 分隔符连字符 | - | |
$远程用户 | 为基本身份验证指定的用户名 | - (空白的) |
开发和维护的时候 经常会用到Basic认证基本是空的。 |
[$time_local] | [处理完成时的当地时间+时区] | [2024 年 1 月 17 日:08:27:22 +0000] |
“+0000”部分是时差, “+0000”是UTC(标准时间) ,“+0900”是JST(日本时间)。 |
“$请求” | “请求内容” (方法、请求路径、HTTP版本) |
“获取/FAQ.html HTTP/1.1” |
这意味着已使用“HTTP/1.1”接收到对“FAQ.html”的“GET”(显示)请求 |
$状态 | “状态码” | 200(成功) | |
$body_bytes_sent | “发送到客户端的字节数” | 34(字节) | FAQ.html等 主要数据(主体)部分的字节数 |
“$http_referer” | “Referrer” (访问源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(操作系统)上的 Chrome浏览器访问 。 |
“$http_x_forwarded_for ” | “X-Forwarded-For” (源IP ) |
"-" | 当经过Proxy或LB时, 会显示之前的源IP地址。 |
有很多可用的信息
上表可以更简洁地总结如下。
- 知识产权 : 192.168.33.1
- 用户名:无(=未经过身份验证)
- 访问时间:2024年1月17日08:27:22,UTC(日本时间+9小时)
- 访问目的地:常见问题解答网站页面(FAQ.html)
- 连接状态:成功(200)
- 数据量:4B(字节)
- 访问来源:首页(http://example.com)
- 环境:使用Chrome浏览器的Windows操作系统(声明)
- 是通过LB还是Proxy吗?不是通过LB或Proxy(因为它是空的)
这样,就可以从访问日志中获取相当多的信息了。
通过聚合这些不同类型,可以调查访问趋势以及是否存在恶意访问。
默认的日志格式非常方便,请使用它。
术语解释
基本认证
这是一个简单的身份验证功能,需要您输入预定义的用户名和密码名称。
由于它是一个最小且简单的物品,因此用于临时目的,例如在施工或紧急维护期间。
特别是HTTP(80)通信,认证信息也是以明文形式(未加密)发送,安全性较弱。
即使是临时使用该站点时,也希望该站点仅支持 HTTPS (443) 通信。
推荐人
指向先前的 URL,并带有指向所访问页面的链接。
如果您从 Google 搜索打开主页,则 Google URL 将记录在日志中,如果您从网站主页打开常见问题解答,则主页的 URL 将记录在日志中。
该术语最初是英语单词“referrer”(意思是:referrer)的拼写错误,但它有一个有趣的历史,并且至今仍在使用,因为在开发规范时决定将其视为拼写错误。
HTTP 状态代码
这是一段代码,告诉您 HTTP(S) 通信时的处理结果。
列出所有内容会太长,因此我将省略它,但第三位数字很重要。
- 2xx:成功响应
- 3xx:重定向响应
- 4xx:客户端错误响应
- 5xx:服务器错误响应
如上图,通过第三位数字就可以大致判断出情况。
您将看到的最常见代码是 200(成功)、302(临时重定向)、404(无法访问不存在的位置)和
503(服务器无法处理)。
用户代理
用户代理这个术语是指“用于与网站通信的软件”。
通常,网站是使用浏览器访问的,因此该信息被视为“有关用户正在使用的浏览器的信息(以及有关操作系统的信息等)”。
X-转发-For
这是LB或Proxy通信时描述源IP的一项(头)。
当LB或Proxy等客户端(用户)与Web服务器之间插入通信时,Web服务器端会记录LB或Proxy的IP,但其前面的源客户端的IP是未知的。 。
因此,在通过LB或者Proxy进行通信时,源IP保存在X-Forwarded-For已经成为事实上的标准
旁注:关于在日志格式中定义名称“main”
为什么要定义名称?关于这一点,``配置日志输出时,要使用的日志格式是通过名称指定的。''
less /etc/nginx/nginx.conf ~摘录~ access_log /var/log/nginx/access.log main;
它用在“access_log”指令中,该指令是指定日志输出目的地的设置(指令)。由于要定义的项目和要使用的项目不同,因此需要命名。
换句话说,可以设置多个定义。
例如,您可以通过减少不必要的信息来定义名称为“easy”的简化日志格式,或者相反,如果您想要更详细的信息,则可以将具有更多日志项(变量)的格式定义为“detailed”。
因此,您可以为每个域和环境使用不同的定义。
如果您未在 access_log 指令中指定格式名称,会发生什么情况?
有人可能会说,“这是一个没有指定格式名称的环境”。
这种情况下,语法检查或者操作都没有问题。
在此 access_log 指令中未指定格式名称则默认设置为“combined”定义,该定义未写入conf 中,但已包含在内
log_format 组合 '$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