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

语法:
