热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Nginx服务器配置中nginx_lua相关的变量

1、设定变量返回server{listen8080;location/test{set$foohello;echofoo:$foo;}}2、输出$geo$dollar{default$;}server{listen8080;location/test{echoThisisadollarsign:$dollar}}结果$
1、设定变量返回
server {
listen 8080;
location /test {
set $foo hello;
echo "foo: $foo";
}
}

2、输出$
geo $dollar {
default "$";
}
server {
listen 8080;
location /test {
echo "This is a dollar sign: $dollar
}
}

结果
$ curl 'http://localhost:8080/test'
This is a dollar sign: $

3、区分空格
server {
listen 8080;
location /test {
set $first "hello ";
echo "${first}world";
}
}
结果:
$ curl 'http://localhost:8080/test
hello world

4、变量上下文
Nginx 变量名的可见范围虽然是整个配置,但每个请求都有所有变量的独立副本,或者说都有各变量用来存放值的容器的独立副本,彼此互不干扰

5、内部跳转
server {
listen 8080;
location /foo {
set $a hello;
echo_exec /bar;  //通rewrite ^/bar
}
location /bar {
echo "a = [$a]";
}
}
echo_exec 配置指令,发起到
location /bar 的“内部跳转”。
Nginx变量值容器的生命期是与当前正在处理的请求绑定的,而与 location无关

6、nginx内建变量
Nginx 内建变量最常见的用途就是获取关于请求或响应的各种信息
location /test {
echo "uri = $uri";
echo "request_uri = $request_uri
}
运行结果
$ curl 'http://localhost:8080/test?a=3&b=4'
uri = /test
request_uri = /test?a=3&b=4

7、$arg_XXX
另一个特别常用的内建变量其实并不是单独一个变量,而是有无限多变种的一群变量,即名字以 arg_开头的所有变量,我们估且称之为$arg_XXX 变量群。一个例子是$arg_name,这个变量的值是当前请求名为 name 的 URI 参数的值,而且还是未解码的原始形式的值
location /test {
echo "name: $arg_name";
echo "class: $arg_class";
}
$ curl 'http://localhost:8080/test?name=Tom&class=3'
name: Tom
class: 3
$ curl 'http://localhost:8080/test?name=hello%20world&class=9'
name: hello%20world
class: 9
Nginx 会在匹配参数名之前,自动把原始请求中的参数名调整为全部小写的形式

8、对 URI 参数值中的 %XX 这样的编码序列进行解码
set_unescape_uri $name

9、比如用来取 COOKIE 值的$COOKIE_XXX 变量群,用来取请求头的 $http_XXX 变量群,以及用来取响应头的 $sent_http_XXX 变量群。可以参考 ngx_http_core 模块的官方文档

10、修改 $args 变量影响标准的 HTTP 代理模块 ngx_proxy 的例子
 server {
        listen 8080;
        location /test {
            set $args "foo=1&bar=2";
            proxy_pass http://127.0.0.1:8081/args;
        }
    }
    server {
        listen 8081;
        location /args {
            echo "args: $args";
        }
    }
运行结果
$ curl 'http://localhost:8080/test?blah=7'
args: foo=1&bar=2

11、ngx_map
 map $args $foo {
        default     0;
        debug       1;
    }
    server {
        listen 8080;
        location /test {
            set $orig_foo $foo;
            set $args debug;
            echo "orginal foo: $orig_foo";
            echo "foo: $foo";
        }
    }
当 $args 的值等于 debug 的时候,$foo 变量的值就是 1,否则 $foo 的值就为 0.
ngx_map 模块认为变量间的映射计算足够昂贵,需要自动将因变量的计算结果缓存下来,这样在当前请求的处理过程中如果次读取这个因变量,Nginx 就可以直接返回缓存住的结果,而不再调用该变量的“取处理程序”再行计算了。
    $ curl 'http://localhost:8080/test'
    original foo: 0
    foo: 0
    $ curl 'http://localhost:8080/test?debug'
    original foo: 1
    foo: 1
在上面的例子中,我们还应当注意到 map 指令是在 server 配置块之外,也就是在最外围的 http 配置块中定义的。很多读者可能会对此感到奇怪,毕竟我们只是在location /test 中用到了它。这倒不是因为我们不想把 map 语句直接挪到location 配置块中,而是因为 map 指令只能在 http 块中使用!

12、子请求
location /main {
echo_location /foo;
echo_location /bar;
}
location /foo {
echo foo;
}
location /bar {
echo bar;
}
“子请求”方式的通信是在同一个虚拟主机内部进行的,所以 Nginx 核心在实现“子请求”的时候,就只调用了若干个 C 函数,完全不涉及任何网络或者 UNIX 套接字(socket)通信

13、子请求变量
    location /main {
        echo "main args: $args";
        echo_location /sub "a=1&b=2";
    }
    location /sub {
        echo "sub args: $args";
    }
运行结果:
    $ curl 'http://localhost:8080/main?c=3'
    main args: c=3
    sub args: a=1&b=2
但不幸的是,并非所有的内建变量都作用于当前请求。少数内建变量只作用于“主请求”,比如由标准模块 ngx_http_core 提供的内建变量$request_method.变量 $request_method。
变量 $request_method 在读取时,总是会得到“主请求”的请求方法,比如 GET、POST 之类。
为了达到我们最初的目的,我们需要求助于第三方模块 ngx_echo 提供的内建变量 $echo_request_method:
    location /main {
        echo "main method: $echo_request_method";
        echo_location /sub;
    }
    location /sub {
        echo "sub method: $echo_request_method";
    }
此时的输出终于是我们想要的了:
    $ curl --data hello 'http://localhost:8080/main'
    main method: POST
    sub method: GET

14、变量找不到和空字符串
ngx_lua,我们可以轻松地在 Lua 代码中做到这一点
 location /test {
        content_by_lua '
            if ngx.var.arg_name == nil then
                ngx.say("name: missing")
            else
                ngx.say("name: [", ngx.var.arg_name, "]")
            end
        ';
    }

15、我们可以选择在 Nginx不同的请求处理阶段插入我们的Lua 代码。这些 Lua 代码既可以直接内联在 Nginx 配置文件中,也可以单独放置在外部 .lua 文件里,然后在 Nginx 配置文件中引用 .lua文件的路径。

16、ngx.var
回到上面这个例子,我们在 Lua 代码里引用 Nginx 变量都是通过ngx.var 这个由 ngx_lua 模块提供的Lua 接口。比如引用 Nginx 变量$VARIABLE 时,就在 Lua 代码里写作 ngx.var.VARIABLE 就可以了。当 Nginx 变量 $arg_name 为特殊值“没找到”(或者“不合法”)时,ngx.var.arg_name 在 Lua 世界中的值就是 nil,即 Lua 语言里的“空”(不同于 Lua 空字符串)。我们在 Lua 里输出响应体内容的时候,则使用了 ngx.say 这个 Lua 函数,也是 ngx_lua 模块提供的,功能上等价于 ngx_echo 模块的 echo配置指令。

17、nil值
在 Lua 里访问未创建的 Nginx 用户变量时,在 Lua 里也会得到 nil 值,而不会像先前的例子那样直接让 Nginx 拒绝加载配置:
    location /test {
        content_by_lua '
            ngx.say("$blah = ", ngx.var.blah)
        ';
    }     curl 'http://localhost:8080/test'
    $blah = nil

推荐阅读
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文介绍了如何在Linux系统中获取库源码,并在从源代码编译软件时收集所需的依赖项列表。 ... [详细]
  • ABP框架是ASP.NET Boilerplate的简称,它不仅是一个开源且文档丰富的应用程序框架,还提供了一套基于领域驱动设计(DDD)的最佳实践架构模型。本文将详细介绍ABP框架的特点、项目结构及其在Web API优先架构中的应用。 ... [详细]
  • 作为一名新手开发者,我正在尝试使用 ASP.NET 和 Vue.js 构建一个单页面应用,涉及多个复杂组件(如按钮、图表等)。希望有经验的开发者能够提供指导。 ... [详细]
  • 深入理解Java多线程与并发机制
    本文探讨了Java多线程和并发机制的核心概念,包括多线程类的分类、执行器框架、并发容器及控制工具。通过详细解析这些组件,帮助开发者更好地理解和应用多线程技术。 ... [详细]
  • Spring 中策略模式的应用:Resource 接口详解
    本文探讨了在 Spring 框架中如何利用 Resource 接口实现资源访问策略。Resource 接口作为资源访问策略的抽象,通过多种实现类支持不同类型的资源访问。 ... [详细]
  • Lua IO操作详解
    本文介绍了Lua中的IO操作,包括简单模式和完整模式下的文件处理方法,以及相关的系统调用。 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom"echarts";4、如果用到map(地图),还 ... [详细]
  • 面试题总结_2019年全网最热门的123个Java并发面试题总结
    面试题总结_2019年全网最热门的123个Java并发面试题总结 ... [详细]
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
  • 本文介绍了 Python 中的基本数据类型,包括不可变数据类型(数字、字符串、元组)和可变数据类型(列表、字典、集合),并详细解释了每种数据类型的使用方法和常见操作。 ... [详细]
  • 深入解析Pod中的容器关系
    容器之间的紧密协作如何实现?本文探讨了Kubernetes中Pod的概念及其在处理容器间超亲密关系中的作用。 ... [详细]
  • 通过马老师的视频学习了Java中的容器相关内容,包括Collection、Set、List、Map及其常见实现类,并深入了解了这些容器的基本操作方法。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • 在2015年1月的MySQL内核报告中,我们详细探讨了性能优化和Group Commit机制的改进。尽管网上已有大量关于Group Commit的资料,本文将简要回顾其发展,并重点分析MySQL 5.6及之前版本中引入的二进制日志(Binlog)对性能的影响。此外,我们还将深入讨论最新的优化措施,如何通过改进Group Commit机制显著提升系统的整体性能和稳定性。 ... [详细]
author-avatar
手机用户2502922313
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有