现状
不同的web服务都配套了一个nginx直接向用户提供服务,有一些问题
- 服务运行的环境必须开放外网访问
- 接入层杂乱,不容易定位问题,日志收集
- 每个服务的接入都是单点,不利于扩展
目标
将nginx配置统一起来,单独运维一个接入层服务,方便管理。 该服务是无状态的,做到双节点备份。
架构
基于marathon来做运维,如图:
- marathon-lb 主要负责服务发现,其它小业务的分流,权限过滤等等。在完整的微服务架构中,marathon-lb直接路由到不同的服务web接口上。
- nginx 负责集中化的URL配置处理,跟业务紧密联系的配置在这一层处理。nginx实例可以约束在指定资源类型的主机上运行,并且保持多台实例(对于无状态服务,marathon可以非常容易做伸缩)
- 最后面的service代表现在运行的真实web服务,比如uwsgi, node等等
方法及实施过程
- 收集各个web服务上的配置,放在gm_deploy中,做好docker镜像的构建脚本
- 在marathon上配置nginx实例并启动
- 配置host,使用lb的ip 进行测试
- 修改DNS,同时将业务地址解析到腾讯云lb
- 测试观察一段时间
- 稳定之后关闭service相应主机的外网(使用防火墙处理)
nginx的配置更新及发布流程 TODO
灾难处理
- marathon集群挂掉后如何恢复? TODO
FAQ
- 为什么这样处理? 逐步打造自动化运维工具,无状态服务可以实现快速伸缩