部署 RVM + Rubinius + Rails + Puma + Nginx + Capistrano + Ubuntu 12.04 配置方案

kevinzhow · 2013年11月01日 · 最后由 diguage 回复于 2014年02月24日 · 6551 次阅读

希望这部分折腾的时间可以越来越少……

Blog 原文 http://imkevin.me/post/65620573432/rvm-rubinius-rails-puma-nginx-capistrano

参考 http://tommy.chheng.com/2013/01/23/deploying-a-rails-app-on-nginxpuma-with-capistrano/ 参考 http://natewienert.com/rubinius-plus-puma-plus-chruby-plus-capistrano-on-ubuntu

1.RVM

如果没安装的话先安装RVM

\curl -L https://get.rvm.io | bash -s stable

已经安装的话可以更新下

rvm get head — auto-dotfiles

2.安装Rubinius

rvm install rbx
rvm use rbi —default

编辑 ~/.ruby-version

写上 rbx-2.1.1 (此处视安装的rbx版本而定)

3.Gemfile

添加

gem "puma"
gem "rubysl", "~> 2.0", platform: :rbx
bundle install
  1. 编辑 config/puma.rb
#!/usr/bin/env puma

environment "production"
basedir = "path_to_your_app"
threads 4,48

bind  "unix:///tmp/appname.sock"
pidfile  "#{basedir}/current/tmp/puma/pid"
state_path "#{basedir}/current/tmp/puma/state"
preload_app!
activate_control_app

5.编辑 nginx.conf

这里只列出了一些和puma有关的部分

upstream appname {
  server unix:///tmp/appname.sock;
}

server {
  listen 80;
  server_name www.appname.com appname.com;
  location / {
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    proxy_redirect off;

    if (-f $request_filename/index.html) {
        rewrite (.*) $1/index.html break;
      }

      if (-f $request_filename.html) {
        rewrite (.*) $1.html break;
      }

      if (!-f $request_filename) {
        proxy_pass http://appname;
        break;
      }
  }
}

6.Puma控制脚本

从此处获得 https://github.com/puma/puma/tree/master/tools/jungle

我Server用的是 Ubuntu 所以用的 init.d 里的脚本

其操作过程可以见 README.md

这里列一下和RVM配合使用的技巧

在你安装RVM的用户终端,使用 echo $PATH 来获取当前的路径配置

然后,复制,黏贴到

puma 这个脚本 line 18 后 PATH=/usr/local/bin:/usr/local/sbin/:/sbin:/usr/sbin:/bin:/usr/bin:your_path 这样可以解决pumactl找不到这类的问题

同样黏贴到

run-puma 里 PATH=your_path 7.Capistrano

添加下面到最后

namespace :puma do
  desc "Start Puma"
  task :start, :except => { :no_release => true } do
    run "mkdir -p #{current_path}/tmp/puma"
    run "sudo /etc/init.d/puma start #{application}"
  end
  after "deploy:start”, “puma:start"

  desc "Stop Puma"
  task :stop, :except => { :no_release => true } do
    run "sudo /etc/init.d/puma stop #{application}"
  end
  after "deploy:stop", "puma:stop"

  desc "Restart Puma"
  task :restart, roles: :app do
    run "sudo /etc/init.d/puma restart #{application}"
  end
  after "deploy:restart", "puma:restart"

  desc "create a shared tmp dir for puma state files"
  task :after_symlink, roles: :app do
    run "sudo rm -rf #{release_path}/tmp"
    run "ln -s #{shared_path}/tmp #{release_path}/tmp"
  end
  after "deploy:create_symlink", "puma:after_symlink"
end

由此就可以使用 cap deploy:restart 来启动 Server 了

这里还有一个问题是,开机自启动。 直接按照他们给出的方法可能会无法启动,我的解决方法是在我的home目录写了个脚本,然后设定个开机自启动脚本来执行home里的这个脚本

里面有这句

do=$(/bin/bash -i -c -l ‘/etc/init.d/puma start appname’)

希望可以节省后来者的时间……

共收到 12 条回复

赞,感谢分享。

Puma 已经内置了 Capistrano 的脚本的,不用自己写,直接在 config/deploy.rb 里面

require "puma/capistrano"

感谢分享

一看到这么多的组合,我主动放弃了

#4楼 @huacnlee 都写完了之后才看到有提到已经有了什么的,谢谢!

#6楼 @putty …只是为了详细下检索效果,没那么恐怖啦

学习了,多谢

rubysl在这里起到什么作用?

#10楼 @JeskTop rbx 缺少standard lib

请问:不用Rubinius和rbx可以吗?用上这两个东东有啥优点呢?

kevinzhow 关闭了讨论 03月12日 16:24
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册