环境:
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] <string>
...):输出字符; - echo_before_body(语法:echo_before_body [options] [argument]...):页面前输入;
- echo_after_body(语法:echo_after_body [options] [argument]...):页面后输入;
- echo_sleep(语法:echo_sleep <seconds>):请求等待,该方法可以使得请求等待指定秒数,但该方法不会阻塞整个nginx进程;
- echo_location(语法:echo_location <location> [<url_args>]):同步请求指定地址;
- echo_location_async(语法:echo_location_async <location> [<url_args>]):异步请求指定地址,会继续执行下面请求,但会等待异步结果;
- echo_foreach_split(语法:echo_foreach_split <delimiter> <string>):分割循环,该方法可以将请求中参数根据分隔符分离出来;
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;
}
}
执行结果如下:
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';
}
}
执行结果如下:
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){
};