文章目录

  • Nginx 变量
  • 1、Nginx变量简介
  • 2、Nginx 变量的定义和使用
  • 1、自定义变量
  • **nginx安装echo模块**
  • 配置变量
  • **6、变量作用域**
  • 内置预定义变量


Nginx 变量

Nginx 同 Apache 等其他 Web 服务器的配置记法不太相同,Nginx的配置文件使用语法的就是一门微型的编程语言。可以类似写程序一般编写配置文件,可操作性很大。既然是编程语言,一般也就少不了“变量”这种概念。

1、Nginx变量简介
  • 所有的 Nginx变量在 Nginx 配置文件中引用时都须带上 $ 前缀
  • 在 Nginx 配置中,变量只能存放一种类型的值,有且也只存在一种类型,那就是字符串类型
  • nginx可以使用变量简化配置与提高配置的灵活性,所有的变量值都可以通过这种方式引用:
$变量名
2、Nginx 变量的定义和使用

nginx中的变量分为两种,自定义变量与内置预定义变量

1、自定义变量

1、声明变量
可以在sever,http,location等标签中使用set命令(非唯一)声明变量,语法如下

set $变量名 变量值

注意:

  • nginx 中的变量必须都以$开头
  • nginx 的配置文件中所有使用的变量都必须是声明过的,否则 nginx 会无法启动并打印相关异常日志

2、变量的可见性

在不同层级的标签中声明的变量性的可见性规则如下:

  • location标签中声明的变量中对这个location块可见
  • server标签中声明的变量对server块以及server块中的所有子块可见
  • http标签中声明的变量对http块以及http块中的所有子块可见

nginx安装echo模块

方法;# nginx -V 查看已经安装的nginx的版本

方法;# wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz 下载echo模块的安装包

方法;# ls 查看安装包
v0.61.tar.gz

方法;# tar xzf v0.61.tar.gz -C /usr/local/ 解压到相同路径下:

方法;cd /usr/local/ 查看一下模块的名字
方法:cd nginx-1.2.0/ 进入nginx 先查看上面的编译都有什么

方法;–add-module=/usr/local/echo-nginx-module-0.61 重点是添加 这个模块;

./configure  --prefix=/usr/local/nginx --group=nginx --user=nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/tmp/nginx/client_body --http-proxy-temp-path=/tmp/nginx/proxy --http-fastcgi-temp-path=/tmp/nginx/fastcgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre --with-http_realip_module --add-module=/usr/local/echo-nginx-module-0.61

nginx配置文件中使用变量 nginx变量详解_Nginx


重点 重点 重点 重点 重点

make   #编译,不要make install 否则会覆盖原来的文件

方法; mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_bak2 #将原来的nignx备份

方法;# cp objs/nginx /usr/local/nginx/sbin/ 拷贝nignx

方法;# /usr/local/nginx/sbin/nginx #启动

方法; nginx -V 查看模块是否添加成功

nginx配置文件中使用变量 nginx变量详解_nginx_02

配置变量

我这里创建了一个子文件

server {
        listen 80;
        server_name     localhost;
        location /test { 
                set $foo 42;
                echo "666 $foo";
        }       
}

nginx配置文件中使用变量 nginx变量详解_预定义变量_03


测试 curl 196.196.196.131/test

nginx配置文件中使用变量 nginx变量详解_nginx_04


5、 使用大括号插值

大括号 跟 空格的区别就是,打印出来一个有空格 一个紧挨着

在“变量插值”的上下文中,还有一种特殊情况,即当引用的变量名之后紧跟着变量名的构成字符时(比如后跟字母、数字以及下划线),我们就需要使用特别的记法来消除歧义,例如:

server {
        listen 80;
        server_name     localhost;
        location /test-brace {
                set $first "hello ";
                echo "${first}world";
        }
}
或者
server {
        listen 80;
        server_name     localhost;
        location /test-brace {
                set $first "hello";
                echo "$first world";
        }
}

nginx配置文件中使用变量 nginx变量详解_预定义变量_05

6、变量作用域

我自己总结的是
只能放在server块,还有location块
放在 server块 他就会被这个server块里面的 location都可以使用
放在location块 他就只能单独被他自己所使用

set 指令不仅有赋值的功能,它还有创建 Nginx 变量的作用,即当作为赋值对象的变量尚不存在时,它会自动创建该变量。如果我们不创建就直接使用它的值,则会报错。
例如

server {
    ...
    location /bad {
        echo $foo;
    }
}

此时 Nginx 服务器会拒绝加载配置:
方法;# nginx -s reload
nginx: [emerg] unknown “foo” variable
nginx: configuration file /etc/nginx/nginx.conf test failed

内置预定义变量

内置预定义变量即无需声明就可以使用的变量,通常包括一个http请求或响应中一部分内容的值,以下为一些常用的内置预定义变量

nginx配置文件中使用变量 nginx变量详解_nginx配置文件中使用变量_06


1、uri vs request_uri

总结下来就是
uri 他会显示 真是地址 不会显示所赋予的值
request_uri 他会显示所有地址 还有赋予的值

server {
        listen 80;
        server_name     localhost;
        location /test-uri {
                echo "uri = $uri";
                echo "request_uri = $request_uri";
        }
}

测试查看

方法;# curl 196.196.196.131/test-uri
 uri = /test-uri
 request_uri = /test-uri
 方法;’# curl “196.196.196.131/test-uri?a=3&b=4”
 uri = /test-uri
 request_uri = /test-uri?a=3&b=4

nginx配置文件中使用变量 nginx变量详解_nginx配置文件中使用变量_07


3、$arg_XXX 不区分大小写

我自己的理解就是,可以在外面把值传输到里面

另一个特别常用的内建变量其实并不是单独一个变量,而是有无限多变种的一群变量,即名字以 arg_ 开头的所有变量,我们估且称之为 arg_XXX 变量群。

一个例子是 arg_name,这个变量的值是当前请求中名为 name 的参数的值,而且还是未解码的原始形式的值。

server {
        listen 80;
        server_name     localhost;
        location /test-arg {
        echo "$arg_name";
        echo "$arg_class";
        }
}

nginx配置文件中使用变量 nginx变量详解_nginx配置文件中使用变量_08


输出测试

curl “196.196.196.131/test-arg?name=ming&class=qing”

nginx配置文件中使用变量 nginx变量详解_nginx配置文件中使用变量_09


3、$arg_XXX 不区分大小写其实 $arg_name 不仅可以匹配 name 参数,也可以匹配 NAME 参数,抑或是 Name,Nginx 会在匹配参数名之前,自动把原始请求中的参数名调整为全部小写的形式。

测试

curl “196.196.196.131/test-arg?NAME=ming&CLASS=qing”

nginx配置文件中使用变量 nginx变量详解_nginx_10