文章目录
- 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
重点 重点 重点 重点 重点
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 查看模块是否添加成功
配置变量
我这里创建了一个子文件
server {
listen 80;
server_name localhost;
location /test {
set $foo 42;
echo "666 $foo";
}
}
测试 curl 196.196.196.131/test
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";
}
}
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请求或响应中一部分内容的值,以下为一些常用的内置预定义变量
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
3、$arg_XXX 不区分大小写
我自己的理解就是,可以在外面把值传输到里面
另一个特别常用的内建变量其实并不是单独一个变量,而是有无限多变种的一群变量,即名字以 arg_ 开头的所有变量,我们估且称之为 arg_XXX 变量群。
一个例子是 arg_name,这个变量的值是当前请求中名为 name 的参数的值,而且还是未解码的原始形式的值。
server {
listen 80;
server_name localhost;
location /test-arg {
echo "$arg_name";
echo "$arg_class";
}
}
输出测试
curl “196.196.196.131/test-arg?name=ming&class=qing”
3、$arg_XXX 不区分大小写其实 $arg_name 不仅可以匹配 name 参数,也可以匹配 NAME 参数,抑或是 Name,Nginx 会在匹配参数名之前,自动把原始请求中的参数名调整为全部小写的形式。
测试
curl “196.196.196.131/test-arg?NAME=ming&CLASS=qing”