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

简介: 快速学习自定义变量、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日志并进行多维度分析。
相关文章
|
30天前
|
存储 JSON 应用服务中间件
Higress的日志收集中,底层用的是Envoy,可不可以实现类似NGINX的rsyslog发送?
【2月更文挑战第30天】Higress的日志收集中,底层用的是Envoy,可不可以实现类似NGINX的rsyslog发送?
15 2
|
3月前
|
Java 应用服务中间件 nginx
微服务框架(二十九)Logstash Nginx 日志上报
此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。 本文为Logstash Nginx 日志上报 本系列文章中所使用的框架版本为Spring Boot 2.0.3...
|
4月前
|
应用服务中间件 nginx Windows
windows下面Nginx日志切割
windows下面Nginx日志切割
64 0
windows下面Nginx日志切割
|
6月前
|
网络协议 应用服务中间件 nginx
nginx配置tcp协议代理的日志
nginx配置tcp协议代理的日志
145 0
|
10天前
|
网络协议 应用服务中间件 Linux
centos7 Nginx Log日志统计分析 常用命令
centos7 Nginx Log日志统计分析 常用命令
23 2
|
11天前
|
运维 监控 应用服务中间件
LNMP详解(十四)——Nginx日志详解
LNMP详解(十四)——Nginx日志详解
16 2
|
19天前
|
存储 监控 数据可视化
Nginx+Promtail+Loki+Grafana Nginx日志展示
通过这些步骤,你可以将Nginx的日志收集、存储、查询和可视化整合在一起。这样,你就可以在Grafana中轻松地创建和展示Nginx日志的图表和面板。
27 3
|
1月前
|
域名解析 网络协议 应用服务中间件
nginx-ingress通过ipv6暴露服务,并在nginx ingress日志中记录客户端真实ipv6的ip地址
本文主要通过阿里云提供的clb和nlb来实现,建议是提前创建好双栈的vpc和vsw(使用clb可以不用双栈vpc和vsw)
175 1
|
3月前
|
小程序 Linux 数据安全/隐私保护
Linux学习笔记十六:日志管理
Linux学习笔记十六:日志管理
|
3月前
|
负载均衡 应用服务中间件 nginx
【实践】使用Nginx作为GrayLog日志接入的负载均衡
【实践】使用Nginx作为GrayLog日志接入的负载均衡
44 0