我正在尝试安装新mod_ecaptcha
模块ejabberd-contrib
。但启用后 ejabberd 崩溃了。我的初始数据:ejabberd 23.01 erlang 25.2.3
我已经启用了 ejabberd-contrib
ejabberdctl modules_update_specs
安装并重新编译 mod_ecaptcha
ejabberdctl module_install mod_ecaptcha
make -C .ejabberd-modules/sources/ejabberd-contrib/mod_ecaptcha/deps/ecaptcha/c_src
ejabberdctl module_upgrade mod_ecaptcha
编译时没有错误。安装 erlang-dev,
apt install erlang-dev
因为没有它就无法编译我正在使用基本配置
captcha_cmd: mod_ecaptcha captcha_url: http://myjabber:5280/captcha listen: - port: 5280 module: ejabberd_http request_handlers: /captcha: ejabberd_captcha modules: mod_ecaptcha: {}
最后我启动了 ejabberd 并在 error.log 中收到错误,并且 ejabberd 服务崩溃。
2023-06-19 19:59:11.892726+03:00 [错误] <0.757.0>@proc_lib:crash_report/4:539 崩溃报告:崩溃者:初始调用:ejabberd_captcha:init/1 pid:<0.757.0> registered_name:[] 异常错误:在函数 ecaptcha:pixels/2 中未定义函数 ecaptcha_nif:rand_size/0(/var/lib/ejabberd/.ejabberd-modules/sources/ejabberd-contrib/mod_ecaptcha/deps/ecaptcha/src/ecaptcha.erl,第 63 行)在来自 ecaptcha:img/3 的调用中(/var/lib/ejabberd/.ejabberd-modules/sources/ejabberd-contrib/mod_ecaptcha/deps/ecaptcha/src/ecaptcha.erl,第 107 行)在来自 mod_ecaptcha:create_image/1 的调用中(/var/lib/ejabberd/.ejabberd-modules/sources/ejabberd-contrib/mod_ecaptcha/src/mod_ecaptcha.erl,第 78 行)在来自 ejabberd_captcha:check_captcha_setup/0 的调用中(ejabberd_captcha.erl,第 573 行)在来自 ejabberd_captcha:init/1 的调用中(ejabberd_captcha.erl,第 294 行)在来自 gen_server:init_it/2 的调用中(gen_server.erl,第 851 行)在来自gen_server:init_it/6(gen_server.erl,第 814 行)祖先:[ejabberd_sup,<0.123.0>] message_queue_len:0 消息:[] 链接:[<0.412.0>] 字典:[{rand_seed,{#{bits => 58,jump => #Fun<rand.3.34006561>,next => #Fun<rand.0.34006561>,type => exsss,uniform => #Fun<rand.1.34006561>,uniform_n => #Fun<rand.2.34006561>},[114826259057369191|191927986778231166]}}] trap_exit:false 状态:正在运行 heap_size:376 stack_size:28减少量:393 邻居:2023-06-19 19:59:11.925067+03:00 [关键] <0.123.0>@ejabberd_app:start/2:68 无法启动 ejabberd 应用程序:{error,{shutdown,{failed_to_start_child,ejabberd_captcha,{undef,[{ecaptcha_nif,rand_size,[],[]}, {ecaptcha,pixels,2, [{file, "/var/lib/ejabberd/.ejabberd-modules/sources/ejabberd-contrib/mod_ecaptcha/deps/ecaptcha/src/ecaptcha.erl"}, {line,63}]}, {ecaptcha,img,3, [{file, "/var/lib/ejabberd/.ejabberd-modules/sources/ejabberd-contrib/mod_ecaptcha/deps/ecaptcha/src/ecaptcha.erl"}, {line,107}]}, {mod_ecaptcha,create_image,1, [{file, "/var/lib/ejabberd/.ejabberd-modules/sources/ejabberd-contrib/mod_ecaptcha/src/mod_ecaptcha.erl"}, {line,78}]}, {ejabberd_captcha, check_captcha_setup,0, [{file,"ejabberd_captcha.erl"}, {line,573}]}, {ejabberd_captcha,init,1, [{file,"ejabberd_captcha.erl"}, {line,294}]}, {gen_server,init_it,2, [{file,"gen_server.erl"}, {line,851}]}, {gen_server,init_it,6, [{file,"gen_server.erl"}, {line,814}]}]}}}}
完整日志:
错误日志https://pastebin.com/yQKefm4N
日志https://pastebin.com/uENVE5fC
你能帮我吗?
答案1
未定义函数 ecaptcha_nif:rand_size/0
似乎某些文件没有被编译,可能是 ecaptcha_nif.beam 或 ecaptcha.so,或者它们没有被安装,或者无法加载。
在 ejabberd 23.04 中有一个提交改进了这一点: https://github.com/processone/ejabberd/commit/c5c7e7fc4db97022986d1595b73781571a3d59f2
首先,检查所有源代码文件是否都已编译并安装:
$ find .ejabberd-modules/mod_ecaptcha/
.ejabberd-modules/mod_ecaptcha/
.ejabberd-modules/mod_ecaptcha/COMMIT.json
.ejabberd-modules/mod_ecaptcha/conf
.ejabberd-modules/mod_ecaptcha/conf/mod_ecaptcha.yml
.ejabberd-modules/mod_ecaptcha/ebin
.ejabberd-modules/mod_ecaptcha/ebin/ecaptcha_gif_lzw.beam
.ejabberd-modules/mod_ecaptcha/ebin/ecaptcha.beam
.ejabberd-modules/mod_ecaptcha/ebin/mod_ecaptcha.beam
.ejabberd-modules/mod_ecaptcha/ebin/ecaptcha_color.beam
.ejabberd-modules/mod_ecaptcha/ebin/ecaptcha_nif.beam
.ejabberd-modules/mod_ecaptcha/ebin/ecaptcha_gif.beam
.ejabberd-modules/mod_ecaptcha/ebin/ecaptcha_png.beam
.ejabberd-modules/mod_ecaptcha/mod_ecaptcha.spec
.ejabberd-modules/mod_ecaptcha/priv
.ejabberd-modules/mod_ecaptcha/priv/ecaptcha.so
所有文件都在吗?特别是 ecaptcha_nif.beam 和 ecaptcha.so
如果缺少某些文件,也许您需要安装 gcc 编译器或其他包来编译 ecaptcha.so。
如果所有文件都在那里,也许 ejabberd 23.01 无法加载它们。
显而易见的解决方案是将 ejabberd 更新至 23.04。
如果您现在无法将 ejabberd 23.01 更新到 23.04,另一个解决方案是将 ecaptcha.so 复制到 ejabberd 23.01 可以找到它的位置。例如,搜索名为 xmpp_uri.so 的文件,然后将 ecaptcha.so 复制到同一目录中。