系統版本 | 內核版本 |
---|---|
Ubuntu 14.04.2 | 3.13.0-32-generic |
咱們在這裏經過curl來插入命令的時候直接報錯:
curl命令寫入規則html
curl 'http://127.0.0.1:8080/ab_admin?token=zuesx&action=policy_set' -d '{"divtype":"30102","divdata":[{"30102_set":["hsy51234567qc","hsyf1a2c3d4b5"],"upstream":"newhsy"}]}'
2018/10/23 17:44:28 [error] 8738#0: *1090 lua entry thread aborted: runtime error: /opt/nginx/lua_gray/admin/ab_action.lua:5: loop or previous error loading module 'abtesting.utils.utils' stack traceback: coroutine 0: [C]: in function 'require' /opt/nginx/lua_gray/admin/ab_action.lua:5: in function </opt/nginx/lua_gray/admin/ab_action.lua:1>, client: 127.0.0.1, server: localhost, request: "POST /ab_admin?token=zuesx&action=policy_set HTTP/1.1", host: "127.0.0.1:8080"
上面的報錯很明顯,又提示進入調用死循環關係或者前期錯誤當加載'abtesting.utils.utils' 模塊的時候,怎麼辦呢?nginx
# ldconfig # supervisorctl nginx RUNNING pid 8737, uptime 0:10:03 supervisor> restart nginx nginx: stopped nginx: started
管理接口經過curl(同上)寫入規則的時候,報這個錯誤redis
attempt to yield across metamethod/C-call boundary
這個的話,我是從新安裝了這幾步
原版本服務器
安裝後的版本是curl
其實升級的就是LuaJIT而已,主要是安裝完LuaJIT後,須要從新編譯下tengine,而且我這裏使用lua-nginx-module版本是lua-nginx-module-0.10.13oop
我把ab部署到阿里雲後,在阿里雲開了一個redis,redis使用的域名鏈接,而後我在server段的redis配置,把$redis_host的地址設置爲了 xxx.aliyun.com,這個域名就是redis鏈接域名。因而啓動nginx+ab,發如今業務流量分流的時候,nginx日誌裏面老是提示 鏈接redis失敗,因此灰度名單分流也失敗,可是發現規則增刪改查的接口都沒有問題,也就是沒有提示任何鏈接redis失敗的緣由,我剖析ab的源碼,發現都是共用一個redis模塊,或者說共用一個redis方法來實現鏈接的,爲何管理接口的卻沒有事呢,關鍵這個Operation refused並無提示更多有用的信息,因而我把鏈接redis的那段代碼,把err信息所有經過ngx.say這樣的方式打印出來,發現完整的報錯信息是xxx.aliyuncs.com could not be resolved (5: Operation refused)
,得,這很明顯了,是redis域名沒法解析出來。ui
根因找到了,那麼就分析爲啥會這樣的,我仔細查看nginx的配置文件,發現有問題的那個業務配置文件,有一行這樣的配置:resolver xxx.xxx.xxx.xxx valid=300s
,而後我又仔細上nginx官網查詢了下這個resolver的配置,官網解釋請戳這裏 , 意思是說這個resolver的配置是代表這個server的全部域名解析都是用這個dns服務器來解析,而redis的域名是阿里雲內部的域名,使用剛纔配置單的那個dns,根本沒法解析,因此纔會提示redis鏈接不上了。阿里雲
找到爲何會致使沒法鏈接redis的緣由後,咱們就開始整改了,把resolver去掉或者添加一個阿里雲的dns便可。添加完成後重啓nginx就能夠正常使用ab分流功能了。lua