nginx学习1.6 nginx内置变量及if语句

环境:

centos6/7,nginx-1.9.15.

摘要说明:

上一篇主要讲述nginx下的负载均衡的配置;

本章节主要讲述nginx的常用内置变量及if语句;

步骤:

1.echo和set

echo

nginx有个模块echo,是在nginx程序上扩展了echo输出字符的功能, 对于调试很方便;参考文档:链接

echo默认是不安装的,编译时会报nginx: [emerg] unknown directive "echo";所以首先我们需要手动安装echo模块;yum安装的动态安装模块可参考:链接

从官网下载echo,下载zip格式上传到服务器上,这里是上传到/usr/local/路径下并解压;

# unzip echo-nginx-module-master.zip

到达nginx解压目录下进行编译安装即可:

# cd /usr/local/nginx-1.9.15
# ./configure --prefix=/usr/local/nginx  --with-http_stub_status_module --with-http_ssl_module --add-module=/usr/local/echo-nginx-module-master
# make -j2 && make install

上述注意两点:

1.nginx重新编译安装需要加上之前安装的模块

2.安装好后sbin下会出现nginx和nginx_old两个命令,需要重新启动进程,新的命令才会生效 

echo有一系列的语法,常用语法如下:

  • echo(语法:echo [options] ...):输出字符;
  • echo_before_body(语法:echo_before_body [options] [argument]...):页面前输入;
  • echo_after_body(语法:echo_after_body [options] [argument]...):页面后输入;
  • echo_sleep(语法:echo_sleep ):请求等待,该方法可以使得请求等待指定秒数,但该方法不会阻塞整个nginx进程;
  • echo_location(语法:echo_location []):同步请求指定地址;
  • echo_location_async(语法:echo_location_async []):异步请求指定地址,会继续执行下面请求,但会等待异步结果;
  • echo_foreach_split(语法:echo_foreach_split ):分割循环,该方法可以将请求中参数根据分隔符分离出来;

set

set可以理解为定义变量,通常搭配if做局部变量协助判断;通用实例:set $a=1;

实例:

	server {
        listen       2016;
        server_name  localhost;
		#输出hello world
        location  /hello {
		    echo hello world;
        }
		#输出内置全局变量
		location  /test {
		    echo $remote_addr;
            echo $args;
        }
		#输出页面前后加内容
		location  /proxy_before_after {
		    echo_before_body hello before;
            proxy_pass http://127.0.0.1:2016/test;
            echo_after_body world after;
        }
		#等待3秒后输出内容
		location  /sleep {
		    echo_sleep 3;
		    echo hello world;
        }
		#同步调用,按序执行并等待,故耗时相加
		location /sync {
            echo_reset_timer;
            echo_location /sub1;
            echo_location /sub2;
            echo "took $echo_timer_elapsed sec for total.";
        }
		#异步步调用,按序执行不等待,故耗时为零
		location /async {
            echo_reset_timer;
            echo_location_async /sub1;
            echo_location_async /sub2;
            echo "took $echo_timer_elapsed sec for total.";
        }
        location /sub1 {
            echo_sleep 2;
            echo hello;
        }
        location /sub2 {
            echo_sleep 1;
            echo world;
        }
		#分割请求参数
        location /split {
            echo_foreach_split ',' $arg_list;
            echo "item: $echo_it";
            echo_end;
        } 
		#if语句搭配set局部变量做判断
		location /if {
            #设置局部变量res,值为miss
			set $res miss;
			#判断请求参数是否含a
            if ($arg_val ~* '^a') {
                set $res hit;
                echo $res;
            }
            echo $res;
        }
        error_page   500 502 503 504  /50x.html;
        location  /50x.html {
            root   html;
        }
    }

执行结果如下:

nginx学习1.6 nginx内置变量及if语句_第1张图片

2.内置变量

nginx有许多内置变量,常用的有:

  • $host:请求中的主机头(Host)字段,如果请求中的主机头不可用或者空,则为处理请求的server名称
  • $http_HEADER : HTTP请求头中的内容,HEADER为HTTP请求中的内容转为小写,     -变为_(破折号变为下划线),例如:$http_user_agent(Uaer-Agent的值)
  • $remote_addr 客户端的IP地址。
  • $remote_port 客户端的端口。
  • $request_method 这个变量是客户端请求的动作,通常为GET或POST。
  • $request_uri 这个变量等于包含一些客户端请求参数的原始URI
  • $scheme 所用的协议,比如http或者是https
  • $server_name 服务器名称。 $server_port 请求到达服务器的端口号。
  • $server_protocol 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
  • $uri 请求中的当前URI(不带请求参数,参数位于$args)

对于内置变量我们只要知道其含义在后面的if语句或者其他配置中能够使用即可;

我们可以通过echo打印下常用内置变量:

    server {
        listen       2017;
        server_name  localhost;

        location /var {
	        echo '[host]=$host' ;
	        echo '[http_HEADER]=$http_HEADER' ;
	        echo '[remote_addr]=$remote_addr' ;
	        echo '[remote_port]=$remote_port' ;
            echo '[request_method]=$request_method' ;
            echo '[request_uri]=$request_uri' ;
	        echo '[scheme]=$scheme' ;
            echo '[server_name]=$server_name' ;
            echo '[server_protocol]=$server_protocol' ;
	        echo '[uri]=$uri' ;
	        echo '[http_origin]=$http_origin';
	        echo '[http_user_agent]=$http_user_agent';
	        echo '[request_filenameecho]=$request_filename';
        }
    }

执行结果如下:

 nginx学习1.6 nginx内置变量及if语句_第2张图片

3.if语句

首先申明nginx只有if语句做判断适应,没有else语句

if语句的常用形式如下:

if(正则){

};

if语句的常用正则有:

= ,!=

比较的一个变量和字符串。

~, ~*

与正则表达式匹配的变量,如果这个正则表达式中包含

-f,!-f

检查一个文件是否存在。

-d, !-d

检查一个目录是否存在。

-e,!-e

检查一个文件、目录、符号链接是否存在。

-x, !-x

检查一个文件是否可执行。

常用实例有:

#location匹配也是if语句的一种缩写
location ~ /rex/.*\.(htm|js|css)${
};
#域名匹配校验,搭配内置变量使用
if ( $http_origin ~ http://(.*).enjoy.com){
};

#浏览器校验:
if ($http_user_agent ~ Firefox){
};

 

你可能感兴趣的:(nginx学习,nginx实战)