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() thensys_conf["worker_rlimit_core"] = "4G"elsesys_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 connsys_conf["worker_rlimit_nofile"] = wc + 128end
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 thenutil.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 configif type(yaml_conf.etcd.host) == "string" thenyaml_conf.etcd.host = {yaml_conf.etcd.host}endlocal 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) dodirs[name] = trueendfor name in pairs(constants.STREAM_ETCD_DIRECTORY) dodirs[name] = trueendfor dir_name in pairs(dirs) dolocal 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 = {}

APISIX源码解析-启动篇【ops.lua - start】相关推荐

  1. 渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(上)

    关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/08/11/es-code02/ 前提 上篇文章写了 ElasticSearch 源码解析 -- ...

  2. Go源码解析——Channel篇

    channel.map.slice作为golang的核心三剑客,对于使用golang作为主语言完成开发工作的程序猿来说是非常重要的.了解其设计和源码是使用的基础,因此笔者本专题会对这三种数据结构的源码 ...

  3. Flink1.15源码解析--启动TaskManager

    文章目录 一.前言 二.TaskManagerRunner 2.1.创建 TaskManagerRunner 2.1.1.创建 TaskExecutorService, 用于创建 TaskExecut ...

  4. Android 8.1 源码_启动篇(一) -- 深入研究 init(转 Android 9.0 分析)

    前言 init进程,它是一个由内核启动的用户级进程,当Linux内核启动之后,运行的第一个进程是init,这个进程是一个守护进程,确切的说,它是Linux系统中用户控件的第一个进程,所以它的进程号是1 ...

  5. iOS即时通讯进阶 - CocoaAsyncSocket源码解析(Connect篇)

    原文 前言: CocoaAsyncSocket是谷歌的开发者,基于BSD-Socket写的一个IM框架,它给Mac和iOS提供了易于使用的.强大的异步套接字库,向上封装出简单易用OC接口.省去了我们面 ...

  6. iOS即时通讯进阶 - CoacoaAsyncSocket源码解析(Connect篇)

    前言: 本文来自简书,原文地址:http://www.jianshu.com/p/0a11b2d0f4ae CoacoaAsyncSocket是谷歌的开发者,基于BSD-Socket写的一个IM框架, ...

  7. eltree ref什么时候有_Vue3响应式系统源码解析-Ref篇

    文章转载自:https://zhuanlan.zhihu.com/p/85978064 我们阅读源码的原因是什么?无非是1:学习:2:更好的使用这个库.如果只是想大致的了解下原理,倒不必花时间阅读源码 ...

  8. 和菜鸟一起学linux内核源码之启动篇

    又是一个周末,日子过得比较散,虽然期间也有不断地看书学习,总觉得有点小盲目.想想毕业也快要1年了,从事嵌入式linux的研发工作也1年多了.这1年多的从实习到正式工作到现在的自己,进步有,也很大,但是 ...

  9. VUE源码解析-1- 初始篇:vue定义路径查找

    从这里开始,记录VUE源码分析. 1. 将 vue 源码拉到本地,方便分析 vue 源码地址来自 全球最大同性交流网站-- gitHub:https://github.com/vuejs/vue 我们 ...

最新文章

  1. matlab编写的程序输入参数怎么写,用matlab编写一个用EM算法估计参数的程序
  2. Android系统源码学习——ramdisk.img、system.img、userdata.img三个文件介绍
  3. 机器学习系列 1:监督学习和无监督学习
  4. Laravel的初始化安装
  5. (5)verilog语言编写呼吸灯
  6. java的setbounds_java Swing组件setBounds()简单用法实例分析
  7. jpcap的配置方法
  8. 做创业公司长期价值的共建者,高榕资本完成5亿美元新基金募资
  9. 八种点云聚类方法(一)— DBSCAN
  10. 奥维地图显示no data(-5)解决
  11. 嵌入式系统开发15——基于SPI协议的OLED屏显简单应用
  12. Python自动生成新闻报告
  13. HTML5期末大作业:仿唯品会购物网站设计——仿唯品会购物商城(5页) HTML+CSS+JavaScript 学生DW网页设计作业成品 商城网站设计
  14. 解决nginx emerg bind to 80 failed 98 Address alrea
  15. 虚幻引擎图文笔记:蓝图中二项切换节点(Flip Flop)的用法
  16. latch: cache buffers chains故障处理总结
  17. mysql 最长的字段_sql 查询某个字段最长的记录
  18. JS的变量,使用strict模式
  19. 网络技术/技术支持岗位在网络安全大厂/互联网公司笔试面试常考题-计算机网络知识点总结
  20. HashMap源代码详解

热门文章

  1. 快手力推NBA相关内容,创作者将获得流量或现金奖励
  2. 程序员的一天日常(你们也这样的么?)
  3. 【MACOS】macbook pro使用感受
  4. 设计师更高效_要成为更好的设计师,我们需要更多的时间进行游戏
  5. Chapter 05:扭曲透视图和鸟瞰图
  6. api查询所有记录 zabbix_利用zabbix—API查询zabbix监控项历史数据、均值、峰值详细讲解...
  7. Latex subsection出现文字重叠
  8. maya骨骼显示_3DMax高级建模人物骨骼蒙皮!零基础快速入门!不要错过
  9. 微信小程序 视频列表 封面图 禁止多个视频同时播放
  10. 上海部分小区地下车位价格翻倍升至70万-车位-价格