Yaws全局配置未正确设置问题求助(嵌入式启动场景)
Yaws嵌入式模式配置失效与崩溃问题解决
问题背景
需要基于Yaws纯动态提供API/页面服务(无需文档根),在Supervisor中使用yaws_api:embedded_start_conf/1初始化Yaws,但全局配置未生效,且启动时出现崩溃,核心错误为noproc(找不到yaws_server进程)。
崩溃原因分析
从日志可见,yaws_api:setconf调用时触发noproc错误:
- Supervisor的
init/1函数中,Yaws的子进程尚未启动(Supervisor需等待init/1返回后才会启动子进程),此时调用依赖yaws_server进程的setconf必然失败。 - 原配置中
docroot设为原子none,不符合Yaws要求(需字符串类型),导致Yaws默认使用当前目录作为docroot,配置失效。 - 全局参数与服务器参数混合传递,未按Yaws规范拆分,导致部分全局配置未被识别。
解决方案代码
%%%------------------------------------------------------------------- %% @doc myapp top level supervisor. %% @end %%%------------------------------------------------------------------- -module(myapp_sup). -behaviour(supervisor). -export([start_link/0, init/1]). -include_lib("yaws/include/yaws_api.hrl"). -include_lib("yaws/include/yaws.hrl"). -define(SERVER, ?MODULE). start_link() -> supervisor:start_link({local, ?SERVER}, ?MODULE, []). init([]) -> %% 全局配置参数 GlobalConf = [ {ebin_dir, "/mnt/c/Users/PankajMali/Project/myapp/_build/default/lib/myapp/ebin"}, {logdir, "/mnt/c/Users/PankajMali/Project/myapp/yawslogs"}, {max_connections, 1024}, {keepalive_timeout, 60000} ], %% 服务器配置参数(单服务器实例) ServerConf = [ {listen, {127, 0, 0, 1}}, {servername, "Myapp Backend"}, {docroot, "/dev/null"}, % 用无效路径替代none,彻底禁用静态文件服务 {ssl, false}, {port, 8080}, {dynamic_handlers, [{"/api", myapp_yaws_handler}]} ], %% 合并配置并初始化Yaws YawsConf = GlobalConf ++ [{server, ServerConf}], case yaws_api:embedded_start_conf(YawsConf) of {ok, _GlobalConf, _ServerConf, YawsChild} -> io:format("Yaws started successfully~n"), MyAppChild = #{ id => my_app, start => {my_app, start_link, []}, restart => permanent, shutdown => 5000, type => worker, modules => [my_app] }, ChildSpecs = YawsChild ++ [MyAppChild], io:format("Child specifications: ~p~n", [ChildSpecs]), {ok, {{one_for_one, 5, 10}, ChildSpecs}}; Reason -> io:format("Failed to start Yaws: ~p~n", [Reason]), {stop, Reason} end.
关键修改点
- 移除
yaws_api:setconf调用:避免在Yaws进程未启动时调用依赖进程的API。 - 拆分配置结构:将全局参数与服务器参数分离,通过
{server, ServerConf}传递服务器专属配置,确保Yaws正确识别参数类型。 - 修正docroot配置:用
/dev/null替代none原子,既满足Yaws的字符串类型要求,又彻底禁用静态文件服务。 - 确保配置一次性加载:所有配置通过
embedded_start_conf直接传递,启动时一次性生效。
内容的提问来源于stack exchange,提问作者pankaj mali
相关产品推荐
相关产品推荐

