系统版本 | 内核版本 |
---|---|
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