前篇介绍到如何在《CentoOS 上面安装 Gitlab》一文,gitlab 默认使用的是 unicorn 作为内部的 app server,再用 nginx 做代理转发。之前是在公司内部搭建了一个平台,用着还算可以。有打算在 Linode 购买的 VPS 上面,使用 unicorn 跑服务的时候 ruby 的进程居然占了 400-500M 左右,对于 Linode 刚刚免费升级之后才有 1G 内存的环境上,我还真有点放弃安装它的欲望。于是在想是否可以使用 puma 替换掉原先的。

puma

简单介绍下 puma,它是一个由 ruby 编写的转为 rack 设计的 app server,在性能和资源占有上却有极大的优势(下表数据来自官方)

1PUMA - 78 Mb
2RAINBOWS! (1X16) - 120 Mb
3UNICORN - 1076 Mb
4RAINBOWS! (16X32) - 1138 Mb

而且集成也非常的简单,若使用 rails 或者 sinatra(及 padrino)都已经支持,直接 gem install puma,然后跑默认的 rails/padrino server 会自动加载。

教程

Okay,经过一番查找,官方在收集的 repices 里面有关于 puma 的一些配置。他们也是收集的非官方资料,里面的资料只有借鉴意义,真正拿来用的时候各种问题,所以才有了本篇文字。

首先是关闭启动的 gitlab 服务

1$ (sudo) service gitlab stop

关闭之后,添加 puma gem,打开 Gemfile

1group :unicorn do
2  gem 'unicorn', '~> 4.6.3'
3	gem 'unicorn-worker-killer'
4end

找到上面的这段 group 替换成:

1gem 'puma'

再者修改 config.ru,把下面这段代码做下替换,删除 unicorn 的代码,加载 puma:

1unless defined?(PhusionPassenger)
2  require 'unicorn'
3  # Unicorn self-process killer
4  require 'unicorn/worker_killer'
5  # Max memory size (RSS) per worker
6  use Unicorn::WorkerKiller::Oom, (200 * (1 << 20)), (250 * (1 << 20))
7end

更新成

1unless defined?(PhusionPassenger)
2  require 'puma'
3end

替换完毕更新 gem

1# mysql 数据库
2bundle install --without development test postgres --path vendor/bundle --no-deployment
3# postgres 数据库
4bundle install --without development test mysql --path vendor/bundle --no-deployment

最后还有两处需要修改,添加 config/puma.rb(替代 config/unicorn.rb) 以及替换 /etc/init.d/gitlab 服务脚本代码。

config/puma.rb的代码在这里可以下载,无需做任何的修改。

/etc/init.d/gitlab 服务脚本:CentOS | Debian(Ubuntu)

服务脚本需要设置下执行权限: chmod +x /etc/init.d/gitlab

最后开启服务应该就完美了

1$ (sudo) service gitlab start

我想用 Apache 怎么办?

嗯,我没尝试过,官方有提供收集的资料,自己查看下吧,记得要活学活用,直接套肯定会出问题的。