1、源码解析
1.1 变量分类
nginx变量分为两种,一种是nginx内置变量,可以通过官方网站查询到的含义,另外一种则是在nginx配置文件中通过set指令设置的变量,首先来看一下nginx的内置变量实现方式。
1.1.1 nginx内置变量
首先看看定义内置变量的结构体
1 | struct ngx_http_variable_s { |
上面这个结构体中,name代表变量名称,比如$request_uri,$args等,set_handler暂时没有使用到,get_handler获取变量值,data一般表示为变量值来自于这里,flags表示此变量遵循的一些规则,比如NGX_HTTP_VAR_CHANGEABLE,index表示此变量在整个nginx变量系统中的索引。
接下来就是将变量添加到nginx的变量系统中了,这里以http模块的核心变量为例进行说明。
1 | ngx_http_variable_t * |
这个函数的作用就是将定义的变量添加到http核心配置中,为获取变量的值做好准备,其他变量类似。接下来就是如何获取变量值了,http的日志模块提供了一个很好的范本。
接下来看看ngx_http_variables_init_vars函数的实现,这个函数的主要功能是设置变量的get_handler,从各个模块初始化的变量key中寻找
1 | ngx_int_t |
http模块如何获取变量,接下来看看ngx_http_get_variable函数实现
1 | ngx_http_variable_value_t * |
1.1.2 配置文件变量
配置文件变量是指set指令设置的变量,
1 | set $a value; |
具体可以参考set,
首先来看看set指令解析函数
1 | static char * |
这个函数首先解析出第一个变量的名字,并将其加入到nginx的变量系统中,其次解析作为第一个值的变量(第二个变量),但是第二个变量可能是一个普通的字符串也有可能是多个变量组成的字符串,都是在ngx_http_rewrite_value函数中进行处理,接下来看看ngx_http_rewrite_value函数实现。
1 |
|
这个函数中,n为0表示value不包含变量,为纯字符串,否则表示value中包含变量,采用复杂变量解析方式。
2、总结
以上就是Nginx变量的相关解释,Nginx变量在nginx.conf配置文件中有着至关重要的作用,可定制性强。