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,然 ...
随机推荐
- java 检查进程是否存在
以nginx进程为例子 private final static String NAME_STRING = "nginx.exe"; //传入进程名称processName pub ...
- 关于ES6的let、const那些事儿
Babel 转码器 Babel是广泛使用的一个ES6转换器,将ES6代码转换成ES5代码,从而实现在老版本的浏览器执行. let和const命令 let所声明的变量只在let命令所在的代码块内是有效的 ...
- leetcode刷题-91解码方法
题目 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 1: ...
- random模块的应用
- python的学习准备工作
python是开放的的语言,可以从官方网站下载www.python.org 下载下来后直接运行安装就行了 ctrl+n新建一个文件 ctrl+s保存,以.py为扩展名 点run module 或者F5 ...
- Java并发包之ThreadPoolExecutor
概述 ThreadPoolExecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任务执行,线程调度,线程池管理等等服务. 构造参数 corePo ...
- 疑难杂症 | Excel VBA锁定指定单元格区域
背景:锁定EXCEL表头 一.手动操作流程 其基本逻辑并不赋值,手动操作流程是: 1.取消所有单元格的"锁定"格式 CTRL+A,选中全部的单元格→单击右键→设置单元格格式→保护→ ...
- python-文本操作和二进制储存
0x01 open方法 r read w write a append b byte test.txt内容为 yicunyiye wutang 读取test.txt f = open('test.tx ...
- svg的学习
svg的学习 1,初步了解 1,大致看了一下svg的简介,在图形的操作和展示上有很大的优势,例如不会失精:灵活的dom操作:很好的兼容性(IE需要下载插件).so,是一门值得深究的前端课程: 2,看了 ...
- 记一次GDB调试
目标文件: ciscn_2019_ne_5. 来源 :https://buuoj.cn/challenges 保护情况:保护是没有保护的 主要伪代码: int __cdecl main(int arg ...