您的位置:首页 > 其它

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

2017-01-06 10:56 375 查看
启动流程

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应用是否正常启动
e
4000
jabberd: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: