Nginx 变量漫谈(五)
来源:互联网 发布:如何让皮肤变好 知乎 编辑:程序博客网 时间:2024/04/30 01:29
location
接口,然后由这些 location
接口通力协作,共同完成整个“主请求”。当然,“子请求”的概念是相对的,任何一个“子请求”也可以再发起更多的“子子请求”,甚至可以玩递归调用(即自己调用自己)。当一个请求发起一个“子请求”的时候,按照 Nginx 的术语,习惯把前者称为后者的“父请求”(parent request)。值得一提的是,Apache 服务器中其实也有“子请求”的概念,所以来自 Apache 世界的读者对此应当不会感到陌生。
location /main { echo_location /foo; echo_location /bar; } location /foo { echo foo; } location /bar { echo bar; }
这里在 location
中,通过第三方 ngx_echo 模块的 echo_location 指令分别发起到 /foo
和 /bar
这两个接口的 GET
类型的“子请求”。由echo_location 发起的“子请求”,其执行是按照配置书写的顺序串行处理的,即只有当 /foo
请求处理完毕之后,才会接着处理/bar
请求。这两个“子请求”的输出会按执行顺序拼接起来,作为 /main
接口的最终输出:
$ curl 'http://localhost:8080/main' foo bar
我们看到,“子请求”方式的通信是在同一个虚拟主机内部进行的,所以 Nginx 核心在实现“子请求”的时候,就只调用了若干个 C 函数,完全不涉及任何网络或者 UNIX 套接字(socket)通信。我们由此可以看出“子请求”的执行效率是极高的。
location /main { set $var main; echo_location /foo; echo_location /bar; echo "main: $var" ;} location /foo { set $var foo; echo "foo: $var" ;} location /bar { set $var bar; echo "bar: $var" ;}
在这个例子中,我们分别在 /main
,/foo
和 /bar
这三个 location
配置块中为同一名字的变量,$var
,分别设置了不同的值并予以输出。特别地,我们在 /main
接口中,故意在调用过/foo
和 /bar
这两个“子请求”之后,再输出它自己的 $var
变量的值。请求/main
接口的结果是这样的:
$ curl 'http://localhost:8080/main' foo: foo bar: bar main: main
显然,/foo
和 /bar
这两个“子请求”在处理过程中对变量 $var
各自所做的修改都丝毫没有影响到“主请求”/main
. 于是这成功印证了“主请求”以及各个“子请求”都拥有不同的变量 $var
的值容器副本。
location /main { set $var main; auth_request /sub; echo "main: $var" ;} location /sub { set $var sub; echo "sub: $var" ;}
这里我们在 /main
接口中先为 $var
变量赋初值 main
,然后使用 ngx_auth_request 模块提供的配置指令 auth_request
,发起一个到 /sub
接口的“子请求”,最后利用echo 指令输出变量$var
的值。而我们在 /sub
接口中则故意把 $var
变量的值改写成 sub
. 访问 /main
接口的结果如下:
$ curl 'http://localhost:8080/main' main: sub
我们看到,/sub
接口对 $var
变量值的修改影响到了主请求 /main
. 所以ngx_auth_request 模块发起的“子请求”确实是与其“父请求”共享一套 Nginx 变量的值容器。
/sub
的输出没有出现在最终的输出里呢?”答案很简单,那就是因为auth_request
指令会自动忽略“子请求”的响应体,而只检查“子请求”的响应状态码。当状态码是 2XX
的时候,auth_request
指令会忽略“子请求”而让 Nginx 继续处理当前的请求,否则它就会立即中断当前(主)请求的执行,返回相应的出错页。在我们的例子中,/sub
“子请求”只是使用echo 指令作了一些输出,所以隐式地返回了指示正常的200
状态码。
转自:http://blog.sina.com.cn/s/blog_6d579ff40100wqn7.html
- Nginx 变量漫谈(五)
- Nginx 变量漫谈(一)
- Nginx 变量漫谈(二)
- Nginx 变量漫谈(三)
- Nginx 变量漫谈(四)
- Nginx 变量漫谈(六)
- Nginx 变量漫谈(七)
- Nginx 变量漫谈(八)
- Nginx 变量漫谈(三)
- Nginx 变量漫谈(一)(转)
- nginx(五)自带变量
- 漫谈继承技术(五)
- 架构漫谈(五):什么是软件
- 架构漫谈(五):什么是软件
- 架构漫谈(五):什么是软件
- 架构漫谈(五):什么是软件
- 架构漫谈(五):什么是软件
- 架构漫谈(五):什么是软件
- Nginx 变量漫谈(四)
- POJ 1595 素数切
- 复合LOV的实现
- BlueTooth的EDR是什么
- 关键路径的实现C++ 代码
- Nginx 变量漫谈(五)
- 中国地质大学24岁硕士可可西里科考时遇难
- java_IO流(黑马程序员)
- 数组的应用大折腾
- Nginx 变量漫谈(六)
- attribute和property的区别
- 如何开启fsockopen函数
- Emacs 使用Jslint
- Android源码导入到Eclipse进行查看