emqx_auth_http启用在设备量多的情况下会导致服务端崩溃

环境信息

  • EMQX 版本:4.3.6
  • 操作系统及版本:centos7 阿里龙蜥8.6
  • 其他

问题描述

emqx连接需要鉴权,所以用了emqx_auth_http这个方式。其他方式没考虑,因为http毕竟代码自由度高一点。但是医院客户现场设备量在1000左右,会报"gun_error"和相关emqx_auth_http failed to Execute的问题。然后会导致服务端一系列错误,比如redis server went away等。研发猜测是和文件句柄相关。emqx_auth_http里的代码很简单,是采用算法形式的验证,没有和redis和数据库有交互,正常情况下没有问题。

配置文件及日志

emqx_log.tar.gz (2.8 MB)

2022-10-18 12:26:22.876 [error] <<“N04A8111068”>>@166.2.28.107:54762 [Hooks] Failed to execute {emqx_auth_http,check,[#{auth_req => {http_request,post,"/api/v1/mqtt/auth",[{<<“content-type”>>,<<“application/x-www-form-urlencoded”>>}],[{“clientid”,"%c"},{“username”,"%u"},{“password”,"%P"},{“ipaddress”,"%a"}],5000},pool_name => emqx_auth_http,super_req => undefined}]}: {{timeout,{gen_server,call,[<0.1788.0>,{post,{"/api/v1/mqtt/auth",[{<<“content-type”>>,<<“application/x-www-form-urlencoded”>>}],<<“clientid=N04A8111068&username=60000000767945&password=2013012679&ipaddress=166.2.28.107”>>},5000},6000]}},[{gen_server,call,3,[{file,“gen_server.erl”},{line,223}]},{emqx_auth_http_cli,do_request,5,[{file,“emqx_auth_http_cli.erl”},{line,50}]},{emqx_auth_http,check,3,[{file,“emqx_auth_http.erl”},{line,45}]},{emqx_hooks,safe_execute,2,[{file,“emqx_hooks.erl”},{line,164}]},{emqx_hooks,do_run_fold,3,[{file,“emqx_hooks.erl”},{line,143}]},{emqx_access_control,authenticate,1,[{file,“emqx_access_control.erl”},{line,77}]},{emqx_channel,auth_connect,2,[{file,“emqx_channel.erl”},{line,1181}]},{emqx_misc,pipeline,3,[{file,“emqx_misc.erl”},{line,107}]}]}
2022-10-18 12:26:22.877 [warning] <<“N04A8111068”>>@166.2.28.107:54762 [Channel] Client N04A8111068 (Username: ‘60000000767945’) login failed for not_authorized
2022-10-18 12:26:22.900 [error] Received ‘gun_error’ message from unknown stream ref: #Ref<0.73929297.1505492996.10678>

2022-10-18 12:26:22.930 [error] Received ‘gun_error’ message from unknown stream ref: #Ref<0.73929297.1505492994.856>

2022-10-18 12:26:22.937 [error] Received ‘gun_error’ message from unknown stream ref: #Ref<0.73929297.1505492996.17378>

2022-10-18 12:26:22.952 [error] Received ‘gun_error’ message from unknown stream ref: #Ref<0.73929297.1505230878.255109>

2022-10-18 12:26:22.982 [error] Received ‘gun_error’ message from unknown stream ref: #Ref<0.73929297.1505230878.255187>

2022-10-18 12:26:22.990 [error] Received ‘gun_error’ message from unknown stream ref: #Ref<0.73929297.1505230878.255149>

服务器的配置已按官方文档优化至最大,依然没有效果

这个错emqx是post到你的http 服务器进行auth认证 timeout了,没返回。
你发的日志里面全是这个错。

关了emqx_auth_http服务,一切运转正常。

对啊,因为你post到你http服务的东西一直没返回。。

127.0.0.1 - - [18/Oct/2022:12:26:19 +0800] “POST /api/v1/mqtt/auth HTTP/1.1” 200 5 “-” “-”
127.0.0.1 - - [18/Oct/2022:12:26:19 +0800] “POST /api/v1/mqtt/auth HTTP/1.1” 200 5 “-” “-”
127.0.0.1 - - [18/Oct/2022:12:26:19 +0800] “POST /api/v1/mqtt/auth HTTP/1.1” 200 5 “-” “-”
127.0.0.1 - - [18/Oct/2022:12:26:20 +0800] “POST /api/v1/mqtt/auth HTTP/1.1” 200 5 “-” “-”
127.0.0.1 - - [18/Oct/2022:12:26:20 +0800] “POST /api/v1/mqtt/auth HTTP/1.1” 200 5 “-” “-”
nginx日志是正常的
401 和200 严格按照文档开发的,只是做了简单的校验

是用的http,还是https?
是开启就不行,还是运行一段时间就不行了?

http的, 运行一段时间就不行

总量是1000左右连接,大约的连接并发是多少?
不过查了一下代码。v4.3.6后的http服务做了很多性能优化,
你可直接升级到最新版本,极大可能这个问题就消失了~
目前最新应该是v4.3.16或v4.4.10

疫情隔离了,后面几天会做下并发测试和升级版本。保持联系

stay healthy :blush:
版本在后续真的做了很多性能优化~推荐推荐
如果遇到新的问题,可以再开帖子,这个我先点解决了。

使用http认证连接emqx可以登录但是输出错误日志 可以看这个