PHP 服务器部署与自动化运维
PHP 应用程序可以通过多种方式部署并运行在生产环境的 Web 服务器上。
1. 平台即服务 (Platform as a Service, PaaS)
PaaS 提供了在 Web 上运行 PHP 应用程序所需的系统和网络架构。这意味着你几乎不需要任何配置,就能直接发布 PHP 应用程序或 PHP 框架。
近年来,PaaS 已经成为部署、托管和扩展各种规模 PHP 应用的流行方式。你可以在我们的资源板块找到一份 PHP PaaS 供应商列表。
2. 虚拟或独立服务器 (Virtual or Dedicated Servers)
如果你对系统管理(运维)比较熟悉,或者有兴趣学习它,虚拟服务器(VPS)或独立物理服务器能让你对应用程序的生产环境拥有绝对的控制权。
2.1 Nginx 与 PHP-FPM
PHP 通过其内置的 FastCGI 进程管理器 (FPM),与 Nginx 配合得天衣无缝。Nginx 是一款轻量级、高性能的 Web 服务器。相比 Apache,它占用的内存更少,并且能更好地处理大量并发请求。这对于内存有限的虚拟服务器来说尤为重要。
延伸阅读:
2.2 Apache 与 PHP
PHP 和 Apache 有着悠久的合作历史。Apache 的可配置性极强,并拥有大量可用的模块来扩展功能。它是共享主机最流行的选择,也非常容易为 WordPress 等开源应用或 PHP 框架搭建环境。
然而遗憾的是,Apache 默认占用的系统资源比 Nginx 更多,并且在同一时间内无法处理同等数量的并发访客。
Apache 运行 PHP 有几种不同的配置方式:
- 最常见且最简单: 使用
prefork MPM结合mod_php。虽然这种方式的内存效率最低,但它最容易配置和使用。如果你不想深入研究服务器运维,这可能是最好的选择。(注意:如果你使用mod_php,你必须使用prefork MPM。) - 更高性能与稳定性: 如果你想从 Apache 榨取更高的性能,你可以利用与 Nginx 相同的 FPM 系统。运行
worker MPM或event MPM,并结合mod_fastcgi或mod_fcgid。这种配置的内存效率会大幅提升,速度也快得多,但设置起来比较繁琐。 - 现代 Apache 推荐方案: 如果你运行的是 Apache 2.4 或更高版本,你可以使用 mod_proxy_fcgi 来获得极佳的性能,同时设置也非常简单。
延伸阅读:
- 阅读更多关于 Apache
- 阅读更多关于多处理模块 (Multi-Processing Modules, MPM)
- 阅读更多关于 mod_fastcgi
- 阅读更多关于 mod_fcgid
- 阅读更多关于 mod_proxy_fcgi
- 阅读更多关于使用 mod_proxy_fcgi 设置 Apache 和 PHP-FPM
2.3 共享服务器 (Shared Servers)
PHP 能够如此流行,很大程度上要归功于共享服务器(虚拟主机)。你很难找到一个没有预装 PHP 的主机商,但请务必确认他们提供的是最新版本的 PHP。
共享服务器允许你和其他众多开发者将网站部署在同一台物理机器上。
- 优点: 价格极其低廉。
- 缺点: 你永远不知道你的“邻居”会搞出什么乱子;他们可能会耗尽服务器资源,或者暴露安全漏洞连累整台机器。
强烈建议: 如果你的项目预算允许,请尽量避开共享服务器。如果必须使用,请确保他们提供的是最新版本的 PHP。
3. 构建与部署应用程序 (Building and Deploying your Application)
如果你发现自己还在手动修改数据库结构,或者在(手动)更新文件之前还在手动跑测试,请三思!
部署新版本应用所需的每一个额外的手动步骤,都会增加发生致命错误的概率。无论你处理的是一次简单的更新、一个复杂的构建过程,还是实施持续集成策略,构建自动化 (Build Automation) 都是你最好的朋友。
你可能需要自动化的任务包括:
- 依赖管理 (Dependency management)
- 静态资源(CSS/JS)的编译和压缩 (Compilation, minification of your assets)
- 运行自动化测试 (Running tests)
- 生成文档 (Creation of documentation)
- 打包 (Packaging)
- 部署到服务器 (Deployment)
3.1 部署工具 (Deployment Tools)
部署工具可以被描述为“处理软件部署常见任务的脚本集合”。部署工具本身并不属于你软件代码的一部分,它是从“外部”对你的软件进行操作的。
市面上有许多开源工具可以帮你实现构建自动化和部署。有些是 PHP 写的,有些不是。但这不应成为你使用它们的障碍,只要它们最适合这项工作即可。以下是一些常见的例子:
- Phing:可以通过 XML 构建文件来控制你的打包、部署或测试流程。Phing(基于 Apache Ant)提供了安装或更新 Web 应用通常需要的一系列丰富任务,并且可以通过 PHP 编写自定义任务进行扩展。它是一个经过时间考验的坚固工具,但由于它使用 XML 文件进行配置,可能会让人觉得有些过时。
- Capistrano:这是一个为中高级程序员设计的系统,用于在一台或多台远程机器上以结构化、可重复的方式执行命令。它预配置为部署 Ruby on Rails 应用,但你完全可以成功地用它来部署 PHP 系统。要用好 Capistrano,你需要具备一定的 Ruby 和 Rake 知识。
- Ansistrano:包含一系列 Ansible 角色 (roles),旨在轻松管理脚本类应用程序(如 PHP、Python 和 Ruby)的部署流程(部署和回滚)。它是 Capistrano 的 Ansible 移植版,目前已被许多 PHP 公司广泛使用。
- Deployer:这是一个用 PHP 编写的部署工具,既简单又实用。它的功能包括并行运行任务、原子部署 (atomic deployment) 以及保持多台服务器之间的一致性。官方提供了针对 Symfony、Laravel、Zend Framework 和 Yii 等常见框架的现成“配方 (Recipes)”。Younes Rafie 撰写的文章《使用 Deployer 轻松部署 PHP 应用》是一篇非常棒的教程。
- Magallanes:这是另一个用 PHP 编写的工具,其简单的配置通过 YAML 文件完成。它支持多服务器和多环境、原子部署,并内置了一些任务,你可以利用这些任务来处理常用工具和框架的部署。
延伸阅读:
- 使用 Apache Ant 自动化你的项目
- 部署 PHP 应用 (Deploying PHP Applications) - 一本关于 PHP 部署最佳实践和工具的付费书籍。
4. 服务器配置管理 (Server Provisioning)
当你面对多台服务器时,管理和配置它们可能是一项令人望而生畏的任务。市面上有专门应对此类问题的工具,它们能帮你实现基础设施的自动化,确保你拥有正确的服务器环境并配置妥当。
这些工具通常与大型云托管提供商(如 Amazon Web Services, Heroku, DigitalOcean 等)集成,用于管理实例,这使得扩展应用程序变得容易得多。
- Ansible:一款通过 YAML 文件管理基础设施的工具。它非常容易上手,并且能够管理复杂的大规模应用。它提供了一个 API 用于管理云实例,并可以通过某些工具使用动态清单来管理它们。
- Puppet:一款拥有自己专属语言和文件类型来管理服务器配置的工具。它可以用于“主/从 (master/client)”模式,也可以用于“无主 (master-less)”模式。在主/从模式下,客户端会按设定的时间间隔向中央主服务器轮询新配置,并在需要时进行自我更新。在无主模式下,你可以主动将更改推送到节点。
- Chef:一个基于 Ruby 的强大系统集成框架,你可以用它来构建整个服务器环境或虚拟机。它通过 OpsWorks 服务与 Amazon Web Services 实现了极佳的集成。
延伸阅读:
- Ansible 教程
- Ansible for DevOps - 一本关于 Ansible 方方面面的付费书籍
- Ansible for AWS - 一本关于 Ansible 与 AWS 集成的付费书籍
- 三篇系列博客:使用 Chef, Vagrant 和 EC2 部署 LAMP 应用
- Chef Cookbook:安装并配置 PHP 和 PEAR 包管理系统
- Chef 视频教程系列
5. 持续集成 (Continuous Integration, CI)
“持续集成是一种软件开发实践,团队成员频繁地整合他们的工作成果,通常每人每天至少集成一次——这会导致每天发生多次集成。许多团队发现,这种方法显著减少了集成时产生的问题,并允许团队更快速地开发出内聚的软件。”
—— Martin Fowler
为 PHP 实施持续集成有多种方式。Travis CI 功不可没,它让即使是很小的项目也能轻松实现持续集成。Travis CI 是一个托管式的持续集成服务。它可以与 GitHub 深度集成,并支持包括 PHP 在内的多种语言。
此外,GitHub 也通过 GitHub Actions 提供了极其强大的持续集成工作流。
延伸阅读: