読者です 読者をやめる 読者になる 読者になる

人生のヒント

私が経験したことが、誰かの人生のヒントになればと願い書きます。

6.本番環境を整える(Unicorn + Nginx)

スポンサーリンク

前回、MySQLをインストールし、WEBrickで動作確認をしました。

本番環境では、WEBrickで運用せずに専用のWeb/APサーバソフトを使用して運用することが多いようです。

 

Unicorn + Nginxという組み合わせが手軽らしいので、今回はこのアプリケーションの構築を記録していきます。

とりあえず、今回はHTTPSではなく、HTTPに対応させます。次回以降、HTTPSに対応することもやっていきます。

以下サイトを参考にしました。

http://www.virment.com/ubuntu-nginx-unicorn-rails/

https://gist.github.com/akl/1791380

 

rootユーザでログインします。

1.Unicornのインストール

以下コマンドを実行します。

# su - rails

$ cd work/foo

$ vi Gemfile

 Gemfileに以下を追記します。

gem 'unicorn'

 

以下コマンドを実行します。

$ bundle install

$ mkdir pids

$ vi config/unicorn.rb

 

以下を記載します。

working_directory '/home/rails/work/foo'
pid '/home/rails/work/foo/pids/unicorn.pid'
stderr_path '/home/rails/work/foo/log/unicorn.log'
stdout_path '/home/rails/work/foo/log/unicorn.log'
listen '/tmp/unicorn.foo.sock'
worker_processes 2
timeout 30

 

以下コマンドを実行します。

$ exit

# vi /etc/init.d/unicorn

 /etc/init.d/unicornファイルに以下を記載します。

#!/bin/sh
set -e
TIMEOUT=${TIMEOUT-60}
APP_ROOT=/home/rails/work/foo
PID=$APP_ROOT/pids/unicorn.pid
UNICORN_ROOT=/home/rails/.rbenv/versions/2.2.2/
CMD="$UNICORN_ROOT/bin/unicorn -D -c $APP_ROOT/config/unicorn.rb -E production"
action="$1"
set -u

old_pid="$PID.oldbin"

cd $APP_ROOT || exit 1

sig () {
        test -s "$PID" && kill -$1 `cat $PID`
}

oldsig () {

        test -s $old_pid && kill -$1 `cat $old_pid`
}

case $action in
start)
        sig 0 && echo >&2 "Already running" && exit 0
        su -c "$CMD" - rails
        ;;
stop)
        sig QUIT && exit 0
        echo >&2 "Not running"
        ;;
force-stop)
        sig TERM && exit 0
        echo >&2 "Not running"
        ;;
restart|reload)
        sig HUP && echo reloaded OK && exit 0
        echo >&2 "Couldn't reload, starting '$CMD' instead"
        su -c "$CMD" - rails
        ;;
upgrade)
        if sig USR2 && sleep 2 && sig 0 && oldsig QUIT

       then
                n=$TIMEOUT
                while test -s $old_pid && test $n -ge 0
                do
                        printf '.' && sleep 1 && n=$( ( $n - 1 ) )
                done
                echo

                if test $n -lt 0 && test -s $old_pid
                then
                        echo >&2 "$old_pid still exists after $TIMEOUT seconds"
                        exit 1
                fi
                exit 0
        fi
        echo >&2 "Couldn't upgrade, starting '$CMD' instead"
        su -c "$CMD" - rails
        ;;
reopen-logs)
        sig USR1
        ;;
*)
        echo >&2 "Usage: $0 "

        exit 1
        ;;
esac

 

以下のコマンドを実行します。

# chmod 755 /etc/init.d/unicorn

# /etc/init.d/unicorn start

# ps -ef|grep unicorn|grep -v grep

 以下のプロセスが起動していることを確認する。

unicorn master -D -c /home/rails/work/foo/config/unicorn.rb -E production

以下のコマンドを実行します。

# /etc/init.d/unicorn stop

# apt-get install sysv-rc-conf

# sysv-rc-conf unicorn on

 

2.Nginxのインストール

以下のコマンドを実行します。

# apt-get update

# apt-get install nginx

# vi /etc/nginx/nginx.conf

Webサーバ上でgzipを有効にするため、以下のコメントを外します。

これは、PageSpeed Insightsでページの速度を測定する時に指摘されることの一つへの対応です。

レスポンスを気にしていない人は設定しなくてもWebサーバとして問題なく動きます。

 

【変更前】

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

【変更後】

gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

 

以下のコマンドを実行します。

# vi /etc/nginx/sites-available/default

以下記述をファイルに1から書きます。

 upstream app {
    server unix:/tmp/unicorn.foo.sock fail_timeout=0;
}

server {

        listen 80;
        server_name <サーバ名を書く>;

        root /home/rails/work/foo/public/;
        index index.html index.htm;

        try_files $uri/index.html $uri @app;

        location @app {
          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_redirect off;
          proxy_pass http://app;

         }

        location ~ .*\.(jpg|gif|png|css|js|ico|woff) {
           expires 10d;
        }

        error_page 500 502 503 504 /500.html;
        #client_max_body_size 4G;
        keepalive_timeout 10;
}

 

  以下のコマンドを実行します。

# /etc/init.d/unicorn start

# /etc/init.d/nginx start

# sysv-rc-conf nginx on

 

3.動作確認

Webブラウザで「http://サーバのアドレス/users」と入力して、前回までの動作確認で確認できたことと同じことができることを確認する。

 

問題なければ、rebootして、念のために再起動しても同じ動作ができることを確認しておきましょう。