如何托管 Ruby on Rails 应用:完整的服务器设置指南
Ruby on Rails 是一个功能强大的网页应用框架,但与传统 PHP 网站相比,托管 Rails 应用需要不同的服务器设置和理解。本指南将指导您选择合适的 VPS、安装必要的工具、配置网页服务器以及为生产部署准备您的环境。无论您是部署第一个 Rails 应用,还是管理多个服务,了解托管基础知识将帮助您构建一个可靠且高效的基础设施。
目录
Ruby on Rails 与 PHP 网站有什么区别
PHP 网站通常执行磁盘上的脚本文件,网页服务器按需处理每个文件。相比之下,Ruby on Rails 要求应用实例在您的服务器上持续运行。Rails 依赖于持久的应用进程(如 Puma 或 Unicorn),这些进程维持 HTTP 连接,网页服务器(如 Nginx)充当反向代理,将请求转发给这些进程。此外,Rails 应用需要额外的准备步骤,包括资产编译和通过 Gemfile 的依赖管理,使得托管设置比简单的 PHP 安装更复杂。
- PHP 按请求执行脚本;Rails 需要持久的应用进程
- Ruby 和 Rails 必须使用特定语言的工具安装
- 资产(JavaScript、CSS、图像)需要预处理和编译
- Rails 通常使用 PostgreSQL 或 MySQL 数据库
- 依赖管理依赖于 Bundler 和 Gemfile 系统
Rails 应用的最低 VPS 要求
对于小型到中型 Rails 应用,至少拥有 2 个 CPU 核心、2 GB RAM 和 20-30 GB 磁盘空间的 VPS 是一个合理的起点。但是,实际的需求取决于您的应用大小和预期的并发用户数。具有大量处理或庞大用户基数的应用可能需要更多 RAM。如今,SSD 存储是行业标准,提供了比传统 HDD 显著更快的读写性能。此外,请考虑选择保证至少 99% 正常运行时间的提供商,因为应用的可靠性取决于一致的服务器可用性。
- 小型到中型应用的 2-4 个 CPU 核心足够
- 最少 2 GB RAM(资源密集型应用则为 4-8 GB)
- 根据数据量选择 20-50 GB SSD 存储
- 足够的带宽来应对预期的用户流量
- 99% 正常运行时间 SLA 作为基线质量标准
在全新服务器上安装 Ruby、Rails 和 Bundler
首先准备您的 Linux 环境。从系统更新开始(apt update && apt upgrade),然后安装编译 Ruby 所需的依赖项,如 build-essential、libssl-dev、libreadline-dev 和 zlib1g-dev。安装 Ruby 的流行方式是通过 rbenv,它让您在同一服务器上管理多个 Ruby 版本。安装 Ruby 后,添加 Rails gem 和 Bundler,它们为您的 Rails 应用处理依赖管理。如果您需要运行多个 Ruby 版本或升级 Ruby 而不破坏现有应用,使用像 rbenv 这样的版本管理器尤其有用。
- 使用 apt update && apt upgrade 更新系统软件包
- 安装编译 Ruby 所需的构建工具和库
- 使用 rbenv 安装和管理 Ruby 版本
- 安装 Ruby 后安装 Rails gem
- 安装 Bundler 以管理应用依赖
- 考虑为每个项目使用 gemsets 来隔离 gem 环境
选择应用服务器:Puma 与 Unicorn
应用服务器是维持 HTTP 连接并响应用户请求的进程。Puma 是如今最受欢迎的选择,因为它通过线程编制有效地处理并发,允许它在单个进程中管理多个请求。这使得 Puma 在内存受限的环境中更加资源高效。Unicorn 是一个较旧的服务器,为每个请求使用单独的进程;虽然它仍然可用,但 Puma 的优越性能和更低的资源占用使其成为新 Rails 应用的推荐选择。Puma 还支持热重启和内置 SSL 终止等功能,为现代部署场景提供更多灵活性。
- Puma 使用线程在单个进程内处理多个请求
- Unicorn 产生单独的进程,消耗更多内存
- Puma 的内存开销比 Unicorn 更低
- Puma 支持内置 SSL 终止
- Puma 配置更简单且更易维护
- Puma 是现代 Rails 版本中的默认应用服务器
将 Nginx 设置为 Rails 的反向代理
Nginx 是一个轻量级、快速的网页服务器,完美地充当 Rails 应用的反向代理。它位于您的 Puma 服务器前面,接受来自互联网的请求并将它们转发到您的应用进程。要配置 Nginx,您需要创建一个配置文件,指定您的 Puma 服务器的位置(通常是 localhost:3000 或 localhost:8080)。Nginx 还处理静态文件的缓存、压缩响应以减少带宽使用并规范化 URL。Nginx 和 Puma 之间的这种分离允许您重新启动应用而不会关闭网页服务器,使您的基础设施更加灵活和安全。
- 配置指向 Puma 的 Nginx upstream 块
- 为您的应用域定义服务器块
- 启用 gzip 压缩以减少响应大小
- 设置代理头以将客户端信息转发给 Puma
- 禁用默认服务器块以确保安全
- 使用 try_files 高效地提供预编译资产
Rails 数据库设置:PostgreSQL 与 MySQL
数据库是存储应用数据的中心。Rails 与 PostgreSQL 和 MySQL 都能无缝协作。PostgreSQL 提供高级功能,如原生 JSON 支持、全文搜索和数组数据类型,使其非常适合需要复杂查询和数据处理的应用。MySQL,特别是其开源分支 MariaDB,轻巧快速,适合不需要高级功能的较小应用。现代 Rails 应用通常默认使用 PostgreSQL,因为它具有丰富的功能集和优秀的 Rails 集成。无论您选择哪一个,都要安装适当的 Ruby 数据库 gem(PostgreSQL 用 pg,MySQL 用 mysql2),配置您的 database.yml 文件,并在服务器上设置安全的数据库凭据。
- PostgreSQL 在高级功能和复杂查询方面表现出色
- MySQL/MariaDB 轻巧,适合较小的应用
- 安装适当的 Ruby 数据库适配器 gem
- 使用正确的连接详细信息配置 Rails database.yml
- 为数据库账户使用强且唯一的密码
- 考虑为您的数据库进行自动备份
- 为高流量应用设置读副本
资产管道:预编译和生产提供
资产管道是一个 Rails 功能,可以编译和缩小 JavaScript、CSS 和图像以供生产部署。虽然开发环境通常会提供未压缩的资产,但生产环境需要运行 rake assets:precompile 来生成经过缩小和指纹识别的文件,这些文件经过优化以供缓存。这些编译的资产存储在 public/assets 中,应该由 Nginx 直接提供以获得最大性能,绕过 Rails 应用服务器。指纹识别确保当您更新资产时,客户端获取新版本而不是提供缓存的过时文件。这种方法大大减少了带宽使用并改善了页面加载时间。
- 在部署期间运行 rake assets:precompile 以生成缩小的资产
- 指纹识别确保为更新的文件清除缓存
- 直接从 Nginx 提供 public/assets 以获得性能
- 设置 Cache-Control 头以进行长期缓存
- 考虑为全球资产分发使用 CDN
- 删除旧的预编译资产以节省磁盘空间
后台任务:Sidekiq 和托管考虑
后台任务对于需要处理长时间运行任务的应用至关重要,如发送电子邮件、生成报告或处理图像。Sidekiq 是一个流行的 Rails 作业处理库,使用 Redis 来排队和管理任务。Sidekiq 让您不是让用户等待这些操作完成,而是在 Redis 中排队任务并让单独的工作进程在后台处理它。要托管使用 Sidekiq 的 Rails 应用,您必须安装并运行 Redis,并将 Sidekiq 工作程序配置为单独的系统进程,通常由 systemd 或 supervisor 管理。适当地监控 Sidekiq 确保任务成功完成,并且您的后台进程不会消耗过多资源。
- 安装 Redis 以支持 Sidekiq 的任务队列
- 配置 Sidekiq 工作进程以作为服务运行
- 使用 systemd 或 supervisor 来管理工作进程
- 设置适当的并发和内存限制
- 监控 Sidekiq 仪表板以查看任务成功和失败率
- 为失败的任务实现死信队列处理
部署方式:Capistrano、Docker 和 CI/CD
部署是将您的代码从开发环境移动到生产服务器的过程。Capistrano 是一个传统的部署工具,可以编制发布流程,自动化从拉取最新代码、安装 gems、运行迁移和重新启动应用服务器等任务。Docker 提供了一种替代方案:部署应用的容器化版本,所有依赖和运行时版本都捆绑在一起,确保环境之间的一致性。现代团队还使用 CI/CD 管道(如 GitHub Actions 或 GitLab CI)来自动化测试和部署,每当代码被推送到您的存储库时。选择部署策略取决于您的应用复杂性、团队规模和基础设施偏好。每种方法在简单性、灵活性和操作开销之间都有权衡。
- Capistrano 通过 SSH 自动化远程执行以实现无缝部署
- Docker 容器确保跨环境部署的一致性
- CI/CD 管道在代码推送时自动测试和部署
- 使用零停机部署技术来维持可用性
- 为失败的部署实现自动回滚机制
- 监控部署指标以检测和响应问题
常见问题
Ruby on Rails 应用可以在共享主机上运行吗?
通常不能。Rails 应用需要应用进程始终持续运行,这是共享主机平台(通常为 PHP 设计)无法提供的。Rails 需要 VPS 或专用服务器,您可以在其中完全控制安装 Ruby、Bundler 和必要的工具。一些托管提供商提供专门的 Rails 托管,但这些成本比基本共享主机更高。
典型的中型 Rails 应用需要多少 RAM?
内存使用取决于您的应用大小和复杂性。每个 Puma 进程通常消耗 100-300 MB 的 RAM。如果您运行 4 个 Puma 工作程序,仅应用就预期约 400-1,200 MB。加上 Nginx、Redis、您的数据库和操作系统的开销,您可以看到为什么建议生产 Rails 应用至少 4 GB RAM 或更多。较大的应用可能需要 8 GB 或更多。
Puma 和 Unicorn 之间的区别是什么?
关键区别在于 Puma 使用线程(单个进程内的多个线程),而 Unicorn 使用多个单独的进程(每个单线程)。这使得 Puma 更加内存高效。Puma 也更现代、得到积极维护,并与当前 Rails 版本良好集成。除非您有特定的原因使用 Unicorn,否则 Puma 是新 Rails 应用的更好选择。
如何安全地将更新部署到实时 Rails 应用?
最安全的方法是使用零停机部署技术,如 Capistrano 支持的滚动部署。适当的部署流程应该首先运行数据库迁移,优雅地关闭现有连接,然后启动新的应用进程。通过 CI/CD 管道的自动测试可以在问题到达生产环境之前捕获问题。保留数据库备份并制定回滚计划也是明智的。
哪个操作系统最适合托管 Rails 应用?
Linux,特别是 Ubuntu、Debian 或 CentOS 等发行版,是托管 Ruby on Rails 的标准选择。Linux 具有成本效益、稳定、文档齐全,并拥有庞大的 Rails 开发者社区提供支持和知识分享。macOS 适合本地开发,但不建议用于生产服务器。由于工具和社区支持有限,Windows 不适合 Rails 托管。