Nginx入门(二)Nginx echo 模块的使用

Nginx入门(二)Nginx echo 模块的使用

原本是想在第二篇文章就介绍nginx配置反向代理服务器。但是发现了echo模块这样的神器,对于之后学习nginx配置代理服务器会有很大帮助,所以先学习一下echo模块。
echo 模块是在nginx程序上扩展了echo输出字符的功能, 对于调试很方便, 可以说是学习nginx的必备神器。项目地址:https://github.com/openresty/echo-nginx-module

安装

本人在安装 echo 模块的时候也是遇到各种坑。如果你的电脑不是Mac, 可以参考Nginx动态模块安装 结合echo 模块 安装指南。
如果你用的是mac。那么就用brew吧,一条命令安装。可以用一下命令。

brew install nginx-full --with-echo-module

具体可以参考这个链接(ttps://github.com/Homebrew/homebrew-nginx)
如果你之前安装过Nginx,用brew安装可能会遇到冲突,可以用下面命令解决冲突。

brew unlink nginx

使用

大家可以通过下面的链接下载该配置文件。后面echo模块的测试用例根据该文件来讲解。如果你是mac电脑,并且按照之前步骤安装好nginx,那么把下载下来的配置文件放在/usr/local/etc/nginx/servers目录下面。在本地电脑配置host

127.0.0.1 testecho.baidu.com

日志

先说一下怎么看nginx 日志。电脑安装nginx后并没创建nginx日志目录文件。需要根据你的配置文件,手动创建。 我在/usr/local/etc/nginx/目录下创建日志目录logs/nginx,所有访问testecho.qidian.com的访问日志和错误日志都会自动打印到该目录下。

下面简单介绍一下几个常用的命令

echo - 输出字符

  • 语法: echo [options] ...
输出全局变量$remote_addr
 location /test {
     echo $remote_addr;
     echo $args;
 }

curl testecho.baidu.com:8081/test?123
输出结果为

127.0.0.1
123

这样可以方便查看第一篇文章中介绍的全局变量的值,是不是很方便?

echo_before_body, echo_after_body - 页面前、后插入内容

  • 语法: echo_before_body [options] [argument]...
# 反向代理添加前置、后置内容
location = /api/proxy_before_after {
    echo_before_body hello before;
    proxy_pass http://127.0.0.1:8081/test;
    echo_after_body world after;
}

curl testecho.baidu.com:8081/api/proxy_before_after?123
输出结果为:

hello before
127.0.0.1
123
world after

echo_sleep - 请求等待

  • 语法: echo_sleep
    该方法可以使得请求等待指定秒数。该方法不会阻塞整个nginx进程。
    curl testecho.baidu.com:8081/api/sleep
    输出结果为
 1
 2

echo_location_async, echo_location - 请求指定路径

  • 语法: echo_location_async []

异步跟同步的区别是:

  1. 异步会并行的去请求
  2. 同步等待当前请求结束才会往下执行

下面这个整个时间为2s, 因为所有路径中最大耗时是2s:

location /main1 {
     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;
 }

curl testecho.baidu.com:8081/main1 输出结果为

hello
world
took 0.000 sec for total.

之所以输出0s因为main1不会去等待两个子请求sub1和sub2。所以非常快就结束了。
如果将上面main1中的echo_location_async 改成echo_location。
curl testecho.baidu.com:8081/main2 输出结果为

hello
world
took 3.002 sec for total.

可以通过第二个参数传参数给子请求 querystring: echo_location_async /sub 'foo=Foo&bar=Bar';

echo_foreach_split - 分隔循环

  • 语法: echo_foreach_split
    该方法可以将请求中参数根据分隔符分离出来。
   location /loop {
     echo_foreach_split ',' $arg_list;
       echo "item: $echo_it";
     echo_end;
   }

curl testecho.baidu.com:8081/loop?list=cat,dog,mouse 输出结果为

item: cat
item: dog
item: mouse

if语句的调试

通过arg_val可以获取到请求参数,方便调试if 语句

   location ^~ /if {
       set $res miss;
       if ($arg_val ~* '^a') {
           set $res hit;
           echo $res;
       }
       echo $res;
   }

访问 curl testecho.baidu.com:8081/if?val=abc
输出

hit

访问 curl testecho.baidu.com:8081/if?val=bcd

miss

感谢阅读,下一章会介绍nginx配置反向代理服务器

你可能感兴趣的:(Nginx入门(二)Nginx echo 模块的使用)