nginx变量系统及应用

nginx变量定义

nginx使用“$”符号作为前缀来表示一个变量,并且它还有一个其它语言没有的特性:变量可以直接插入到一个字符串中,插入后并不会改变变量的特性,并且对插入变量的个数没有限制。除了直接在变量名字前加“$”符号表示一个变量外,nginx中还有另外一种形式来表示变量:在“$”符号的基础上加上一对花括号,并把变量名放在花括号中,比如:

set ${a} “hello”
set ${b} “world”

nginx对表示变量名的字符也是有规定的,nginx中仅允许四种类型的字符或他们的组合做为变量名,分别是大写字母(A-Z)、小写字母(a-z)、数字(0-9)、下划线(_),其它都是非法的。只有某个变量在真正被使用的时候nginx才会检查变量名的合法性,比如set指令中的为定义的变量赋值就是一种“使用”,而被定义的变量不能叫“使用”。

在nginx中变量的定义又分了两种:

  • 一种是自定义变量,就如上面用set指令设置的变量,它会在配置文件中明确指出这是一个被定义的变量,当然并不是说自定义变量就一定要使用set指令。如ngx_http_geo模块是nginx的自带的一个标准模块,该模块只包含一个指令geo,作用是根据客户端ip来定义一个变量:
    http {
        geo  $a  {
            default    “我是geo默认值”;
            127.0.0.1   “客户端ip是127.0.0.1”;
        }
    
        location / {
            return 200  “$a”;    
        }
    }
    另外一个显著的不同是set指令定义的变量值是一个字符串形式,而geo定义的变量值则需要使用花括号括起来,并且该指令内部还隐含的做了逻辑判断。比如如果客户端ip地址是127.0.0.1则该变量值是“客户端ip是127.0.0.1”,如果不是则就是默认值“我是geo默认值”。默认情况下geo指令会自己获取客户端的ip,然后根据相应的配置去映射变量,但其实它也可以接收一个指定ip,如:
    geo  $arg_name  $a  {
        default      “我是geo默认值”;
        127.0.0.1    “我是张三”;
        192.168.1.1  “我是李四”;
    }
    
    location / {
         return 200 “$a”;
    }

    验证一下看看效果:curl http://127.0.0.1/?name=127.0.0.1   -- 返回我是张三

  • 另外是内置变量,它在nginx启动之前就已经被设置好了,不需要在配置文件中明确定义。另外内置变量也是分模块的,每个模块都可以有自己的内置变量,比如$uri这个内置变量就属于ngx_http_core这个http核心模块中的变量,关于这个模块的其它内置变量读者可以关注nginx的官方文档: Module ngx_http_core_module  

 动态内置变量

在之前的小节中有用到“$uri”这个变量来说明内置变量,但是并没有提到内置变量的另外一种形式,即动态内置变量。这里所谓“动态”指的是变量的名字是不确定的,这个不确定性发生在nginx的运行过程中。目前在nginx的http模块中有六种内置动态变量,分别是“http_”、“sent_http_”、“upstream_http_”、“upstream_cookie”、“cookie_”,“arg_”。

  •  以“http_”开头的动态内置变量可以表示http请求过程中的任意请求头,使用的过程中不区分大小写,并且请求头中如果有“-”字符需要用“_”字符替代,如:
    location / {
        return 200 “User-Agent: $http_user_agent ”;
    }
    
    curl http://nginx.org/en/dosc/ -v
    请求:
    > GET /en/docs HTTP/1.1
    > User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
    > Host: nginx.org
    > Accept: */*
    
    应答:
    curl http://127.0.0.1/
    
    User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7    NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
  •  以“sent_http_”开头的动态内置变量可以表示http响应过程中的任意响应头,规则跟“http_”动态内置变量一样,如:
location /a {
     return 200 “I am $sent_http_connection”;
}

curl http://127.0.0.1/a -v
响应头:
< Server: nginx/1.9.4
< Date: Sat, 21 Apr 2018 09:04:36 GMT
< Content-Type: application/octet-stream
< Content-Length: 15
< Connection: keep-alive

curl http://127.0.0.1/a
I am keep-alive
  • 以“cookie_”开头的动态内置变量可以表示http请求过程中的某个cookie值。需要和“$http_cookie”这个内置变量(非动态内置变量)区分一下,它代表请求中整个cookie值。 而以“cookie_”开头的变量则代表某个实际cookie值,比如“$cookie_a”代表本次请求中cookie名字是a的对应值。
  • 以“arg_”开头的动态内置变量,用法跟以“cookie_”开头的变量类似,就不再赘述了。在nginx中变量“$arg_”不代表任何入参值,它会被nginx转换成空字符,若$arg_变量(这种不合法),最终也就是输出“变量”字符串。 

可变变量和不可变变量

nginx中的变量也存在可变和不可变之分,但是它并没有显著的修饰符,所以从表面上你根本看不出来该变量是否可变。不过nginx在启动过程中提供了一个自检查机制,当在配置文件中试图修改一个不可变变量时,nginx是不会顺利启动的。通过这种机制可以间接的判断某个变量是否可变。目前nginx的核心http模块中几乎所有内置变量都是不可改变的,只有“$args”和“$limit_rate”这两个内置变量可以被改变。

可缓存变量和不可缓存变量

nginx中所有的变量在定义的时候都会被关联上一个get_handler()方法,所有变量在第一次获取值的时候,都是通过这个handler方法获取的,后续再次获取变量值的时候,是否仍然调用该handler方法则取决于该变量是否可以被缓存。

不可缓存的变量在获取值的时候都是实时计算的,比如“$arg_”开头的动态变量,每次获取值的时候都会从查询参数中重新解析对应的值;而可以缓存的变量并不会每次都调用这个handler方法,在它的整个生命周期中,如果这个变量没有被刷新过,那么自始至终只会调用一次。

nginx中用set指令定义的变量都是可以缓存的,但set指令不会改变已有变量的缓存特性(比如内置变量,但动态变量除外),而所有以“arg_”开头的动态变量都是不可缓存的。

动态内置变量此时仍然是一个特殊的存在,我们之前说过,动态变量被重新定义后它就不再是动态变量了,所以它也就不再保有不可缓存的特性。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 完整诠释Nginx 分享Nginx的实战经验 不可多得的Nginx一手资料 联系博文视点 序言 第1部分 基础篇 第1章 Nginx简介 1.1 常用的Web服务器简介 1.2 Nginx的发展 1.3 选择Nginx的理由 1.4 Nginx与Apache、 Lighttpd的综合对比 第2章 Nginx服务器的安装与配置 2.1 安装Nginx服务器所需要的系统资源 2.2 Nginx的下载 2.3 Nginx的安装 2.4 Nginx的启动、 停止、 平滑重启 2.5 Nginx的平滑重启 2.6 Nginx的信号控制 2.7 Nginx的平滑升级 第2部分 进阶篇 第3章 Nginx的基本配置与优化 3.1 Nginx的完整配置示例 3.2 Nginx的虚拟主机配置 3.3 Nginx的日志文件配置与切割 3.4 Nginx的压缩输出配置 3.5 Nginx的自动列目录配置 3.6 Nginx的浏览器本地缓存设置 第4章 Nginx与PHP( FastCGI) 的安装、 配置与优化 4.1 获取相关开源程序 4.2 安装PHP 5.2.10( FastCGI模式) 4.3 安装Nginx 0.8.15 4.4 配置开机自动启动Nginx+PHP 4.5 优化Linux内核参数 4.6 在不停止Nginx服务的情况下平滑变更Nginx配置 4.7 编写每天定时切割Nginx日志的脚本 第5章 Nginx与JSP、 ASP.NET、 Perl的安装与配置 5.1 Nginx与JSP( Tomcat) 在Linux上的安装、 配置 5.2 Nginx与ASP.NET( Mono+FastCGI) 在Linux上的安装、 配置 5.3 Nginx与Perl( FastCGI) 在Linux上的安装、 配置 第6章 Nginx HTTP负载均衡和反向代理的配置与优化 6.1 什么是负载均衡和反向代理 6.2 常见的Web负载均衡方法 6.3 Nginx负载均衡与反向代理的配置实例 6.4 Nginx负载均衡的HTTP Upstream模块 6.5 Nginx负载均衡服务器的双机高可用 第7章 Nginx的Rewrite规则与实例 7.1 什么是Nginx的Rewrite规则 7.2 Nginx Rewrite规则相关指令 7.3 PCRE正则表达式语法 7.4 Nginx的Rewrite规则编写实例 7.5 Nginx与Apache的Rewrite规则实例对比 第8章 Nginx模块开发 8.1 Nginx模块概述 8.2 Nginx模块编写实践 第9章 Nginx的Web缓存服务与新浪网的开源NCACHE模块 9.1 什么是Web缓存 9.2 Nginx的Web缓存服务 9.3 新浪网开源软件项目——基于Nginx的NCACHE网页缓存系统 第3部分 实战篇 第10章 Nginx在国内知名网站中的应用案例 10.1 Nginx反向代理与负载均衡类网站应用案例 10.2 Nginx+PHP类网站应用案例 10.3 Nginx视频点播类网站应用案例 第11章 Nginx的非典型应用实例 11.1 用HTTPS( SSL) 构建一个安全的Nginx Web服务器 11.2 采用Nginx搭建FLV视频服务器 11.3 Nginx+PHP+MySQL在小内存VPS服务器上的优化 11.4 采用Nginx搭建正向代理服务器 第4部分 模块篇 第12章 Nginx的核心模块 12.1 主模块指令 12.2 主模块变量 12.3 事件模块指令 第13章 Nginx的标准HTTP模块 13.1 HTTP的核心模块 13.2 HTTP Upstream模块 13.3 HTTP Access模块 13.4 HTTP Auth Basic模块 13.5 HTTP Autoindex模块 13.6 HTTP Browser模块 13.7 HTTP Charset模块 13.8 HTTP Empty Gif模块 13.9 HTTP Fcgi模块 13.10 geo模块 13.11 Gzip模块 13.12 HTTP Headers模块 13.13 HTTP Index模块 13.14 HTTP Referer模块 13.15 HTTP Limit Zone模块 13.16 HTTP Limit Req模块 13.17 HTTP Log模块 13.18 HTTP Map模块 13.19 HTTP Memcached模块 13.20 HTTP Proxy模块 13.21 HTTP Rewrite模块 13.22 HTTP SSI模块 13.23 HTTP Userid模块 第14章 Nginx的其他HTTP模块 14.1 HTTP Addition模块 14.2 Embedded Perl模块 14.3 Flv Stream模块 14.4 HTTP Gzip Static模块 14.5 HTTP Random Index模块 14.6 HTTP Geo IP模块 14.7 HTTP RealIp模块 14.8 HTTP SSL模块 14.9 HTTP Stub Status模块 14.9.1 stub_status指令 14.10 HTTP Sub模块 14.11 HTTP Dav模块 14.12 Google Perftools模块 14.13 HTTP XSLT模块 14.14 HTTP Secure Link模块 14.15 HTTP Image Filter模块 第15章 Nginx的邮件模块 15.1 Nginx邮件核心模块 15.2 Nginx邮件认证模块 15.3 Nginx邮件代理模块 15.4 Nginx邮件SSL模块 15.5 Nginx邮件模块配置实例 索引 参考资料 编辑手记 《 实战Nginx: 取代Apache的高性能Web服务器》 读者交流区 勃勃生机, 潇洒开源 反侵权盗版声明 实战Nginx: 取代Apache的高性能Web服务器
Windows操作系统作为一种常见的服务器操作系统,与PHP语言的应用是相对比较典型的,而Nginx则是一款高性能的Web服务器,常用于代理服务和负载均衡等领域。Nginx与PHP的配合可以提高Web应用的性能和稳定性,由于其具有较高的并发性和稳定性,Nginx在负载处理方面也比传统的Apache优秀。以下是Nginx配置的一些关键点。 首先,Nginx配置文件是一个纯文本文件,一般为nginx.conf,其结构为由块组成的作用域结构。配置文件的顶层块为main块,可以定义一些全局的指令,如worker_processes、events、user、error_log等。 其次,http块是Nginx的重要配置块,包括定义Web服务器的虚拟主机、监听端口、HTTP协议等,其中server块定义一个虚拟主机,通过listen指令定义监听的IP地址和端口。location块则用于定义请求处理规则,以及将某种请求转发至其他服务的功能。 最后,Nginx的PHP配置需要通过fastcgi模块实现,其中用到的指令有fastcgi_pass、fastcgi_split_path_info、fastcgi_param等。fastcgi_pass定义了PHP后端的IP地址和端口,fastcgi_split_path_info则用于将请求处理为PATH_INFO变量,fastcgi_param则是将一些变量传递给PHP后端解析。 总的来说,Nginx的配置相对于Apache来说较为简洁和灵活,同时也为Web应用的高性能提供了有力的保障。以上只是一些基础的配置,具体配置还需根据具体需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值