美文网首页
nginx浅析

nginx浅析

作者: elon | 来源:发表于2015-03-23 11:34 被阅读215次

    使用echo模块

    1. 编译时加载 echo module
      --add-module=/$yourPath/echo-nginx-module
    2. 在配置文件中增加一段
            location /echomodule {
                set $foo 'hello';
                echo "foo: ${foo},world!";
            }
    
    1. 验证
    curl 'http://localhost/echomodule
    
    1. TIPS:
      a. set的作用,包括创建一个变量,给该变量赋值,两个部分

    变量的创建、赋值所处的生命周期以及作用域

    1. 假设有如下配置
        location /foo0 {
            echo ">>> ${foo1} <<<";
        }
    
    > 检测语法时,提示foo1是个未知变量
    ``` shell
    nginx: [emerg] unknown "foo1" variable
    nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
    
    1. 再新增加一段配置,使用set创建变量foo1
            location /foo0 {
                echo ">>> ${foo1} <<<";
            }
            location /foo1 {
                set $foo1 'foo 1';
                echo ">>> ${foo1} <<<";
            }
    

    语法显示syntax is ok,但是curl foo0的时候,却总是返回空值,说明创建变量是在加载配置的时候发生的,而赋值变量是在每一次请求时候发生的,因此在curl foo0时,虽然在加载配置时,创建了变量foo1,但是赋值操作并没有进行

    1. 修改foo0的配置,给foo0赋值
            location /foo0 {
                set $foo0 $foo1;
                echo ">>> ${foo0} <<<";
            }
    

    curl foo0的结果依然为空,更加验证了上述观点,即在配置加载的时候,创建了两个变量,foo0和foo1,当curl foo1的时候,foo1 被赋值为 u'foo 1',curl不为空;当curl foo0的时候,foo0 期望被赋值为foo1,然而foo1在location /foo0是没有被赋值过的,nginx将foo0赋值了一个空值,因此curl返回结果为空

    1. TIPS:

    a. 在nginx中,变量的一次请求就是完整的生命周期,虽然curl foo1的时候foo1被赋值,但是当curl foo0时,由于两次生命周期是互相隔离的,因此在另一个生命周期中,set $foo0 $foo1;相当于将$foo0赋值为空串

    再谈变量的生命周期与作用域

    1. 假设有如下配置
            location /foo2 {
                set $foo1 'you see foo 2';
                rewrite ^ /foo3;
            }
            location /foo3 {
                echo ">>> ${foo1} <<<";
            }
    

    curl foo2得到的结果为>>> you see foo 2 <<<,而直接curl foo3得到的结果为空,可以看到变量的一个完整的生命周期是与location无关,并且,一次rewrite并不会影响变量的生命周期

    内建变量

    1. nginx有一些buildin的变量,包括uri,request_uri,args等,以及通过arg_xxx的形式获取传入参数的值,假设有如下配置
            location /buildin {
                echo ">>> uri: $uri <<<";
                echo ">>> request_uri: $request_uri <<<";
                echo ">>> args: $args <<<";
                echo ">>> x: $arg_x <<<";
                echo ">>> y: $arg_y <<<";
            }
    

    执行curl 'http://localhost/buildin?x=0&y=0',将得到

        uri: /buildin
        request_uri: /buildin?x=0&y=0
        args: x=0&y=0
        x: 0
        y: 0
    
    1. 强制修改内建变量

    相关文章

      网友评论

          本文标题:nginx浅析

          本文链接:https://www.haomeiwen.com/subject/sckgxttx.html