Ruby On Rails 部署指南

开发是一回事,部署又是另一回事,往往部署要处理的东西比开发还要多,所以一套顺手的工具非常重要。现在虽然目前还做不到自动部署,但是一系列自动化工具也极大简化了繁琐的部署流程。这篇文章主要介绍如何使用 Mina+Puma+Nginx 部署一个 Ruby On Rails 的 Web 应用。


更新记录

  • 2016.07.06: 初稿

Mina

Mina 是一个非常快的部署器,也是一个服务端自动化工具。至于为什么效率这么高,因为直接生成的是 bash 脚本,然后在远端服务器执行。和 Vlad 与 Capistrano 不同的是,Mina 不会每条指令都开一个新的 SSH 连接,而是每次部署只创建一个 SSH 连接,尽可能减少了 SSH 连接的开销。

安装非常简单 gem install mina 即可。其实使用也很简单,这里简单介绍一下:

首先,在项目中用命令 mina init 进行初始化,然后我们会得到 config/deploy.rb 文件。这是一个自带 task 的 Rake 文件,具体怎么写 task 可以参考这里,一个简单的配置可以像这样:

set :user, 'wdxtub'
set :domain, 'wdxtub.com'
set :deploy_to, '/var/www/wdxtub.com'

然后,执行 mina setup,这里会根据 deploy_to 中的路径来配置好目录结构,有一点需要注意,该路径需要是可读可写的。大概的目录结构为

/var/www/wdxtub.com/ # The deploy_to path
|- releases/ # Holds releases, one subdir per release
| |- 1/
| |- 2/
| |- 3/
| '- ...
|- shared/ # Holds files shared between releases
| |- logs/ # Log files are usually stored here
| `- ...
'- current/ # A symlink to the current release in releases/

最后就可以部署了,命令为 mina deploy

根据不同开发环境不同,有一些插件还是值得使用的,这里给出一个简单的列表:

  • mina/multistage
  • mina/bundler
  • mina/rails
  • mina/puma
  • mina/git
  • mina/rvm
  • mina_sidekiq/tasks

Puma

Puma 是一个运行 Ruby/Rack 应用的简单快速多线程高并发的 HTTP 服务器程序,为了达到最好的性能,推荐使用实现了真线程的 Rubinius 或 JRuby。

使用起来也非常简单,先在 Gemfile 中添加 gem puma,然后手动在 config 文件夹下创建一个 puma.rb(或者 puma.rb.erb 也行),然后可以指定一些常见的参数,比如

workers Integer(ENV["WEB_CONCURRENCY"] || 20)
threads_count = Integer(ENV["MAX_THREADS"] || 20)
threads threads_count, threads_count
bind "unix://<%= settings.puma_socket %>"
daemonize
pidfile "<%= settings.puma_pid %>"
state_path "<%= settings.puma_state %>"
...
...

Nginx

Nginx 的配置不算特别难,但是有很多细节需要一定的 Nginx 基础。Nginx 部分之后会另外写一篇(等我慢慢熟悉一些后),这里简单提两点:

  • upstream 中 server 要配置 puma 中 bind 的 socket
  • root 要设置成服务器项目的根目录,也就是 puma.rb 中的 directory

最后需要重启服务器 nginx -s reload

这里因为各种不可抗力,不能贴出完整的配置代码,不过参考链接中的文章附有很全的代码,配置服务器这个事儿就是要劳神费力的,所以需要一个好运维!

参考链接

捧个钱场?