Nginx echo 模块是在 nginx 程序上扩展了 echo 输出字符的功能,对于调试很方便,项目地址: https://github.com/openresty/echo-nginx-module

安装

目前支持 nginx-1.11.2,高版本可能安装失败,我装 1.11.13 失败了,更多支持 nginx 的版本见: https://github.com/openresty/echo-nginx-module#compatibility

release 下载最新的安装包,并解压.
在配置 Nginx 时用: ./configure --add-module=/你的解压路径,并编译安装,如果是重新编译安装可参考: 重新编译安装

使用

只是研究了一些常用的

echo - 输出字符

  • 语法: echo [options] <string>...
  • 默认值: no

    1. # 简单的hello,world!
    2. server {
    3. location = /api/hello {
    4. echo "hello,world!";
    5. }
    6. }

    默认 echo 会自动换行,不需要换行可以: echo -n xxx;;

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

  • 语法: echo_before_body [options] [argument]...

  • 默认值: no

    1. server {
    2. # 简单的输出
    3. location = /api/hello {
    4. echo_before_body echo_before_body;
    5. echo "hello,world!";
    6. echo_after_body echo_after_body;
    7. }
    8. # 常见于代理页面前、后插内容
    9. location = /api/proxy_before_after {
    10. echo_before_body echo_before_body;
    11. echo_before_body echo_before_body;
    12. proxy_pass http://127.0.0.1;
    13. echo_after_body echo_after_body;
    14. echo_after_body echo_after_body;
    15. }
    16. }

    echo_sleep - 请求等待

  • 语法: echo_sleep <seconds>

  • 默认值: no

    1. server {
    2. # 简单的输出
    3. location = /api/sleep {
    4. echo 1;
    5. # 等待1秒
    6. echo_sleep 1;
    7. echo 2;
    8. }
    9. }

    echo_location_async,echo_location - 请求指定路径

  • 语法: echo_location_async <location> [<url_args>]

  • 默认值: no
    1. location /main {
    2. # 异步调用/sub
    3. echo_location_async /sub;
    4. echo world;
    5. }
    6. location /main2 {
    7. # 同步调用/sub
    8. echo_location_async /sub;
    9. echo world;
    10. }
    11. location /sub {
    12. echo hello;
    13. }
    异步跟同步的区别是:
  1. 异步会并行的去请求
  2. 同步等待当前请求结束才会往下执行

下面这个整个时间为 2s,因为新路径最大是 2s:

  1. location /main {
  2. echo_location_async /sub1;
  3. echo_location_async /sub2;
  4. echo "took $echo_timer_elapsed sec for total.";
  5. }
  6. location /sub1 {
  7. echo_sleep 2;
  8. }
  9. location /sub2 {
  10. echo_sleep 1;
  11. }

下面这个整个时间为 3s,因为需要等待/sub1完成才进入/sub2:

  1. location /main {
  2. echo_location /sub1;
  3. echo_location /sub2;
  4. echo "took $echo_timer_elapsed sec for total.";
  5. }
  6. location /sub1 {
  7. echo_sleep 2;
  8. }
  9. location /sub2 {
  10. echo_sleep 1;
  11. }

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

echo_foreach_split - 分隔循环

  • 语法: echo_foreach_split <delimiter> <string>

    1. location /split {
    2. echo_foreach_split ',' $arg_list;
    3. echo "item: $echo_it";
    4. echo_end;
    5. }

    上面配置当访问: /split?list=cat,dog,mouse 时会输出:

    1. item: cat
    2. item: dog
    3. item: mouse

    $arg_list是对应$args.list
    那么配置全echo_location_async可以做成nginx-combo服务了,如:

    1. location = /api/combo {
    2. echo_foreach_split ',' $query_string;
    3. echo "/* combo: $echo_it */";
    4. echo_location_async $echo_it;
    5. echo;
    6. echo_end;
    7. }

    访问: /api/combo?/a.js,/b.js,需要注意的是文件的路径必须以/开始,因为匹配的location,当然真的 nginx-combo 服务请看: nginx-http-concat
    其他变量请去官网查看~

    link

  • 官网

  • 我写的在线 Demo