我是靠谱客的博主 魁梧御姐,最近开发中收集的这篇文章主要介绍Python 高级编程(第2版)--第6章 部署代码部署代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

部署代码

使特定版本的应用或服务对最终用户可用的过程叫作部署(deployment)。

十二要素应用

十二要素应用(Twelve-Factor App,https://12factor.net)是构建“软件即服务”应用的一种通用的与语言无关的方法论。其目的之一就是让应用部署更加简单,但它同时也强调其他主题,例如可维护性和让应用更容易扩展。十二要素应用包含 12 条规则:

  • 代码库(codebase):版本控制追踪一份代码库,多份部署。
  • 依赖(dependencies):显示声明和隔离依赖关系。
  • 配置(config):在环境中存储配置。
  • 后端服务(backing services):将后端服务作为附加资源。
  • 构建、发布、运行(build、release、run):严格分离构建和运行阶段。
  • 进程(processes):以一个或多个无状态进程运行应用。
  • 端口绑定(port binding):通过端口绑定提供服务。
  • 并发(concurrency):通过进程模型进行扩展。
  • 易处理(disposability):快速启动和优雅终止可最大化鲁棒性。
  • 开发环境与生产环境等价(dev/prod parity):尽可能的保持开发、预发布和生产环境相同。
  • 日志(logs):把日志当作事件流。
  • 管理进程(admin processes):将后台管理任务当作一次性进程运行。

用 Fabric 进行自动化部署

各种工具可以将各种事情自动化。

  • 远程执行工具(例如 Fabric),用来按需求自动执行多台远程主机上的代码。
  • 配置管理工具(例如 Chef、Puppet、CFEngine、Salt 和 Ansible),用来对远程主机(执行环境)进行自动化配置。它们可用于设置后端服务(数据库、缓存等)、系统权限、用户等等。大多数这种工具还可以当作像 Fabric 一样的远程执行工具,但根据架构不同,其难易程度也不同。

由于一些工具的设计,它可能并不是最适合实际的自动化代码部署。一个这样的例子是 Puppet,它阻止显式地运行任何 shell 命令。这就是许多人选择使用两种解决方案来互相补充的原因:配置管理工具用于设置系统级的环境,按需的远程执行工具用于应用部署。

迄今为止,Fabric(http://www.fabfile.org)是 Python 开发者用于自动化远程执行的最常用的解决方案。它是一个 Python 库,也是一个命令行工具,用来提高使用 SSH 进行应用部署或系统管理的效率。

你自己的包索引或索引镜像

代码供应(code vendoring)是将外部包的源代码包含在其他项目的源代码(仓库)中的一种做法。

PyPI 镜像

如果允许安装工具从 PyPI 的一个镜像下载包,那么就可以缓解 PyPI 故障带来的问题。官方的 Python 包索引已经通过内容分发网络(Content Delivery Network, CDN)提供服务,它是自带镜像的。最好的解决方案是使用你自己的 PyPI 镜像,PyPA 维护并推荐的镜像工具是 bandersnatch,允许你制作 Python 包索引全部内容的镜像。镜像不接受上传,并且没有 PyPI 的 web 部分。更好的方法是使用 devpi。它是与 PyPI 兼容的包索引实现,可以提供:

  • 上传非公开包的私有索引;
  • 索引镜像。

devpi 的主要优点在于:可以对其他索引制作一般完整的镜像,维护客户端已经请求的包组成的镜像,而不是对整个仓库进行代价高昂的备份。

使用包进行部署

在构建一个发行版或安装一个包的过程中,最值得注意的部署步骤如下:

  • 安装 Python 依赖,并将静态资产(CSS 文件和 JavaScript)移动到所需位置,这两个步骤都可以作为 setup.py 脚本 install 命令的一部分来处理。
  • 预处理代码(预处理 JavaScript 超集、资产的压缩/混淆/合并、运行 SASS 或 LESS)与诸如将文本编译本地化(例如 Django 中的compilemessages)之类的操作,都可以作为 setup.py 脚本 sdist/bdist 命令的一部分。

使用 setuptools 将代码作为 Python 包分发会大大简化你的部署。

常见约定与实践

文件系统层次结构

文件系统层次结构标准(FilesystemHierarchy Standard, FHS),它定义了 Unix 和类似 Unix 的操作系统中的目录结构和目录内容,但很难找到一个真正的 OS 发行版与 FHS 完全兼容。建议:

  • 明智地选择,避免出现意外。
  • 在项目所有可用的基础设施中保持一致。
  • 尽量在组织内部(你所在的公司)保持一致。

隔离

应该始终隔离每个应用版本的项目依赖。在实践中,无论何时部署应用的新版本,你都应该为这个版本创建一个新的隔离环境(使用 virtualenv 或 venv)。

为每个版本创建新的环境有助于管理其干净的状态,且有助于符合提供的依赖关系列表。新环境的意思是在文件系统中创建一个新的目录树,而不是更新已经存在的文件。

使用进程管理工具

需要某种进程管理工具,它可以启动并管理应用进程。需要确保它具有以下功能:

  • 如果服务退出的话则重启服务。
  • 可靠地跟踪其状态。
  • 捕获其 stdout/stder 流用于日志。
  • 运行具有特定用户/组权限的进程。
  • 配置系统环境变量。

在 Python 社区中,管理应用进程的两个常用工具是 Supervisor(http://supervisord.org)和 Circus(https://circus.readthedocs.org/en/latest )。它们在配置和使用方面非常相似。Circus 比 Supervisor 要年轻一些,因为创建它就是为了解决后者的一些缺点。它们都可以用简单的类似 INI 文件的配置格式进行配置。它们不仅可以运行 Python 进程,还可以被配置来管理任何应用。

应该在用户空间运行应用代码

应用代码应该始终在用户空间中运行,不可以在超级用户权限下运行。实际的建议是为每个应用守护进程创建一个单独的用户。,么做的原因是为了系统安全,它可以限制恶意用户控制应用进程之后能够造成的损害。

使用HTTP 反向代理

许多符合 WSGI 的 Python web 服务器自身就可以轻松处理 HTTP 流量,无需在其上面添加任何其他的 Web 服务器。

优雅地重新加载进程

应该通过快速的启动时间和优雅终止将鲁棒性最大化。Web服务进程应该能够在接收到Unix的SIGTERM信号(例如 kill -TERM <process-id>)时优雅地退出。各种符合 WSGI 的 Python web 服务器实现都允许在没有任何停机的情况下优雅地重新加载服务。其中最流行的是 Gunicorn 和 uWSGI。

代码检测与监控

编写完一个应用并将其部署到目标执行环境之后,为了确保我们的产品按预期工作,我们需要正确地处理应用日志,并监控必要的应用指标。包括:

  • 监控 Web 应用访问日志中的各种 HTTP 状态码。
  • 进程日志集合,其中可能包含有关运行错误和各种警告的信息。
  • 在运行应用的远程主机上监控系统资源(CPU 负载、内存和网络流量)。
  • 监控作为业务绩效指标(客户获取、收入等)的应用级性能和指标。

记录错误——sentry/raven

真正需要的是尽可能多的关于错误发生的上下文信息。在生产环境中保存错误的完整历史记录也是非常有用的,你可以很方便地浏览和搜索。提供这种功能的最常用工具之一是 Sentry(https://getsentry.com)。提供与 Sentry 集成的库是 raven。访问了 Sentry 服务器并创建一个新的项目,你将会得到一个叫作 DSN 的字符串,DSN 表示数据源名称(Data Source Name)。这个 DSN 字符串是将你的应用与 sentry 集成所需要的最少配置设置。它包含协议、证书、服务器位置和你的组织/项目标识符。

监控系统与应用指标

监控性能,Munin(http://munin-monitoring.org)是许多组织最常用的工具之一。它的安装包括两个主要组件。

  • Munin 主机,从其他节点收集指标并提供指标图形。
  • 在被监视主机上安装的 Munin 节点,用于收集本地指标并将其发送到 Munin 主机。

另一种常用的解决方案可以使收集自定义指标变得特别简单,它就是 StatsD(https://github.com/etsy/statsd )。由于基于 UDP 的简单协议,它的集成非常简单。使用名为 statsd 的 Python 包也可以很容易地向 StatsD 守护进程发送指标。StatsD 只是指标收集守护进程,所以它不提供任何报告功能。需要能够处理来自 StatsD 的数据的其他进程,以便查看实际的指标图形。最常见的选择是 Graphite(http://graphite.readthedocs.org)。它主要完成以下两件事情。

  • 保存数值型的时间序列数据。
  • 根据需要呈现这个数据的图形。

处理应用日志

日志不仅是关于错误的,它甚至可以作为产品实现的核心。

  • 基本的低级日志实践。

    十二要素应用方法中说到,应该把日志当作事件流。因此日志文件不是日志本身,而只是一种输出格式。日志是流,意味着它表示按时间排序的事件。

    根据十二要素应用方法论,应用不应该知道日志的存储格式。不应该由应用代码来维护对文件的写入或日志的转储(rotation)和保留。这些是应用运行环境的责任。处理日志的最佳约定可以总结为几条规则:

    • 应用应该总是将未缓冲的日志写入标准输出(stdout)。
    • 执行环境应该负责收集日志并将其发送给最终目标。

    上面提到的执行环境,其主要部分通常是某种进程管理工具。常见的 Python 解决方案(例如 Supervisor 或 Circus)是第一批负责处理日志收集和发送的。

  • 日志处理工具。

    许多开发人员最常见的选择之一是 Logstash。它是日志收集守护进程,可以观察活跃的日志文件、解析日志条目并以结构化形式将其发送到后端服务。

    后端服务 Elasticsearch 是在基于 Lucene 构建的搜索引擎。除了文本搜索能力,它还有一个独特的数据聚合框架,非常适合日志分析的目的。

    还有一个是 Kibana。它对于 Elasticsearch 来说是一个非常通用的监控、分析和可视化平台。

    另一个弥补 Logstash 某些缺点的解决方案是 Fluentd。它是一个备用的日志收集守护程序,可与上述日志监控堆栈中的 Logstash 交换使用。

最后

以上就是魁梧御姐为你收集整理的Python 高级编程(第2版)--第6章 部署代码部署代码的全部内容,希望文章能够帮你解决Python 高级编程(第2版)--第6章 部署代码部署代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部