开发者学堂课程【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
然后来访问网址,如图
另外一种是通过内置变量直接赋值,进入配置文件后注释掉刚才输入的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 需要进行扩容。
如果想要将 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
此时再来刷新页面网址,刷新页面后再来查看日志:
可以看到结果被 {},就可以验证是否是 json 格式
在互联网上搜索 json 在线解析,找到一个校验工具后,复制粘贴被 {} 起的内容,之后进行校验,如图选择的校验工具显示是正确的 JSON
如果内容中少了任何一个符号,例如少了’’,结果就会报错
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
结果就会取出地址