Ejabberd启动梳理及相关文件介绍
2017-01-06 10:56
375 查看
启动流程
ejabberd工程启动application:start(ejabberd).
ejabberd.erl
查找ejabberd.app文件,并按该文件指示,启动ejabberd应用
ejabberd.app.src
查看ejabberd/src/ejabberd.app.src文件
mod 定义了应用程序的回调模块和启动参数,由此可知应用程序启动时会由主导进程来调用这个模块的start/2方法
ejabberd_app.erl
附:
1.ejabberd_command命令格式
定义一个status命令,接受参数[],返回{res,restuple}
2.监控进程
该语句负责启动子进程监控进程,详细查看start_link启动后调用的init函数
{{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文件)
其中必须配置项description,vsn,modules,registered,applications
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
相关文章推荐
- opensslBIO系列之2---BIO结构和BIO相关文件介绍
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍 推荐
- wince中的BSP工程的相关文件介绍
- c#文件读写相关类介绍
- 用C#实现基于查寻字符串的文件行查询器(2)-相关技术介绍
- XML文件编辑器(XML Editor)介绍 及 相关开源资料
- [转]Delphi相关文件扩展名介绍
- Delphi相关文件扩展名介绍
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- Linux 查看磁盘分区、文件系统、磁盘的使用情况相关的命令和工具介绍
- 文件系统管理 之 Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- Delphi相关文件扩展名介绍
- Security证书相关文件格式汇总及其格式转换工具介绍
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- BCB/Delphi相关文件扩展名介绍
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍