APISIX源码解析-启动篇【ops.lua - start】
命令开始入口
ops.execute(env, arg)
命令参数校验
目前仅支持:help、version、init、init_etcd、start、stop、quit、restart、reload
local action = {
help = help,
version = version,
init = init,
init_etcd = etcd.init,
start = start,
stop = stop,
quit = quit,
restart = restart,
reload = reload,
}
apisix start
1、判断是否是在root目录下
2、创建日志目录,在apisix_home下创建
local cmd_logs = "mkdir -p " .. env.apisix_home .. "/logs"
util.execute_cmd(cmd_logs)
3、check apisix running
通过/logs/nginx.pid获取是否存在pid,若存在则通过lsof -p pid判断该pid是否正在使用运行
如果pid没有进程在使用,则logs/nginx.pid会被新的pid文件覆盖
4、config路径:命令中-c --config
如果存在自定义config目录,则备份local_conf_path默认路径,然后做ln ,将config路径指向自定义路径
5、程序初始化init()
5.1 读取apisix_home下yaml文件
conf/config.yaml
conf/config-default.yaml
nginx_conf
5.2 检查admin token
5.3 检查admin登录用户
默认admin和viewer
5.4 获取openresty or nginx version
version must >= 1.17.3
5.5 检查http组件与nginx module
5.6 检查control 和 prometheus 配置
5.7 node_listen_port 与 ssl_listen_port设置
node_listen_port 可以多个
5.8 ssl参数设置
5.9 stream_proxy四层代理配置
tcp
udp
dubbo
dns_resolver
5.9 sys_conf生成系统基本配置信息
5.10 core文件大小设置
if util.is_32bit_arch() then
sys_conf["worker_rlimit_core"] = "4G"
else
sys_conf["worker_rlimit_core"] = "16G"
end
5.11 根据nginx_confg和yaml完善sys_conf
5.12 worker_rlimit_nofile设置
设置worker进程最大打开文件数
worker_connections:默认设置10620
local wrn = sys_conf["worker_rlimit_nofile"]
local wc = sys_conf["event"]["worker_connections"]
if not wrn or wrn <= wc then
-- ensure the number of fds is slightly larger than the number of conn
sys_conf["worker_rlimit_nofile"] = wc + 128
end
5.13 export nginx允许的环境变量
5.14 根据sys_conf和ngx_tpl.lua生成最终nginx.conf
local conf_render = template.compile(ngx_tpl)
local ngxconf = conf_render(sys_conf)
local ok, err = util.write_file(env.apisix_home .. "/conf/nginx.conf",
ngxconf)
if not ok then
util.die("failed to update nginx.conf: ", err, "\n")
end
6、初始化etcd init_etcd()
6.1 读取etcd相关配合
6.2 将单一etcd配置,转成集群配置
-- convert old single etcd config to multiple etcd config
if type(yaml_conf.etcd.host) == "string" then
yaml_conf.etcd.host = {yaml_conf.etcd.host}
end
local host_count = #(yaml_conf.etcd.host)
6.3 check etcd的版本
根据配置中的host信息,调用host + "/version"接口,并且每个接口执行3次重试,若失败或版本太旧(< 3.4.0)则直接退出
6.3 check etcd user and password
6.3 往etcd中put数据,测试是否正常
根据配置中的host信息,调用host + "/v3/kv/put"接口,并且每个接口执行3次重试
for name in pairs(constants.HTTP_ETCD_DIRECTORY) do
dirs[name] = true
end
for name in pairs(constants.STREAM_ETCD_DIRECTORY) do
dirs[name] = true
end
for dir_name in pairs(dirs) do
local key = (etcd_conf.prefix or "") .. dir_name .. "/"
local put_url = host .. "/v3/kv/put"
local post_json = '{"value":"' .. base64_encode("init_dir")
.. '", "key":"' .. base64_encode(key) .. '"}'
local response_body = {}