Nginx入門(二)Nginx echo 模塊的使用
原本是想在第二篇文章就介紹nginx配置反向代理服務器。但是發(fā)現(xiàn)了echo模塊這樣的神器铅鲤,對于之后學習nginx配置代理服務器會有很大幫助,所以先學習一下echo模塊褥伴。
echo 模塊是在nginx程序上擴展了echo輸出字符的功能, 對于調(diào)試很方便, 可以說是學習nginx的必備神器准谚。項目地址:https://github.com/openresty/echo-nginx-module
安裝
本人在安裝 echo 模塊的時候也是遇到各種坑。如果你的電腦不是Mac, 可以參考Nginx動態(tài)模塊安裝 結(jié)合echo 模塊 安裝指南瓢谢。
如果你用的是mac今阳。那么就用brew吧暮顺,一條命令安裝凉蜂。可以用一下命令羔杨。
brew install nginx-full --with-echo-module
具體可以參考這個鏈接(ttps://github.com/Homebrew/homebrew-nginx)
如果你之前安裝過Nginx捌臊,用brew安裝可能會遇到?jīng)_突,可以用下面命令解決沖突兜材。
brew unlink nginx
使用
大家可以通過下面的鏈接下載該配置文件理澎。后面echo模塊的測試用例根據(jù)該文件來講解。如果你是mac電腦曙寡,并且按照之前步驟安裝好nginx糠爬,那么把下載下來的配置文件放在/usr/local/etc/nginx/servers
目錄下面。在本地電腦配置host
127.0.0.1 testecho.baidu.com
日志
先說一下怎么看nginx 日志举庶。電腦安裝nginx后并沒創(chuàng)建nginx日志目錄文件执隧。需要根據(jù)你的配置文件,手動創(chuàng)建。 我在/usr/local/etc/nginx/
目錄下創(chuàng)建日志目錄logs/nginx
,所有訪問testecho.qidian.com
的訪問日志和錯誤日志都會自動打印到該目錄下镀琉。
下面簡單介紹一下幾個常用的命令
echo - 輸出字符
- 語法:
echo [options] <string>
...
輸出全局變量$remote_addr
location /test {
echo $remote_addr;
echo $args;
}
curl testecho.baidu.com:8081/test?123
輸出結(jié)果為
127.0.0.1
123
這樣可以方便查看第一篇文章中介紹的全局變量的值峦嗤,是不是很方便?
echo_before_body, echo_after_body - 頁面前屋摔、后插入內(nèi)容
- 語法:
echo_before_body [options] [argument]...
# 反向代理添加前置烁设、后置內(nèi)容
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
輸出結(jié)果為:
hello before
127.0.0.1
123
world after
echo_sleep - 請求等待
- 語法:
echo_sleep <seconds>
該方法可以使得請求等待指定秒數(shù)。該方法不會阻塞整個nginx進程钓试。
curl testecho.baidu.com:8081/api/sleep
輸出結(jié)果為
1
2
echo_location_async, echo_location - 請求指定路徑
- 語法:
echo_location_async <location> [<url_args>]
異步跟同步的區(qū)別是:
- 異步會并行的去請求
- 同步等待當前請求結(jié)束才會往下執(zhí)行
下面這個整個時間為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 輸出結(jié)果為
hello
world
took 0.000 sec for total.
之所以輸出0s因為main1不會去等待兩個子請求sub1和sub2装黑。所以非常快就結(jié)束了弓熏。
如果將上面main1中的echo_location_async 改成echo_location恋谭。
curl testecho.baidu.com:8081/main2 輸出結(jié)果為
hello
world
took 3.002 sec for total.
可以通過第二個參數(shù)傳參數(shù)給子請求 querystring: echo_location_async /sub 'foo=Foo&bar=Bar';
echo_foreach_split - 分隔循環(huán)
- 語法:
echo_foreach_split <delimiter> <string>
該方法可以將請求中參數(shù)根據(jù)分隔符分離出來。
location /loop {
echo_foreach_split ',' $arg_list;
echo "item: $echo_it";
echo_end;
}
curl testecho.baidu.com:8081/loop?list=cat,dog,mouse 輸出結(jié)果為
item: cat
item: dog
item: mouse
if語句的調(diào)試
通過arg_val
可以獲取到請求參數(shù)挽鞠,方便調(diào)試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配置反向代理服務器??
面試資料推薦
https://zfau4tzxp5.feishu.cn/docx/ByM0dxtWoo87QtxnWtTcG0kCnpg