day47 nginx日志的学习
day47 nginx日志的学习
访客的日志
nginx处理日志模块的教程

http {
server{
access_log XXX;}
server{
access_log XXX;}
}
提取请求报文中的用户的信息
- 记录nginx日志的格式的变量,以及作用,可以拿到什么信息
- 如何,开启和关闭日志的功能
- 针对作业2创建的虚拟的主机,都单独配置一个日志,且可以正常的记录,不得记录错误。
- 如何针对所有的虚拟的主机生效的日志配置。
nginx日志变量的格式和作用
找到nginx所有的内在的变量,以及解释
https://nginx.org/en/docs/
https://nginx.org/en/docs/http/ngx_http_core_module.html#var_remote_addr
当你的nginx访客的日志,需要记录到更多的 用户的请求的信息的时候,你可以来这里找找看,
下面是nginx.conf中日志的信息
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
参数的解释
$remote_addr -------> 看到这个请求是从那个ip发来的。
-----------------------开始咯---------------------
$remote_addr 记录访问网站用户的ip地址
$remote_user 记录远程用户端用户的名称
$time_local 记录访问的时间
$request 记录用户的http请求起始行信息(请求方式,http协议)
$status 记录http的状态码,就是返回的状态 ---200,404,202.
$ body_byte_sent 记录服务器发送给客户端的响应
$http_referer 记录这次请求是从哪个连接访问过来的,可以根据 refer 进行防盗链的设置
$http_user_agent 记录客户端访问的信息,如浏览器,手机的客户端。
$http_x_forwarded_for 记录前端的代理的服务器设置web节点记录客户端的地址的配置,此参数生效前的是代理服务器上也进行相关的 x_forwarded_for 的设置。
------------备注----------------
$remote_adddr 可能拿到的是反向代理的ip的地址
$http_x_forwarded_for 可以获取客户端的真实的ip地址

当你发现公司的服务端的流量暴涨,夜里的服务器很卡。就需要
运维人员根据这日志进行分析,然后做出处理。
生产环境的日志的实践经验
问题 :客户反应,你们的产品夜里就特别的卡登录不了。
分析:
- 根据虚拟主机的日志,过滤出每天夜里2点到3点之间的日志的记录。
- 5万条日志,基于awk的提取的分析,提取出用户(ip, 请求的客户端, refer,状态码)
- 根据nginx的内在的变量,提取客户端的信息。
- 排序,统计。
解决
1.部分IP的请求的频率过高,次数过多,明显是非人为的访问,在根据该IP的user-agent(HTTP的客户端的信息,浏览器的型号)判断是不是爬虫等计算机技术(对方设置的伪造的代理,假的user-agent)
因该还基于nginx的x-forward-for 的参数,提取用户的ip,查看是否是恶意的程序,然后找出来,基于对方的IP分析,出于什么的地域,是否是恶意的IP,然后进行nginx deny 参数拒绝访问。
判断出下面的问题
- 发现公司的部分的静态资源被盗链,基于日志中的refer信息,判断出哪些资源被盗链,然后设置防盗链。
- 基日志中提取的大量的状态码,发现40x系列特别都多。(大量的访问的用户的资源端都出现错误,公司的url的更新了,但是未作301的跳转,导致用户的收藏夹的url依旧是旧的,导致用户的访问出现了问题。)
- 大量的30系列的状态码,也有一定的问题,也是基本因为url的更新的问题。
- 50系列的状态码错误特别多,nginx的后端的代理,必然出来问题,需要和开发对接,找出接口是否出现故障。
- 大量的都是20x系列的状态码。那则是nginx的架构,公司的技术的架构没什么的问题,client 的请求和响应都正常的解析。
(网站的带宽,不足,服务器的流量的水管太小了)
(从硬件的角度,配置太低了,服务器的连接数量太大了。内存cpu的压力太大了,对后续的框架的拆分,扩充机器的数量,提升机器的配置。)
开启,关闭日志的功能(先看默认的日志的功能怎么用)
逐步的分析,主配置的文件
- 这里直接看access_log的访问的日志 -- cat /etc/nginx/nginx.conf
- 检测虚拟主机的配置的文件
[root@web-8 ~]# ls /etc/nginx/conf.d/
88port.conf default.conf dnf.conf huoying.conf lol.conf
此时我们的虚拟主机未配置日志的文件的功能。
[root@web-8 ~]# grep 'access_log' /etc/nginx/conf.d/*
/etc/nginx/conf.d/default.conf: #access_log / var/log/nginx/host.access.log main;
重启nginx的服务,查看默认的日志的功能
systemctl restart nginx
检测日志
tail -f /var/log/nginx/access.log

下面是关闭日子的功能
有时候在代理服务器上,转发到服务器上是不需要日志的,nginx日志可以不用记录的,
还有一点,节省磁盘的io的空间。
开启日志的时候
access_log 和 log_format main 这个要同时的开启
关闭的时候
只要注释 #access_log 即可
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#access_log /var/log/nginx/access.log main;
access_log off;
修改nginx的日志的格式
自己添加,可以捕获更多的客户端的信息
# 参看的官方的文档
https://nginx.org/en/docs/
https://nginx.org/en/docs/http/ngx_http_core_module.html#var_remote_addr
当你的nginx访客的日志,需要更多的clinet请求的信息,你可以来这里寻找,添加更多的变量,加入到如下的格式化的参数中。
log_format main '$document_uri $remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
单个虚拟的主机,记录日志
针对每一虚拟的主机,单独记录的日子的文件,便于分类的管理。
正确的日志使用的姿势如下。

语法就是,将日志的格式的配置的参数,不写在http{}的主配置的文件中,而是写在各自的server{}的虚拟的主机中。
1. 去掉nginx.conf 中的日志的配置
# http{} 中nginx.conf 中简单化
#log_format的参数依旧写在http{}中,可以利用include语法实现。
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
2.针对每一个虚拟的主机,添加日志的格式的参数,主要是,分别写入到不同的日志文件中。
log_format main '$document_uri $remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
# 开启日志的功能以及存放的路径,参数写在server{}内
access_log /var/log/nginx/dnf.linux0224.access.log main;
listen 80;
server_name dnf.linux0224.cc;
location / {
root /www/dnf;
index index.html
}
}
3. 单独记录lol域名业务的访客日志
[root@web-8 /etc/nginx/conf.d]#cat lol.linux0224.conf
log_format main2 '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
access_log /var/log/nginx/lol.linux0224.cc.access.log main2;
listen 80;
server_name lol.linux0224.cc;
charset utf-8;
location / {
root /www/lol/;
index index.html;
}
}
4.注意,开启access_log日志的参数,可以写在server{}区域里,但是日志格式化的参数,只能写在http{}区域中
测试不同虚拟主机的日志记录
现在有2个虚拟主机,单独记录了日志

看你如何涉及了,你是继续针对每一个虚拟主机,添加日志
遵循上述讲解的语法
1. 给dnf和lol这两个三级域名,子业务的网站,单独记录访客日志
-rw-r--r-- 1 root root 3310 May 19 14:55 dnf.linux0224.cc.access.log
-rw-r--r-- 1 root root 2341 May 19 14:55 lol.linux0224.cc.access.log
2. 剩余其他的虚拟主机日志,全部统一记录到 /var/log/nginx/accesss.log
如下写法,就会去记录,除了你单独指定的虚拟主机的日志,剩下的日志,都会写入到这个accesss.log 文件中
其实就是在子虚拟主机的配置的文件中添加all-main 的格式即可
access_log 的文件
在主配置的文件中配置好日志的文件的格式,如果不需要单独的日志,则可以使用主配置文件中的日志的格式。
# 检测所有的日志
[root@web-8 /var/log/nginx]#tail -f /var/log/nginx/*
# nginx的配置,存在虚拟主机的匹配,匹配到谁,就读取谁的配置。
# 只要是ip符合,port符合,并且有优先级加载顺序,就能匹配上
10.0.0.8:80 这个ip
你只要构造符合条件的 请求即可。
第一种虚拟主机,符合 10.0.0.8:80
第二种虚拟主机。符合,修改了端口的 10.0.0.8:81 10.0.0.8:82
第三种虚拟主机,符合修改了ip的 10.0.0.88:80
这里能看懂 扣 6 不懂 7
练习的目的,在于搞懂,你有几个虚拟主机,以及你的请求,与哪一个虚拟主机匹配上了。
# 单独给 lol.linux0224.cc 设置了日志
# 单独给 dnf.linux0224.cc 设置了日志
# 其他的虚拟主机,就会默认匹配 http{ 设置的全局 日志参数了}
如果你认为,默认的日志和单独的日志太混乱了,
你就这样做,每一个虚拟的主机,单独设置日志的参数,就ok
不用去关心默认的日志,记录一堆的网站的请求而已,也没有实际的意义
只有针对单个的网站的业务,记录的日志才有意义,才有提取和分析的价值
nginx 提供的日志
记录用户的访问记录, access_log
记录用户的错误的访问的日志 error_log
关于该该参数的说法。
https://nginx.org/en/docs/ngx_core_module.html#error_log
和access_log 用法是一样的
http{}
server{} 区域里面
具体的level是指,日志记录的详细程度
有这些值让你填写
debug, info, notice, warn, error, crit, alert
从左到右,详细程度分别是 从 大 >>> 小
debug 会记录超级详细的信息,没必要,占用大量的磁盘空间
crit 表示nginx以及出现严重错误,以及崩溃了,才记录日志。。记录的内容太少
一般用的,以及默认的就是error日志级别,能够记录基本的,常见错误。
错误日志
1. 如何开启error级别的错误日志。
# 单独给的lol虚拟主机网址,设置错误日志,eroor级别 ,配置如下
# 支持写入http{} server{}
[root@web-8 /etc/nginx/conf.d]#cat lol.linux0224.conf
log_format main2 '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
access_log /var/log/nginx/lol.linux0224.cc.access.log main2;
error_log /var/log/nginx/lol-error.log error;
listen 80;
server_name lol.linux0224.cc;
charset utf-8;
location / {
root /www/lol/;
index index.html;
}
}
重启服务
[root@web-8 /etc/nginx/conf.d]#systemctl restart nginx
检查日志
[root@web-8 /etc/nginx/conf.d]#tail -f /var/log/nginx/lol-error.log
错误日志的,特点是记录,访问时的出错信息
2. 如何单独给作业2的每一个虚拟主机设置错误日志。
404页面的优化,err_page模块
-
错误的页面的优化,nginx默认访问出错后,会返回不同的错误的页面。
40x 系列的页面
404 not found 服务器上找不到该资源
403 forbidden 禁止访问(权限不够,找权限的问题)
50 系列的页面
这个要等到nginx的反向的代理
对其优化默认的错误的界面
http://nginx.org/cn/docs/http/ngx_http_core_module.html
给全局设置、给虚拟主机设置。
1. 如何单独设置40x错误的页面优化
2. 如何设置50x系列的错误页面
淘宝的错误页面

语法 -----这是相对的文件路径
# error_page 相应的状态码, 相对路径的html文件 /填入url
error_page 404 /www/error/404.html
error_page 500 /www/error/50x.html
优化错误的页面,指向本地的html的文件
针对lol的虚拟主机设置
[root@web-8 ~]#cat /etc/nginx/conf.d/lol.linux0224.conf
log_format main2 '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 当404错误时,返回当前机器上的my404.html
# 当403错误时,跳转到淘宝这个错误页面上
server {
access_log /var/log/nginx/lol.linux0224.cc.access.log main2;
error_log /var/log/nginx/lol-error.log error;
error_page 404 /my404.html;
error_page 403 https://error.taobao.com/app/tbhome/common/error.html;
listen 80;
server_name lol.linux0224.cc;
charset utf-8;
location / {
root /www/lol/;
index index.html;
}
}
cat
# 创建404错误页面
echo "我是美丽的404错误页面,你访问的资源不存在该服务器上!!!请检查你的URL" > /www/lol/my404.html
[root@web-8 ~]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web-8 ~]#
[root@web-8 ~]#
[root@web-8 ~]#systemctl restart nginx
再次测试错误页面,针对lol这个虚拟主机
404错误页面
从网站优化,用户体验角度设置的功能
403错误的设置
指定跳转到另一个url,


403指定跳转到当前机器的一个文件
[root@web-8 /etc/nginx/conf.d]#cat lol.linux0224.conf
log_format main2 '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
access_log /var/log/nginx/lol.linux0224.cc.access.log main2;
error_log /var/log/nginx/lol-error.log error;
error_page 404 /my404.html;
error_page 403 /my403.html;
listen 80;
server_name lol.linux0224.cc;
charset utf-8;
location / {
root /www/lol/;
index index.html;
}
}
最后的测试。403,和404页面优化

浙公网安备 33010602011771号