プログラミングノート

一からものを作ることが好きなエンジニアの開発ブログです。

さくらVPS 開発環境編 (Rails+nginx+unicorn)

基本設定編で最低限の設定が終了したので、今度はサービスを公開するための環境を整えました。nginx周りがよく分かりませんでしたが、とりあえず動くところまでは行けたので、プロトタイプを作ってすぐ人に見せれる環境が出来ました。


まずは後からビルドで必要となるパッケージ+αを全部入れておきます。

# yum install yum-fastestmirror
# yum update
# yum install gcc gcc-c++ openssl* pcre* zlib* gd* libpng* libjpeg* libxml* libxslt* readline*

MySQLインストール

yumでインストールして、自動で起動するようにしておきます。

# yum install mysql mysql-devel mysql-server
# /etc/rc.d/init.d/mysqld start
# chkconfig mysqld on 


rootパスワードを設定。

$ mysql -u root
mysql> grant all PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password';
mysql> delete from mysql.user where password = '';

Railsインストール

続いてRails。yumでパッケージが無かったものはソースから入れています。

git
# cd /usr/local/src
# wget http://git-core.googlecode.com/files/git-1.7.7.3.tar.gz
# tar zxf git-1.7.7.3.tar.gz
# cd git-1.7.7.3
# ./configure
# make && make install
RVM
$ bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
$ echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function' >> ~/.bash_profile
$ . .bash_profile
ruby
$ rvm install ruby-1.9.2 --with-readline-dir=/usr/include/readline
$ rvm ruby-1.9.2 --default
node.js

Rails3.1を動作させようとするとランタイムエラー(ExecJS::RuntimeUnavailable)になったのでインストール。

# cd /usr/local/src
# wget http://nodejs.org/dist/v0.6.1/node-v0.6.1.tar.gz
# tar zxf node-v0.6.1.tar.gz 
# cd node-v0.6.1
# ./configure
# make && make install
rails
$ gem install rails
$ gem install mysql2


一応この時点で適当な場所にプロジェクトを作成して動作確認しておきます。
80ポートで起動して、ブラウザからアクセスできれば大丈夫です。

$ cd /var/www
$ rails new sample -d mysql
$ cd sample
$ rvmsudo rails s -p 80


mysqlにつながらない場合は/tmp/mysql.sockの場所を確認してください。
今回はこのように変更しています。

- socket: /tmp/mysql.sock
+ socket: /var/lib/mysql/mysql.sock

unicornインストール

続いてunicornですが、これはgem一発で完了。

$ gem install unicorn


アプリケーション毎に設定ファイルを記述します。
とりあえず動けば良いので、最低限の内容のみ記述。

# vi /var/www/sample/config/unicorn.rb

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


ここでも動作確認しておきます。

$ rvmsudo unicorn_rails -c config/unicorn.rb -p 80


動作が確認できたら、デーモンとして起動しておきます。
8080ポートで動作します。

$ unicorn_rails -c config/unicorn.rb -D

nginxインストール

最後にnginxです。


専用のユーザーを追加して、ソースからインストールします。コンパイルオプションはCompile-time optionsに詳細が記載されています。ビルドする時にしかモジュールを追加できないようなので、必要なものは入れておきましょう。

# useradd -s /sbin/nologin nginx
# cd /usr/local/src
# wget http://nginx.org/download/nginx-1.0.9.tar.gz
# tar zxf nginx-1.0.9.tar.gz 
# cd nginx-1.0.9
# ./configure \
 --conf-path=/etc/nginx/nginx.conf \
 --prefix=/usr/local/nginx \
 --with-http_stub_status_module \
 --with-http_ssl_module \
 --with-http_gzip_static_module \
 --with-http_realip_module
# make && make install


サーバーを起動して、Welcomeページが表示されるか確認します。

// サーバー起動
# /usr/local/nginx/sbin/nginx

// サーバー停止
# /usr/local/nginx/sbin/nginx -s quit


nginx経由で、unicornのプロセスにアクセスできるように設定します。最終的には管理しやすいように分割しますが、とりあえず動作確認できればよいのでnginx.confファイルを直接書き換えました。

#vi /etc/nginx/conf/nginx.conf

user nginx;
worker_processes 1;

pid /var/run/nginx.pid;
error_log /var/log/nginx/error.log;

events {
  worker_connections 1024;
}

http {
  include mime.types;
  default_type  application/octet-stream;

  access_log /var/log/nginx/access.log;
  sendfile on;
  keepalive_timeout  65;

  upstream unicorn_app {
   server unix:/tmp/unicorn.sock;
  }

  server {
    listen 80;
    server_name _;
    location / {
      proxy_pass  http://unicorn_app;    
    }
  }
}


もう一度/usr/local/nginx/sbin/nginxでサーバーを起動してアクセスすると、Welcomeページではなく、Railsアプリのページが表示されます。最後に起動用のスクリプトを追加しておきます。

# vi /etc/init.d/nginx

#! /bin/sh
### BEGIN INIT INFO
# Provides: nginx
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: nginx web server
# Description: nginx web server
### END INIT INFO

DESC="nginx web server"
NAME=nginx
DAEMON=/usr/local/nginx/sbin/$NAME
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

case "$1" in
  start)
    $DAEMON
    ;;
  stop)
    kill `cat $PIDFILE`
    ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop}" >&2
    exit 1
    ;;
esac


自動で起動するように設定。

# chmod 755 /etc/init.d/nginx
# chkconfig --add nginx
# chkconfig nginx on


以上で終了です。
色々調べつつ半日かかりました..。