把NGINX当做一门语言来玩

2012-11-27 19:55:49 +08:00
 enj0y
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,都是玩的皮毛。
404 次点击
所在节点    自言自语
2 条回复
clino
2012-11-27 20:39:24 +08:00
看到标题就想起 openresty,不过这个 slide 第一次看到
enj0y
2012-11-27 21:36:59 +08:00
@clino openresty也是春哥的一个开源项目,他是以嵌入式LUA用以编程的,达不到CONF C代码级的执行效率。这个slide确实可以启发很多人。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/53439

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX