Author: haoransun
Wechat: SHR—97
学习来源:极客时间-Nginx核心知识100讲,本人购买课程后依据视频讲解汇总成个人见解。
前言
Nginx中变量是一个非常强大的工具,可以在nginx.conf配置文件中,通过变量去修改各个模块处理请求的方式。因此,变量是一个解耦工具。它同样可以在 openresty 中 lua 语言中大有用处。
变量原理
变量的提供模块与使用模块
流程:
提供变量名的模块
Nginx启动后,发现当前是一个HTTP模块。它其中有一个 preconfiguration回调方法,如 realip模块的 realip变量等等。它定义的是一对值,即变量名和解析出当前变量名的方法。如给出输入(如http请求头部中的名称),输出就是对应的值。此处定义规则。
使用变量名的模块
通过变量名完成解耦。
两个模块各自专注于自己的职责
变量的特性
存放变量的哈希表
HTTP框架提供的请求有关变量
除许多HTTP模块会提供变量外,Nginx的HTTP框架也提供了大量的变量,这些变量不需要编译、引入新的HTTP模块,而且框架提供的变量往往反映了用户发来的请求时被Nginx处理的流程与细节。因此,熟悉Nginx框架提供的每一个变量的用法是非常有必要的。
1 | 新建配置文件,并include到 nginx.conf配置文件中 |
为了演示有些变量在不同的阶段时不同的,添加了日志文件。return中,将相关联的变量以一行显示,以逗号分隔。冒号前是变量名,冒号后是变量值。
做一次访问
HTTP框架提供的变量
HTTP请求有关变量
HTTP框架提供的其他变量
TCP连接有关的变量
Nginx处理请求过程中产生的变量
发送HTTP响应时相关变量
Nginx系统变量
变量防盗链
简单有效的防盗链手段:referer模块
referer模块的指令
valid_referers 指令
问题
1 | 新建配置文件,并include到 nginx.conf中 |
将带测验8个请求放入 testurl中
第一个:403 没有匹配上
第二个:valid,匹配上了 *.taohui.pub
第三个:valid,以内没有referer,匹配上了blocked
第四个:valid,匹配上了 none
第五个:403 没有匹配上www.taohui.tech
第六个:valid,匹配上了 server_name
第七个:403 没有配置与baidu有关的
第八个:匹配上了正则表达式
为复杂业务生成新的变量:map模块
很多时候,直接使用某些变量的值做逻辑判断是比较困难的,而Map模块提供了可根据1个或多个变量组合成的值结果做判断,进而生成新的变量。再判断新的变量值做逻辑判断。
通过映射新变量提供更多的可能性:map模块
map模块的指令
问题:
1 | 新建配置文件,并include到 nginx.conf中 |
将待检测url放入 testurl,方便拷贝访问
访问 map.taohui.org.cn ,匹配上了 泛域名正则、前缀、后缀。而前缀最优先,所以返回 2:0
访问 map.tao123.org.cn,只有正则表达式匹配上 1:0
访问 map.taohui.tech, 完全匹配 与 后缀匹配 都行,但是完全匹配优先级最高,所以 3:0
通过变量指定少量用户实现AB测试:split_clients模块
该模块可以根据变量的值按照百分比方式生成新的变量。
AB测试:split_clients模块
split_clients 模块指令
AB测试:产品推出的功能不太确定用户是否接受,所以推出多个类似功能,让某一个百分比用户去尝试某一类功能,看大家的反馈来决定最终使用哪一个功能的版本。关键:确保按照某一定的百分比决定用户的行为。
1 | 新建配置文件,并include到 nginx.conf中 |
上述问题是已经超过100%了。此时重启会发现,重启失败。
将 40% 注释掉。再次访问,server-location中额 $variant 取自 split_clients 中的配置项。而他又取决于$(http_testcli)经算法改造后的值,看这个值落在那个区域,就返回后面对应的值。
testcli: xxx,xxx值随便填写,
根据IP地址范围的匹配生成新变量:geo模块
可根据子网掩码来生成新变量。
geo模块示例
演示
1 | 新建配置文件,并include到 nginx.conf中 |
访问
使用变量获得用户的地理位置:geoip模块
可以根据IP地址库自动的计算出IP地址找到相应的地理位置。
基于MaxMind数据库从客户端地址获取变量:geoip模块
geoip_country指令提供的变量
geoip_city指令提供的变量
MaxMind网址,因为Nginx使用C语言,所以选中C语言的GitHub,进行下载。
演示
编译进nginx后
1 | 新建配置文件,并include到 nginx.conf中 |
在 http://www.goubanjia.com/选择一些IP来做测试。
广东IP
纽约IP
对客户端使用keepalive提升连接效率
此处是 HTTP协议中的Keepalive,不是TCP协议中的Keepalive
语法: