[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

【超过500家企业部署】AWS搭建、运维、监控服务

【超过500家企业部署】AWS搭建、运维、监控服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

[仅适用于 WordPress] 云服务器“Web Speed”

[仅适用于 WordPress] 云服务器“Web Speed”

[便宜]网站安全自动诊断“快速扫描仪”

[便宜]网站安全自动诊断“快速扫描仪”

[预约系统开发] EDISONE定制开发服务

[预约系统开发] EDISONE定制开发服务

[注册100个URL 0日元] 网站监控服务“Appmill”

[注册100个URL 0日元] 网站监控服务“Appmill”

【兼容200多个国家】全球eSIM“超越SIM”

【兼容200多个国家】全球eSIM“超越SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

【全球专属服务】Beyond北美及中国MSP

【全球专属服务】Beyond北美及中国MSP

[YouTube]超越官方频道“美由丸频道”

[YouTube]超越官方频道“美由丸频道”

[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

如果您觉得这篇文章有帮助,请点赞!
8
加载中...
8 票,平均:1.00 / 18
18,947
X Facebook 哈特纳书签 口袋
[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

写这篇文章的人

关于作者

里面

2022 年加入 Beyond 职业生涯 属于
系统解决方案部门
LPIC-3 我有 304 和 AWS SAA 我的
常规饮料只有三种选择:牛奶、可乐和红茶。