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 [options] <string>...
- 默认值:
no
# 简单的hello, world!
server {
location = /api/hello {
echo "hello, world!";
}
}
默认echo会自动换行, 不需要换行可以: echo -n xxx;
;
- 语法:
echo_before_body [options] [argument]...
- 默认值:
no
server {
# 简单的输出
location = /api/hello {
echo_before_body echo_before_body;
echo "hello, world!";
echo_after_body echo_after_body;
}
# 常见于代理页面前、后插内容
location = /api/proxy_before_after {
echo_before_body echo_before_body;
echo_before_body echo_before_body;
proxy_pass http://127.0.0.1;
echo_after_body echo_after_body;
echo_after_body echo_after_body;
}
}
- 语法:
echo_sleep <seconds>
- 默认值:
no
server {
# 简单的输出
location = /api/sleep {
echo 1;
# 等待1秒
echo_sleep 1;
echo 2;
}
}
- 语法:
echo_location_async <location> [<url_args>]
- 默认值:
no
location /main {
# 异步调用/sub
echo_location_async /sub;
echo world;
}
location /main2 {
# 同步调用/sub
echo_location_async /sub;
echo world;
}
location /sub {
echo hello;
}
异步跟同步的区别是:
- 异步会并行的去请求
- 同步等待当前请求结束才会往下执行
下面这个整个时间为2s, 因为新路径最大是2s:
location /main {
echo_location_async /sub1;
echo_location_async /sub2;
echo "took $echo_timer_elapsed sec for total.";
}
location /sub1 {
echo_sleep 2;
}
location /sub2 {
echo_sleep 1;
}
下面这个整个时间为3s, 因为需要等待/sub1
完成才进入/sub2
:
location /main {
echo_location /sub1;
echo_location /sub2;
echo "took $echo_timer_elapsed sec for total.";
}
location /sub1 {
echo_sleep 2;
}
location /sub2 {
echo_sleep 1;
}
可以通过第二个参数传querystring
: echo_location_async /sub 'foo=Foo&bar=Bar';
- 语法:
echo_foreach_split <delimiter> <string>
location /split {
echo_foreach_split ',' $arg_list;
echo "item: $echo_it";
echo_end;
}
上面配置当访问: /split?list=cat,dog,mouse
时会输出:
item: cat
item: dog
item: mouse
$arg_list
是对应$args.list
那么配置全echo_location_async
可以做成nginx-combo
服务了, 如:
location = /api/combo {
echo_foreach_split ',' $query_string;
echo "/* combo: $echo_it */";
echo_location_async $echo_it;
echo;
echo_end;
}
访问: /api/combo?/a.js,/b.js
, 需要注意的是文件的路径必须以/
开始, 因为匹配的location
"真的nginx-combo
"服务请看: nginx-http-concat
其他变量请去官网查看~