day47 nginx日志的学习

day47 nginx日志的学习

访客的日志

nginx处理日志模块的教程

http {

​ server{

​ access_log XXX;}

​ server{

​ access_log XXX;}

}

提取请求报文中的用户的信息

  1. 记录nginx日志的格式的变量,以及作用,可以拿到什么信息
  2. 如何,开启和关闭日志的功能
  3. 针对作业2创建的虚拟的主机,都单独配置一个日志,且可以正常的记录,不得记录错误。
  4. 如何针对所有的虚拟的主机生效的日志配置。

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地址

当你发现公司的服务端的流量暴涨,夜里的服务器很卡。就需要

运维人员根据这日志进行分析,然后做出处理。


生产环境的日志的实践经验

问题 :客户反应,你们的产品夜里就特别的卡登录不了。

分析:

  1. 根据虚拟主机的日志,过滤出每天夜里2点到3点之间的日志的记录。
  2. 5万条日志,基于awk的提取的分析,提取出用户(ip, 请求的客户端, refer,状态码)
  3. 根据nginx的内在的变量,提取客户端的信息。
  4. 排序,统计。

解决

1.部分IP的请求的频率过高,次数过多,明显是非人为的访问,在根据该IP的user-agent(HTTP的客户端的信息,浏览器的型号)判断是不是爬虫等计算机技术(对方设置的伪造的代理,假的user-agent)

因该还基于nginx的x-forward-for 的参数,提取用户的ip,查看是否是恶意的程序,然后找出来,基于对方的IP分析,出于什么的地域,是否是恶意的IP,然后进行nginx deny 参数拒绝访问。

判断出下面的问题

  1. 发现公司的部分的静态资源被盗链,基于日志中的refer信息,判断出哪些资源被盗链,然后设置防盗链。
  2. 基日志中提取的大量的状态码,发现40x系列特别都多。(大量的访问的用户的资源端都出现错误,公司的url的更新了,但是未作301的跳转,导致用户的收藏夹的url依旧是旧的,导致用户的访问出现了问题。)
  3. 大量的30系列的状态码,也有一定的问题,也是基本因为url的更新的问题。
  4. 50系列的状态码错误特别多,nginx的后端的代理,必然出来问题,需要和开发对接,找出接口是否出现故障。
  5. 大量的都是20x系列的状态码。那则是nginx的架构,公司的技术的架构没什么的问题,client 的请求和响应都正常的解析。

(网站的带宽,不足,服务器的流量的水管太小了)

(从硬件的角度,配置太低了,服务器的连接数量太大了。内存cpu的压力太大了,对后续的框架的拆分,扩充机器的数量,提升机器的配置。)


开启,关闭日志的功能(先看默认的日志的功能怎么用)

逐步的分析,主配置的文件

  1. 这里直接看access_log的访问的日志 -- cat /etc/nginx/nginx.conf
  2. 检测虚拟主机的配置的文件

[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页面优化

posted @ 2025-04-06 18:34  国家一级冲浪yzk  阅读(58)  评论(0)    收藏  举报