Ejabberd启动梳理及相关文件介绍

启动流程
ejabberd工程启动application:start(ejabberd).
ejabberd.erl

start() ->
    %%%ejabberd_cover:start(),
    application:start(ejabberd).

stop() ->
    application:stop(ejabberd).
    %%%ejabberd_cover:stop().

查找ejabberd.app文件,并按该文件指示,启动ejabberd应用
ejabberd.app.src
查看ejabberd/src/ejabberd.app.src文件

{application, ejabberd,
 [{description, "ejabberd"},
  {vsn, "16.12.beta1-48"},
  {modules, []},
  {registered, []},
  {applications, [kernel, stdlib]},
  {env, []},
  {mod, {ejabberd_app, []}}]}.

mod 定义了应用程序的回调模块和启动参数,由此可知应用程序启动时会由主导进程来调用这个模块的start/2方法
ejabberd_app.erl

start(normal, _Args) ->
    %%%启动lager
    ejabberd_logger:start(),
    %%%将当前erlang虚拟机进程pid写入EJABBERD_PID_PATH定义文件中
    write_pid_file(),
    %%%启动必要应用(例如sasl,ssl,fast_yaml,fast_tls,fast_xml,cache_tab等)
    start_apps(),
    %%%启动elixir应用
    start_elixir_application(),
    %%%检查ejabberd应用是否正常启动
    ejabberd:check_app(ejabberd),
    %%%start() ->ok.
    randoms:start(),
    %%%初始化并启动本地mnesia
    db_init(),
    %%%启动ejabberd进程,loop空循环
    start(),
    %%%从环境变量EJABBERD_MSGS_PATH定义的位置找*.msg并加载到ets:translations表(国际化)
    translate:start(),
    %%%启动gen_server访问控制
    ejabberd_access_permissions:start_link(),
    %%%创建两张表ets-ejabberd_ctl_cmds,ets-ejabberd_ctl_host_cmds
    ejabberd_ctl:init(),
    %%%创建表ets-ejabberd_commands并调整表结构
    ejabberd_commands:init(),
    %%%注册常用ejabberd_command到表ejabberd_commands
    ejabberd_admin:start(),
    %%%创建表ets-ejabberd_modules
    gen_mod:start(),
    %%%增加ejabberd modules到code path中
    ext_mod:start(),
    %%%如果elixir的配置被使用,则安装elixir,否则什么都不做
    setup_if_elixir_conf_used(),
    %%%读取配置并生成公钥(ShareKey)
    ejabberd_config:start(),
    %%%根据配置设置日志级别(level)以及net_ticktime 60s(默认)
    %%%The frequency of both tick messages and detection of failures
    %%%is controlled by the net_ticktime configuration setting
    set_settings_from_config(),
    %%%创建访问控制表并根据配置填写
    acl:start(),
    %%%创建sharpe表并根据配置填写
    shaper:start(),
    %%%连接集群其他节点
    connect_nodes(),
    %%%启动一个supervisor,并启动和监控定义子进程
    Sup = ejabberd_sup:start_link(),
    %%%启动数据库相关模块
    ejabberd_rdbms:start(),
    %%%启动riak
    ejabberd_riak_sup:start(),
    %%%启动redis
    ejabberd_redis:start(),
    %%%启动ms模块
    ejabberd_sm:start(),
    %%%启动SASL安全认证模块
    cyrsasl:start(),
    % Profiling
    %ejabberd_debug:eprof_start(),
    %ejabberd_debug:fprof_start(),
    %%%如果运行在windows系统,则添加域名服务器(DNS)地址到erlang系统中  
    maybe_add_nameservers(),
    %%%启动所有鉴权模块
    ejabberd_auth:start(),
    ejabberd_oauth:start(),
    %%%动该host的所以modules
    gen_mod:start_modules(),
    %%%启动配置文件中的监听器模块
    ejabberd_listener:start_listeners(),
    register_elixir_config_hooks(),
    ?INFO_MSG("ejabberd ~s is started in the node ~p", [?VERSION, node()]),
    Sup;
start(_, _) ->
    {error, badarg}.

附:
1.ejabberd_command命令格式

#ejabberd_commands{name = status, tags = [server],
            desc = "Get status of the ejabberd server",
            module = ?MODULE, function = status,
            result_desc = "Result tuple",
            result_example = {ok, <<"The node ejabberd@localhost is started with status: started"
                "ejabberd X.X is running in that node">>},
            args = [], result = {res, restuple}}

定义一个status命令,接受参数[],返回{res,restuple}
2.监控进程

Sup = ejabberd_sup:start_link()

该语句负责启动子进程监控进程,详细查看start_link启动后调用的init函数

init([]) ->
    ...
    {ok, {{one_for_one, 10, 1},
      [Hooks,
       NodeGroups,
       SystemMonitor,
       Router,
       Router_multicast,
       S2S,
       Local,
       Captcha,
       S2SInSupervisor,
       S2SOutSupervisor,
       ServiceSupervisor,
       IQSupervisor,
       FrontendSocketSupervisor,
       Listener]}}.

{{one_for_one, 10, 1}表示重启策略,one_for_one(只重启终止的子进程自身),如果1s内重启次数超过10则终止所有子进程和自身(详细启动参数可以查看ejabberd_sup.erl)
文件介绍
ejabberd.app
在$(INSTALLDIR)/ejabberd/ebin 目录下,用于配置ejabberd 应用程序的部分信息,主要提供应用程序可以加载的所有模块名

ejabberd.yml
在/etc/ejabberd/ 目录下,用于配置ejabberd各种信息,包括:
◦日志(LOGGING)
◦节点(NODE PARAMENTERS)
◦主机名(SERVED HOSTNAMES)
◦监听端口(LISTENING PORTS)
◦S2S全局配置(S2S GLOBAL OPTIONS)
◦认证方式(AUTHENTICATION)
◦数据库(DATABASE SETUP)
◦流量控制(TRAFFIC SHAPERS)
◦访问控制列表(ACCESS CONTROL LISTS)
◦访问控制规则(ACCESS RULES)
◦默认语言(DEFAULT LANGUAGE)
◦验证码(CAPTCHA)
◦模块(MODULES)

ejabberd.erl、 ejabberd_app.erl
在源码目录的src目录下,程序启动相关。

gen_mod.erl、 ext_mod.erl
在源码目录的src目录下,模块加载相关。

mod_*.erl
在源码目录的src目录下,各种模块的源码。

ejabberd_config.erl
在源码目录的src目录下,管理ejabberd 配置文件

ejabberd_c2s.erl、ejabberd_sm.erl、ejabberd_socket.erl、ejabberd_listen.erl、ejabberd_router.erl
在源码目录的src目录下,用户注册、登录、消息收发、消息路由相关
(后面会针对以上5个文件模块进行详细解析)

知识补充(关于.app文件)

{application, Application,
  [{description,  Description},
   {id,           Id},
   {vsn,          Vsn},
   {modules,      Modules},
   {maxP,         MaxP},
   {maxT,         MaxT},
   {registered,   Names},
   {included_applications, Apps},
   {applications, Apps},
   {env,          Env},
   {mod,          Start},
   {start_phases, Phases},
   {runtime_dependencies, RTDeps}]}.

其中必须配置项description,vsn,modules,registered,applications

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值