APISIX源码解析-启动篇【ops.lua - start】

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 = {}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值