1. 程式人生 > >abtestingGateway錯誤集錦

abtestingGateway錯誤集錦

管理介面訪問報錯

系統版本 核心版本
Ubuntu 14.04.2 3.13.0-32-generic

我們在這裡通過curl來插入命令的時候直接報錯:
curl命令寫入規則

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' 模組的時候,怎麼辦呢?

  1. 先執行ldconfig,重新載入所有的動態連結庫。
  2. 然後重啟nginx即可。
    如下所示:
# ldconfig
# supervisorctl
nginx                            RUNNING   pid 8737, uptime 0:10:03
supervisor> restart nginx
nginx: stopped
nginx: started

yield報錯

管理介面通過curl(同上)寫入規則的時候,報這個錯誤

attempt to yield across metamethod/C-call boundary

這個的話,我是重新安裝了這幾步
原版本

  1. lua 5.1
  2. LuaJIT 2.0.2
  3. tengine是2.2.0,

安裝後的版本是

  1. lua5.1
  2. LuaJIT 2.0.5
  3. tengine是2.2.0

其實升級的就是LuaJIT而已,主要是安裝完LuaJIT後,需要重新編譯下tengine,並且我這裡使用lua-nginx-module版本是lua-nginx-module-0.10.13

redis連線提示Operation refused

我把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域名無法解析出來。

根因找到了,那麼就分析為啥會這樣的,我仔細檢視nginx的配置檔案,發現有問題的那個業務配置檔案,有一行這樣的配置:resolver xxx.xxx.xxx.xxx valid=300s ,然後我又仔細上nginx官網查詢了下這個resolver的配置,官網解釋請戳這裡 , 意思是說這個resolver的配置是表明這個server的所有域名解析都是用這個dns伺服器來解析,而redis的域名是阿里雲內部的域名,使用剛才配置單的那個dns,根本無法解析,所以才會提示redis連線不上了。

找到為什麼會導致無法連線redis的原因後,我們就開始整改了,把resolver去掉或者新增一個阿里雲的dns即可。新增完成後重啟nginx就可以正常使用ab分流功能了。