使用 Nginx 和 Unicorn 部署 Rails

unicorn

Official site
http://unicorn.bogomips.org/

Github中使用unicorn
https://github.com/blog/517-unicorn

Unicorn 进程管理非常的Unix风格(Do one thing and do it right.),有利于简化部署和系统管理用,同时它使用Unix Domain Socket来完成进程间通讯,不会对nginx产生耦合(符合:端口即服务的原则)。

必装软件

Nginx配置

查看Server上nginx.conf配置,确保以下选项被启用,默认被启用。

1
2
3
include /etc/nginx/mime.types;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

/etc/nginx/sites-enabled/目录下会有一个defalut的文件,这是一个默认的nginx配置文件,可以依该文件为模板为新项目创建配置文件,在后面该文件会被删除。

1
default -> /etc/nginx/sites-available/default

然后在rails项目中加入unicorn的配置

$APP_ROOT/config

1. unicorn.rb

代码gist
该文件配置了unicorn的项目路径,pid, log路径,和监听的地址以及超时时间。

替换 rootlisten 路径

2. nginx.conf

代码gist
这是nginx的项目配置文件,unicorn项目里有一个 example 文件,可供参阅:unicorn nginx conf example

替换 upstream > serverserver > root 路径

3. unicorn_init.sh

代码gist
Unicorn官方init.sh示例

unicorn配置成功之后,可以通过bundle unicorn命令行来启动,但我保证你不会用这种方式。将启动配置成service,并让其开机时运行。就是这个文件的用途,具体可参考:unicorn init example

替换 APP_ROOT 路径和 AS_USER 到相应用户
要给该文件加上可执行的权限 $ chmod +x unicorn_init.sh

部署代码到Server上

通过git将代码clone到 ~/apps/,然后通过bundler安装所需的gems

服务器部署都会运行在production环境,通过下面的命令可以建立production环境下的数据库和构建Assets。

1
2
3
4
RAILS_ENV=production rake db:create
RAILS_ENV=production rake db:migrate
RAILS_ENV=production rake db:populate
RAILS_ENV=production bundle exec rake assets:precompile

配置Nginx项目

1
2
3
4
5
6
# 删除Nginx默认的配置文件
$ sudo rm /etc/nginx/sites-enabled/default
# 添加项目的配置文件到Nignx
$ sudo ln -s /home/ares/apps/simply/config/nginx.conf /etc/nginx/sites-enabled/simply
# 测试是否配置成功
$ sudo less /etc/nginx/sites-enabled/simply

启动项目Unicorn

测试

1
APP_ROOT$ bundle exec unicorn -c /home/ares/apps/simply/config/unicorn.rb -E production -D

查看Unicorn的运行状况

1
$ ps aux | grep unicorn

显示进程如下,可通过kill -9 7501杀死该进程

1
2
3
ares 7051 0.0 4.4 89716 22564 ? Sl 09:44 0:00 unicorn master -D -c /home/ares/apps/simply/config/unicorn.rb -E production
ares 7054 1.8 18.1 268092 90968 ? Sl 09:44 0:02 unicorn worker[0] -D -c /home/ares/apps/simply/config/unicorn.rb -E production
ares 7056 2.0 18.7 274676 94116 ? Sl 09:44 0:03 unicorn worker[1] -D -c /home/ares/apps/simply/config/unicorn.rb -E production

成功之后,就可以用我们写的脚本来运行。

1
2
3
4
$ sudo ln -s ~/apps/simply/config/unicorn_init.sh /etc/init.d/simply_unicorn
$ sudo service simply_unicorn start
$ sudo service nginx restart

Ubuntu中rbenv里环境变量要配置在.profile下。不然会有Command Not Found的问题。在rbenv的安装里有提到这个问题:小试 rbenv

配置Unicorn项目开机启动

1
2
$ ps aux | grep sidekiq
$ kill -9 0000
Gemfil
1
gem 'sinatra'
config/routes.rb:
1
2
require 'sidekiq/web'
mount Sidekiq::Web => '/sidekiq'

REF::

http://brandontilley.com/2011/01/29/serving-rails-apps-with-rvm-nginx-unicorn-and-upstart.html
http://www.4ucode.com/Study/Topic/625073
http://sirupsen.com/setting-up-unicorn-with-nginx/
http://tomayko.com/writings/unicorn-is-unix
Gist: Ruby on Rails server setup on Ubuntu 11.04 with Nginx, Unicorn, Rbenv
rails + unicorn + rbenv + init.d daemon
Switching From RVM to rbenv on a Production Server