V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
enj0y
V2EX  ›  自言自语

把NGINX当做一门语言来玩

  •  
  •   enj0y · 2012-11-27 19:55:49 +08:00 · 405 次点击
    这是一个创建于 4383 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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,都是玩的皮毛。
    2 条回复    1970-01-01 08:00:00 +08:00
    clino
        1
    clino  
       2012-11-27 20:39:24 +08:00
    看到标题就想起 openresty,不过这个 slide 第一次看到
    enj0y
        2
    enj0y  
    OP
       2012-11-27 21:36:59 +08:00
    @clino openresty也是春哥的一个开源项目,他是以嵌入式LUA用以编程的,达不到CONF C代码级的执行效率。这个slide确实可以启发很多人。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5395 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:57 · PVG 13:57 · LAX 21:57 · JFK 00:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.