Rails + Nginx + unicorn + MySQLで本番環境構築をした

  • 44
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

今回作りたいもの

Railsアプリケーション
静的コンテンツをアプリケーションで生成して配信することがある

道具について

宗教的理由or気分で選んだ
まぁ大体静的コンテンツを配信するならNginxだよね!って感じ

unicorn: Rack HTTP server for fast clients and Unix

http://unicorn.bogomips.org/

https://github.com/blog/517-unicorn
これが結構わかりやすい

pumaは?

heroku: Puma is Now the Recommended Ruby Webserver
↑こんなことがあった!

unicornはスロークライアントの影響を受けやすいからその影響を受けにくいPumaのほうがいいよねって話だけど、今回の場合はリバースプロキシとしてのNginxを使うので、unicornで問題無いっしょ!

Let's Start

今回はVirtualBox上にVagrantでCentOS 65をインストールして、sshで作業します
(Chefを使いたい人生だった…諸事情により今回はインストール作業をコマンド打っていきます…)

Vagrant

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.box = "puphpet/centos65-x64"
  config.vm.network "forwarded_port", guest: 80, host: 80
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder "./path/to/project", "/var/www"

  config.vm.provider "virtualbox" do |vb|
    vb.name = "VMName"
    vb.gui = false
    vb.memory = "2048"
  end
end

環境を構築するところにVagrantfileを用意して

$ vagrant up

upできたらsshでログインして作業していく

$ vagrant ssh
Welcome to your Vagrant-built virtual machine.
$

sudoがいるのでsuでrootになっておいたほうが楽かも(sudoは省略します、パスワードはvagrantです)

MySQL install

デフォではMySQLのバージョンは5.1なので、MySQLのリポジトリの新しいやつを入れる

$ yum update -y
$ yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
$ yum -y install mysql mysql-devel mysql-server mysql-utilities
$ chkconfig mysqld on
$ service mysqld start
$ mysqladmin -u root password 'new-password'
$ mysql_secure_installation

mysqladminのあたりからは環境によっていろいろ、/root/.mysql_secretにパスワードが書いてある事もあったりする

Nginx install

今現在の最新版は1.8なので、できればこれを入れたい

$ rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
$ yum install nginx -y
$ service nginx start
$ chkconfig nginx on
/etc/nginx/conf.d/local.conf
upstream unicorn {
  server unix:/home/vagrant/projects/unicorn_sample/tmp/unicorn.sock;
}

server {
  listen 80 default_server;
  server_name   rails_app;

  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;

  root /var/www/rails_app   ;

  client_max_body_size 100m;
  error_page 404 /404.html;
  error_page 500 502 503 504 /500.html;
  try_files $uri/index.html $uri @unicorn;

  location ~ /static/.* {
    root  /var/www/static/;
    index index.html;
  }

  location @unicorn {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn;
  }
}

設定の反映とかでのリロードはこうする

$ nginx -s reload

Ruby

とここでRubyのインスコ
rbenvを入れるぞい

$ yum install git gcc gcc-c++ openssl-devel readline-devel
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ exec $SHELL -l
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install --list
$ rbenv install -v 2.2.3
$ rbenv rehash
$ rbenv versions
$ rbenv global 2.2.3
$ gem install bundler

って感じ

Project install

まぁGitで落としてくるよね

$ echo 'export RAILS_ENV="production"' >> ~/.bash_profile
$ cd /var/www
$ git clone <url_to_git>
$ bundler install

Unicorn

gem 'unicorn'

Unicornの設定をする

config/unicorn.rb
# -*- coding: utf-8 -*-
worker_processes 4

listen '/tmp/unicorn.sock'
pid '/tmp/unicorn.pid'

stderr_path File.expand_path('log/unicorn.log')
stdout_path File.expand_path('log/unicorn.log')

preload_app true

そしたらこれで起動できる

$ bundle exec unicorn_rails -c config/unicorn.rb -D

けど
chkconfigでやりたくない…?やりたい!

/etc/init.d/unicorn
#!/bin/sh
# chkconfig: 345 90 20
# description: Rails application
# processname: unicorn

RAILS_ENV=production
SERVICE=production
USER=root

RAILS_ROOT_DIR="/var/www/rails_app"

PID=${RAILS_ROOT_DIR}/tmp/unicorn.pid
UNICORN_CONF=${RAILS_ROOT_DIR}/config/unicorn.rb

UNICORN_ALIVE=`ps aux|grep '${UNICORN_CONF}'|grep -v grep|wc -l`

start()
{
  if [ $UNICORN_ALIVE = 0 ]; then
    rm -f $PID
  fi
  if [ -e ${PID} ]; then
    echo "${SERVICE} already started"
    exit 1
  fi
  echo "start ${SERVICE}"
  sudo su -l ${USER} -c "source /etc/environment && cd ${RAILS_ROOT_DIR} && bin/unicorn_rails -c ${UNICORN_CONF} -E ${RAILS_ENV} -D"
}

stop()
{
  if [ ! -e ${PID} ]; then
    echo "${SERVICE} not started"
    exit 1
  fi
  echo "stop ${SERVICE}"
  kill -QUIT `cat ${PID}`
}

force_stop()
{
  if [ ! -e ${PID} ]; then
    echo "${SERVICE} not started"
    exit 1
  fi
  echo "stop ${SERVICE}"
  kill -INT `cat ${PID}`
}

reload()
{
  if [ ! -e ${PID} ]; then
    echo "${SERVICE} not started"
    start
    exit 0
  fi
  echo "reload ${SERVICE}"
  kill -USR2 `cat ${PID}`
}

restart()
{
  if [ -e ${PID} ]; then
    stop
    sleep 3
  fi
  start
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  force-stop)
    force_stop
    ;;
  reload)
    reload
    ;;
  restart)
    restart
    ;;
  *)
    echo "Syntax Error: release [start|stop|force-stop|reload|restart]"
    ;;
esac

そんでもって

$ service unicorn start
$ chkconfig unicorn on

そしたらRailsのアプリケーションを/var/www/rails_appに持ってきて、たぶんいけるはず(てきとう)