部署架构:零停机生产系统

本文介绍我们如何通过自动重启和零停机部署和运行网站。

问题:手动部署风险高

传统部署需要:

  • 手动服务器重启:导致停机

  • 服务监控:需有人监控崩溃情况

  • 代码更新:需要SSH访问和手动操作

  • 回滚:出现问题需手动回滚

这种方式无法扩展,并在更新期间导致停机。

解决方案:使用Systemd实现自动化部署

我们使用systemd管理应用程序(参见基础设施概览):

  • 自动重启:在崩溃或代码变更时自动重启

  • 零停机:优雅的工作进程重启

  • 日志记录:集中式日志管理

  • 进程管理:处理工作进程生命周期

服务器基础设施

生产服务器

生产服务器托管面向公众的网站:

  • 用途:提供产品目录和电子商务的公共网站

  • 模块:仅"web"模块

  • 环境:生产环境(Gunicorn + systemd)

  • 访问:公开访问(无需登录)

应用服务器

Gunicorn

Gunicorn是生产环境Web服务器:

  • 多工作进程:多个工作进程

Systemd集成

Systemd管理Gunicorn:

  • 自动启动:服务器启动时自动运行

  • 自动重启:崩溃或代码变更时自动重启

  • 日志记录:Systemd日志集成

  • 进程管理:工作进程生命周期管理

配置

环境配置

配置按环境区分:

  • 配置文件:环境特定设置

  • JSON格式:键值对格式

  • 环境变量:存储密钥和API密钥

  • 模块启用:控制加载哪些功能

静态资源

静态资源通过S3和CloudFront CDN提供服务:

  • S3存储桶:静态文件的对象存储

  • CloudFront:全球资源分发的CDN

  • 缓存策略:静态内容长TTL缓存

  • 版本控制:通过版本号实现缓存清除

部署流程

代码部署

通过Git部署代码,systemd管理应用程序服务:

  1. 提交和推送:变更推送到Git仓库
  2. 服务器拉取:代码拉取到生产服务器
  3. Systemd重启:服务在代码变更后自动重启

配置部署

配置与代码分开管理:

  1. 配置文件:Git中的JSON配置文件
  2. 环境变量:从环境加载的密钥
  3. 模块启用:控制加载哪些功能

监控

健康检查

健康端点监控服务器状态:

  • 健康端点:基础健康检查

  • 数据库检查:数据库连接性

  • 缓存检查:缓存连接性

日志记录

日志存储在多个位置:

  • Gunicorn错误日志:应用程序错误

  • Gunicorn访问日志:HTTP请求

  • 服务日志:Systemd日志

总结

部署架构提供:

  • Gunicorn:生产环境WSGI服务器

  • Systemd:自动重启和进程管理

  • Git部署:代码和配置管理

  • S3 + CloudFront:静态资源分发

  • 健康监控:健康检查端点

  • 日志记录:错误和访问日志