添加ibrowse依赖至Makefile后Cowboy Web服务器启动崩溃求助
我之前也踩过这个坑,用erlang.mk给Cowboy项目加ibrowse依赖后一启动就崩,折腾了好几个小时才捋明白问题所在,给你分享几个实用的排查和解决思路:
1. 先确认erlang.mk的依赖配置是否完整
你说按照erlang.mk文档加了单行配置,大概率是只加了DEPS += ibrowse,但有时候还得指定ibrowse的仓库源,不然erlang.mk可能拉不到正确的依赖版本。试试把这两行都加到Makefile里:
DEPS += ibrowse dep_ibrowse = git https://github.com/cmullaparthi/ibrowse.git master
如果担心最新版有兼容性问题,也可以指定一个经过验证的稳定版本,比如v5.1.2,我之前用这个版本搭配Cowboy 2.x没出过问题:
dep_ibrowse = git https://github.com/cmullaparthi/ibrowse.git v5.1.2
2. 验证ibrowse是否正确编译并能被加载
先手动编译所有依赖和项目,执行:
make clean deps compile
然后检查项目的deps/ibrowse/ebin目录下有没有ibrowse.beam文件。接着启动Erlang shell,输入:
code:which(ibrowse).
如果返回的是具体的文件路径,说明模块能正常加载;如果返回non_existing,那就是依赖没编译成功,或者代码路径没配置对,这时候要检查erlang.mk的DEPS配置有没有写错,或者手动把ibrowse的ebin目录加到代码路径里。
3. 查看崩溃日志定位具体原因
崩溃的时候Ershell肯定会输出错误信息,比如undef(调用了未定义的函数)、badarg(参数错误)或者application_start_failure(应用启动失败)。
- 如果是
undef错误,说明调用ibrowse的函数时模块还没加载,或者ibrowse版本和你调用的API不匹配; - 如果是应用启动失败,大概率是ibrowse本身启动需要依赖其他组件(比如ssl),先在Erlang shell里手动启动试试:
application:start(ibrowse).,看会不会报错,要是提示缺少ssl,就先启动ssl:application:start(ssl).,再启动ibrowse。
4. 确保启动顺序正确
ibrowse是一个独立的Erlang应用,Cowboy启动前得先让ibrowse跑起来。最简单的方法是在你的项目.app.src文件(一般在src/你的项目名.app.src)里,把ibrowse加到applications列表里:
{applications, [kernel, stdlib, cowboy, ibrowse]},
这样Erlang启动你的应用时,会自动按照顺序启动依赖的应用,就不会出现Cowboy要调用ibrowse但它还没启动的情况了。
按照这几步排查下来,基本上就能解决启动崩溃的问题了,我当时就是因为没在.app.src里加ibrowse的依赖,导致启动顺序错了才崩的。
内容的提问来源于stack exchange,提问作者Chris W

