世界上最伟大的投资就是投资自己的教育

首页服务器部署
随风 · 练气

部署之使用 mina 来部署 Ruby on Rails 应用之 puma (九)

随风发布于3222 次阅读

1. 介绍

Puma is a simple, fast, threaded, and highly concurrent HTTP 1.1 server for Ruby/Rack applications.

按照官方的定义,puma是一个多进程,多线程,高并发的 web 容器。相比于 unicorn,puma 是多线程的,线程是进程之上更小的执行单位,而创建线程是额外的 cpu 开销的,但是 puma 用了一个线程池,它能实现高并发。由于 c 语言实现的 ruby 是存在 GIL(全局锁),ruby 的多线程并不能有效地利用多核,因为那个 GIL 是同一时间只能执行一段 ruby 代码的,虽然它 IO 操作并不阻塞,但这样也并不能实现真正的高并发,不过,Rubinius 和 JRuby 没有 GIL,和它们结合就是一个比较好的组合。

而且,使用 puma,还要保证代码,框架,还有各种 gem 都是线程安全的。这对开发者的编程能力是一个考验。

2. 使用

我们是使用mina-puma结合 nginx 来部署 Puma 应用的。

使用 puma 来部署 ruby on rails 应用和使用 unicorn 的方法基本差不多。所以我们可以更多的参考前一篇文章部署之使用 mina 来部署 ruby on rails 应用之 unicorn(八)。唯一有不同的是 unicorn 的地方改成 puma,还有配置文件的内容也是要按照 puma 的来。

安装的 gem 是下面两个。

gem 'puma'
gem 'mina-puma', require: false

require 'mina/puma'添加到config/deploy.rb中。

设置 puma 的配置文件的位置。

set :puma_config, -> { "#{deploy_to}/#{current_path}/config/puma_app.rb" }

其他关于config/deploy.rb文件的部分要改成下面这样。

require 'mina/puma'

task :setup => :environment do
  # Puma needs a place to store its pid file and socket file.
  queue! %(mkdir -p "#{deploy_to}/#{shared_path}/tmp/sockets")
  queue! %(chmod g+rx,u+rwx "#{deploy_to}/#{shared_path}/tmp/sockets")
  queue! %(mkdir -p "#{deploy_to}/#{shared_path}/tmp/pids")
  queue! %(chmod g+rx,u+rwx "#{deploy_to}/#{shared_path}/tmp/pids")

  ...

end

# Add pids and sockets directories to shared paths
set :shared_paths, ['config/database.yml', 'tmp/pids', 'tmp/sockets']
set :puma_config, -> { "#{deploy_to}/#{current_path}/config/puma_app.rb" }

task :deploy do
  deploy do
    invoke :'git:clone'
    invoke :'deploy:link_shared_paths'
    ...

    to :launch do
      ...
      invoke :'puma:restart'
    end
  end
end

puma 的配置文件config/puma_app.rb是这样子的。

app_path = File.expand_path( File.join(File.dirname(__FILE__), '..'))
# Change to match your CPU core count
workers 1

# Min and Max threads per worker
threads 1, 6

# Default to production
rails_env = ENV['RAILS_ENV'] || "production"
environment rails_env

# Set up socket location
bind "unix://#{app_path}/tmp/sockets/pumactl.sock"

# Logging
stdout_redirect "#{app_path}/log/puma.stdout.log", "#{app_path}/log/puma.stderr.log", true

# Set master PID and state locations
pidfile "#{app_path}/pids/puma.pid"
state_path "#{app_path}/tmp/sockets/puma.state"
activate_control_app

on_worker_boot do
  require "active_record"
  ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished
  ActiveRecord::Base.establish_connection(YAML.load_file("#{app_path}/config/database.yml")[rails_env])
end

而 nginx 的地方基本是一样的,唯一需要修改的是将upstream rails365部份的 puma 的 unix socket 的文件指向正确即可。

先使用mina puma:start命令把 puma 启动起来。

最后使用mina deploy来部署。

完结。

本站文章均为原创内容,如需转载请注明出处,谢谢。

0 条回复
暂无回复~~
喜欢
统计信息
    学员: 29003
    视频数量: 1973
    文章数量: 489

© 汕尾市求知科技有限公司 | Rails365 Gitlab | Qiuzhi99 Gitlab | 知乎 | b 站 | 搜索

粤公网安备 44152102000088号粤公网安备 44152102000088号 | 粤ICP备19038915号

Top