You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

关键修改点

  1. 移除yaws_api:setconf调用:避免在Yaws进程未启动时调用依赖进程的API。
  2. 拆分配置结构:将全局参数与服务器参数分离,通过{server, ServerConf}传递服务器专属配置,确保Yaws正确识别参数类型。
  3. 修正docroot配置:用/dev/null替代none原子,既满足Yaws的字符串类型要求,又彻底禁用静态文件服务。
  4. 确保配置一次性加载:所有配置通过embedded_start_conf直接传递,启动时一次性生效。

内容的提问来源于stack exchange,提问作者pankaj mali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:05:06