nginx的变量系统
本来想写一下nginx的脚本引擎的,但是看起来实在是有点庞大,一时间还不知道该从哪里写比较好。就先写一下他的变量系统吧,这是脚本引擎非常重要的组成部分。
首先为了表述清楚先规定几个术语吧
内置变量:nginx配置文件里不用set就可以直接用的变量。(比如$uri/$host等)
先看带缓存的内置变量吧
第一步:nginx在初始化模块的时候会建立内置变量数组cmcf->variables_keys,元素的值里有回调函数,用来取变量的值。
第二步:扫描配置文件,把配置文件里会用到的变量建立一个数组cmcf->variables。
第三步:扫描cmcf->variables_keys数组和cmcf->variables数组,建立一个对应关系。把所有cmcf->variables的元素的索引写到相对应的cmcf->variables_keys值的index字段。
先举个例子,假如你在配置文件里用到了$uri这个变量,第二步nginx就会把uri这个变量写到cmcf->variables数组,再假如uri在cmcf->variables数组的索引是2,第三步就会把cmcf->variables_keys对应uri的这个变量的值的index字段赋值成2。

第四步:为了加快查找速度,把cmcf->variables_key数组转化成哈希表cmcf->variables_hash。
编译脚本代码的部分先略过。
第五步:当http请求来的时候会申请一个和cmcf->variables等大小的数组r->variables,这个就是变量缓存,用来存储当前请求的变量值的(内置变量是和http请求相关的,比如说对于某个请求$host变量的值是www.foo.com,对于另一个请求$host的值又变成了www.bar.com)。
第六步:当处理某个http请求并且需要某个变量的时候就从cmcf->variables_hash查找变量的index值找到缓存r->variables,如果缓存r->variables不存在就用cmcf->variables_hash里的回调函数取值存到r->variables里,下次再用就可以直接读缓存。(这里面包含了编译脚本的和执行脚本的步骤,这次先不写了)。
此外还有不带缓存的内置变量,与带缓存的内置变量不同的地方就是他不会在r->variables里设置缓存,每次使用都会调用回调函数,比如http_系列/cookie_系列/upstream_http_系列/upstream_cookie_系列等。
nginx的变量系统的更多相关文章
- 为PHP设置服务器(Apache/Nginx)环境变量
为PHP设置服务器(Apache/Nginx)环境变量 设置环境变量常见的地方为区分开发环境/生产环境,或者定义一些数据库的帐号密码 设置Apache环境变量 指令 设置当前环境变量为DEV SetE ...
- Nginx 的变量究竟是怎么一回事?
之前说了很多关于 Nginx 模块的内容,还有一部分非常重要的内容,那就是 Nginx 的变量.变量在 Nginx 中可以说无处不在,认识了解这些变量的作用和原理同样是必要的,下面几乎囊括了关于 Ng ...
- JavaScript神一样的变量系统
话说上一篇介绍了JavaScript故事版的身世之谜.看官你估计也明白JavaScript出生之时,就未曾托于重任.布兰登-艾奇估计也没料到今天的JavaScript变得如此重要.要不然,当年他也不会 ...
- nginx set变量后lua无法改值
今天在使用lua修改nginx自定义变量的时候,发现死活更改不了,如下所示: 有问题的代码 set $check "1"; rewrite_by_lua_file 'conf/ru ...
- Keepalived+Nginx+tomcat实现系统的高可用
Keepalived+Nginx+tomcat实现系统的高可用 1:安装vmware虚拟机 2:安装linux系统,我自己下载的centos6.5 3:安装JDK,tomcat 解压tomcat到/u ...
- 转:NGNIX模块开发——nginx的配置系统
From:http://tengine.taobao.org/book/chapter_02.html nginx的配置系统 nginx的配置系统由一个主配置文件和其他一些辅助的配置文件构成.这些配置 ...
- MySQL的变量--系统变量、状态变量
MySQL的变量分为以下两种:1)系统变量:配置MySQL服务器的运行环境,可以用show variables查看2)状态变量:监控MySQL服务器的运行状态,可以用show status查看 一.系 ...
- nginx在windows系统中如何启动、重启、停止
nginx在windows系统中如何启动.重启.停止 查看nginx的版本号:nginx -v 启动nginx:start nginx 快速停止或关闭nginx:nginx -s stop 正常停 ...
- nginx的配置系统
nginx的配置系统由一个主配置文件和其他一些辅助的配置文件构成.这些配置文件均是纯文本文件,全部位于nginx安装目录下的conf目录下. 配置文件中以#开始的行,或者是前面有若干空格或者TAB,然 ...
随机推荐
- 小白也能弄懂的卷积神经网络(Convolutional Neural Networks )
本系列主要是讲解卷积神经网络 - Convolutional Neural Networks 的系列知识,本系列主要帮助大家入门,我相信这是所有入门深度学习的初学者都必须学习的知识,这里会用更加直接和 ...
- 使用java爬虫从雪球网下载股票数据
雪球网也是采用Ajax方式展示数据,我依然采用开发者工具查看其访问地址和返回数据. 访问使用到的库是jsoup,解析返回的json用的类库是jackson,二者的依赖是: <!-- jsoup ...
- 解锁用户scott并授权
请输入用户名: system 输入口令: 连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Producti ...
- ES ElasticSearch 7.x 下动态扩大索引的shard数量
ES ElasticSearch 7.x 下动态扩大索引的shard数量 背景 在老版本的ES(例如2.3版本)中, index的shard数量定好后,就不能再修改,除非重建数据才能实现. 从ES6. ...
- Unit5:广播
静态广播 1.定义 public class TestBroadCast extends BroadcastReceiver { @Override public void onReceive(Con ...
- JavaScript中关于获取浏览器可视窗口的几个兼容性写法的理解
1.浏览器可视窗口的概述: 浏览器可视区域不是网页的body的大小.可视区指的是浏览器减去上面菜单栏.工具栏,下面状态栏和任务栏,右边滚动条(如果有的话)后的中间网页内容的单页面积大小.而body大小 ...
- docker部署LAMP架构并部署上线wordpress博客系统
第一步:直接在镜像仓库拉取LAMP镜像 [root@ken-node3 ken]# docker pull tutum/lamp 第二步:查看已经获取到的镜像 [root@ken-node3 ken] ...
- hystrix文档翻译之工作原理
流程图 下面的图片显示了一个请求在hystrix中的流程图. 1.构造一个HystrixCommand或者HystrixObservableCommand对象 第一步是创建一个HystrixComma ...
- RXJAVA之Subject
RxJava中常见的Subject有4种,分别是 AsyncSubject. BehaviorSubject.PublishSubject. ReplaySubject. AsyncSubject 使 ...
- 6.Exchanger-交换机