NGINX是一款轻量级的伺服,我个人最喜欢它的高并发承受能力。NGINX的CONF中,可以像程序语言那样来写代码。不过有些特殊的功能,你需要装额外的模块来才能正常启用。
#给一个变量赋值:
set $a 'hello';
NGINX CONF中可赋值的变量只有一种类型:字符串型。所以常用的运算就是拼凑了。
#给一个变量赋值:
set $a 'hello';
#给另外一个变量赋值:
set $b 'v2ex';
#做一下简单的运算:
set $c "$a $b";
#在安装NGX_ECHO_MODULE过后,你可以使用echo指令来输出变量。
echo $c;
将上面代码放过一段location中,reload nginx后访问这个地址,你将获得:
~$ # curl
http://127.0.0.1/testecho/hello v2ex
NGINX支持条件判断(if)
你可以使用if来做一些比较简单(复杂的也行)条件判断。
set $a "hello";
#如果$a为hello
if ( $a = "hello ) {
echo "var A is hello";
}
#如果$a不为hello(结合上述代码相当于否则)
if ( $a != "hello ) {
echo "var A is not hello";
}
放进location,reload,curl:
~$ # curl
http://127.0.0.1/testecho/var A is hello
你或许想试试if中的“且”条件判断,不过你会沮丧地发现,直接使用if进行&&会报错。
那么,是不是就没了办法了哩?给大家介绍一种妙招:
if ( $a = "hello" ) {
set $xx "1";
}
if ( $b = "v2ex" ) {
set $xx "1$xx";
}
if ( $xx == "11" ) {
#此时这里就相当于是两个条件的且运算判断了。
}
下面给大家介绍一下复杂点的map(映射表)指令,
#假如我想封掉一些比较不受欢迎的蜘蛛,把这段放进http{里}
map $http_user_agent $banit {
#map 入变量 出变量
#入变量是用来在下面的映射条目去匹配的,下面条目中被匹配中的后面的值会传出给出变量。
#比如如果此处,来抓取的蜘蛛是Jike的蜘蛛,会匹配到1,也就是$banit会传出1
#默认不封
default 0;
~sososiper 1;
~Jikespier 1;
~test 1;
~webbench 1;
}
#把下面的代码放过想要封不想欢迎的蜘蛛的location 里
if ( $banit = "1" ) {
#如果 $banit为1
#送他个连接断开
return 444;
}
目前 NGINX的欠缺:1.算术运算 2.更复杂的逻辑。
推荐初学者教程:
春哥的新浪博客http://blog.sina.com.cn/openresty
春哥的PPT(NGINX CONF SCRIPTING)http://agentzh.org/misc/slides/nginx-conf-scripting/nginx-conf-scripting.html#1
看完上面过后,你会发现你以前照搬式地玩NGINX,都是玩的皮毛。