希望这部分折腾的时间可以越来越少……
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
#!/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’)
希望可以节省后来者的时间……