自定义变量、Nginx 访问日志转换为 json 及 Nginx gzip 压缩功能(一)|学习笔记

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 快速学习自定义变量、Nginx 访问日志转换为 json 及 Nginx gzip 压缩功能

开发者学堂课程【Nginx 企业级 Web 服务实战:自定义变量、Nginx 访问日志转换为 json 及 Nginx gzip 压缩功能】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/649/detail/10760


自定义变量、Nginx 访问日志转换为 json 及 Nginx gzip 压缩功能(一)

内容简介:

一. 自定义变量

二.Nginx 自定义访问日志

三.Nginx 的压缩功能

四.测试压缩功能


一. 自定义变量

接下来讲解自定义变量,前面所提到的内置变量用到最多,有些场合可能会用到自定义变量,就是手动或人为的方式在 nginx 里面做一些变量。

应如何配置主要用到 set 命令,而 set 要用在 nginx 里指定某些值设置变量,用来生成变量。在官网中可以看到 set 的介绍:

Syntax: set $variable value;

Default: -

Context: server,location,if

$variable 为变量名,该变量名称比较特殊,需要使用 $ 来说明是一个变量名称,之后加上 value 说明值。

可以配在 server、location 或者 if 里。

演示:

演示直接调用 nginx 的内置变量

先输入 set $NAME magedu:

该变量名称必须加 $,之后加名称

或者输入 set $PORT $remote_client_port  

端口号为 $remote_client_port

也可以直接调用 Nginx 的内置变量,输入 set $IP $remote_addr,将内置变量的值再赋值给 $IP。这样写的好处是若是 Nginx 内置变量中发送变化后,配置文件不用改变。

先看第一种手动写的变量 set $NAME magedu:

要在 nginx 配置文件中添加 set,输入

vim /apps/nginx/conf/conf.d/linux39-pc.conf进入配置文件后注释掉location 中的echo $server_addr;echo $server_name;echo $server_port;

然后继续输入set $NAME magedu;

echo $NAME

之后退出输入/apps/nginx/sbin/nginx -s reload

然后来访问网址,如图

image.png

另外一种是通过内置变量直接赋值,进入配置文件后注释掉刚才输入的set和echo,输入

set $IP $remote_addr

echo $IP;

保存后退出再 reload 进行访问

页面显示结果为172.20.0.100


二.Nginx自定义访问日志

访问日志是记录客户端内用户的具体请求内容信息,全局配置模块中的 error_log 里记录 nginx 服务器进行时的日志保存路径和记录日志的 level,因此有着本质的区别。

而且 Nginx 的错误日志一般只有一个,但是访问日志可以在不同 server 中定义多个,格式以及内容都不同,如格式一只能访问浏览器类型但格式二都可以记录下来。

定义一个日志使用 access_log 特定日志的保存路径。

使用 log_format 指定日志的格式,格式中定义要保存的具体日志内容。

1.自定义默认格式日志:

在原格式中查看日志,看默认日志格式

输入tail -f /apps/nginx/logs/www.magedu.net_access.log

结果就会显示默认日志格式

格式固定行列用户可以自定义

如果要保留日志源格式,只是添加相应的日志内容,相应如下:

log_format nginx_format1’$remote_addr-$remote_user[$time_local]”$request”’

‘$status $body_bytes_sent”$http_referer”’

‘”$http_user_agent””$http_x_forwarded_for”

‘$server_name:$server_port’;

access_log logs/access.log aginx_format1;

#重启 nginx 并访问测试日志格式

==>/apps/aginx/logs/access.log<==

192.168.0.1—[22/Feb/2019:08:44:14+0800]”GET/favicon.ico.HTTP/1.1”404 162“-”

“Mozilla/5.0(Windows NT 6.1;Win64;x64;rv:65.0)Gecko/2

0100101 Firefox/65.0””-“www.magedu.net:80

2.自定义 json 格式日志:

Nginx 的默认访问日志记录内容相对较单一,默认的模式也不方便后期做日志统计分析,生产环境中通常将 nginx 转化为 json日志,然后配合使用 ELK 做日志收集,统计和分析。

json 格式在 nginx 中如下定义:

log_format access_json ‘{“@timestamp”:”$time_iso8601”}’

‘“host”:”$server_addr”,’

‘“clientip”:”$remote_addr”,’

‘“size”:$body_bytes_sent’

‘“responsetime”:$request_time,’

‘“upstreamtime”:”$upstream_response_time”’

‘“upstreamhost”:”$upstream_addr”,’ //后端服务器的 IP 地址

‘“http_host”:”$host”,’  //取出 servername

‘“uri”:”$uri”,’  //取出用户请求的 uri

‘“domain”:”$host”,’

‘“xff”:”$http_x_forwarded_for”,’//记下源地址看是否均衡

‘“referer”:”$http_referer”,’ //通过客户打开网站前所在网站即可判断搜索引擎的推广度。搜索引擎统计

‘“tcp_xff”:”$proxy_protocal_addr”,’//通过 tcp 的负载均衡获取地址

‘“http_user_agent”:”$http_usr_agent”,’//用户的浏览器类型

‘“status”:”%status”}’; //状态码

其中 @timestamp 是 key 的名称,$time_iso8601 是一个值。像 host 一样左侧的名称固定不变,右侧内容发生变化。

包括用户真实地址、响应时间、用户访问信息地址搜索引擎等。

在 nginx 后还有其他的服务器,nginx 传给 app1,通过中间来反馈信息其中传递时间不能太长否则应用数据不能及时把信息导回客户端。

因此中间服务器可以通过设置时间值比如超过两秒钟我们就触发警报把请求通知给程序师及时进行检测修改。

对请求做出分析是否具有共性原因是否是 MySQL 需要进行扩容。

image.png

如果想要将 access_json 格式日志显示在 www.magedu.net 域名上,需要先定义一个这样 json 格式的日志

在日志文件中添加 json 格式的内容,之后再来修改网站,输入

vim /apps/nginx/conf/conf.d/linux39-pc.conf

进入后找到access_log /apps/nginx/logs/www.magedu.net_acess.log

然后在后面添加 acess_json

退出后再来测试文件配置是否正确,输入

/apps/nginx/sbin/nginx -t

显示没有问题后再 reload,输入

/apps/nginx/sbin/nginx -s reload

之后来查看访问日志,输入

tail -f /apps/nginx/logs/

结果显示

access.log   www.magedu.net_access.log   www.magedu.net_tfs-access.log

error.log   www.magedu.net_error.log   www.magedu.net_tfs-error.log

再输入:

tail -f /apps/nginx/logs/www.magedu.net_

结果显示:

www.magedu.net_access.log   www.magedu.net_error.log   www.magedu.net_tfs-access.log   www.magedu.net_tfs-error.log

此时再来刷新页面网址,刷新页面后再来查看日志:

image.png

可以看到结果被 {},就可以验证是否是 json 格式

在互联网上搜索 json 在线解析,找到一个校验工具后,复制粘贴被 {} 起的内容,之后进行校验,如图选择的校验工具显示是正确的 JSON

image.png

如果内容中少了任何一个符号,例如少了’’,结果就会报错

3.json 格式的日志访问统计:

如下内容是一个脚本

status. 200=[]

status 404= []

with open("access_json.log") as f:

for line in f.readlines():

line . eval(ling)

if line.get("status")=="200" ;

status _200.append(line.get)

elif line.get("status") =="404":

status 404.append(line.get)

else :

print(“状态码  ERROR")

f.close()

print "状态码200的有--" , len(status_200)   //用 len 统计列表长度

print "状态码404的有--", len(status_ 404)

进行演示:先将日志清空,

输入

echo > /apps/nginx/logs/www.magedu.net_access.log

本机上存在一个日志文件 accesslog.linux38.zip,将它 cd 到 videos 下

输入cd ^C

cd ..

ll

cd..

cd videos/

ll

接着将它拷贝,输入

scp accesslog-linux38.zip  root@172.20.0.102:/opt

拷贝完后用102这个服务器进行解压,然后看这个日志文件怎么处理

在102服务器上输入

#保存日志文件到指定路径并进测试:

cd /opt/

ll

unzip accesslog-linux38.zip

ll -h

由于解压后文件太大,此处查看1000行,将该1000行加到刚才的日志文件脚本中,输入

tail -n1000 access.log > access_json.log

再输入 vim log.py

新建后进入粘贴刚才的脚本

然后查看1000行中有多少200或者404

退出后输入python2.7 log.py

最终结果为有908个200--,67个404--,还有很多 ERROR

所以对于这种 json 格式的日志,可以使用 python 进行方便的处理

如果想要取出 ip 地址,先输入tail -f access_json.log

找到 clientip 显示用户源地址,之后来取出 clientip

输入

vim log.py

进入后注释掉

if、elif、else 模块,注释掉最后两行的 print,然后在 if一行代码上输入

print (line.get(“clientip”))

之后退出输入python2.7 log.py

结果就会取出地址

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
29天前
|
PyTorch 算法框架/工具
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解
本文介绍了PyTorch中的F.softmax()和F.log_softmax()函数的语法、参数和使用示例,解释了它们在进行归一化处理时的作用和区别。
310 1
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解
|
10天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
27 1
|
1月前
|
存储 消息中间件 大数据
大数据-70 Kafka 高级特性 物理存储 日志存储 日志清理: 日志删除与日志压缩
大数据-70 Kafka 高级特性 物理存储 日志存储 日志清理: 日志删除与日志压缩
38 1
|
29天前
|
数据可视化
Tensorboard可视化学习笔记(一):如何可视化通过网页查看log日志
关于如何使用TensorBoard进行数据可视化的教程,包括TensorBoard的安装、配置环境变量、将数据写入TensorBoard、启动TensorBoard以及如何通过网页查看日志文件。
162 0
|
3月前
|
jenkins 持续交付
jenkins学习笔记之三:使用jenkins共享库实现日志格式化输出
jenkins学习笔记之三:使用jenkins共享库实现日志格式化输出
jenkins学习笔记之三:使用jenkins共享库实现日志格式化输出
|
2月前
|
Shell Python
salt自定义模块内使用日志例子
salt自定义模块内使用日志例子
|
3月前
|
开发框架 .NET Docker
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
|
3月前
|
应用服务中间件 Linux nginx
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
|
3月前
|
存储 应用服务中间件 nginx
部署ELK+filebeat收集nginx日志
部署ELK+filebeat收集nginx日志
123 0
部署ELK+filebeat收集nginx日志
|
4月前
|
存储 Web App开发 Java
《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)
【7月更文挑战第13天】这篇文章介绍了如何在Java中创建一个简单的自定义日志系统,以替代Log4j或logback。
292 5
下一篇
无影云桌面