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

おれんじりりぃぶろぐ

きっと何者にもなれないエンジニアのブログ

Rails4 + nginx + unicornで環境構築

毎回webrick起動するのも面倒臭いし、もし本番環境にデプロイなんてする場面が来てしまった時に備えてnginxとunicornrailsのサーバー環境構築を行いました。

環境

nginx

まずはwebサーバーであるnginxをインストールする。

(ubuntu)
インストール前にはapt-get自体のアップデートも忘れずにしておく。

sudo apt-get update
sudo apt-get install nginx

(centos6)
レポジトリへの登録

sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

インストール

sudo yum install nginx

起動

sudo /etc/init.d/nginx start

インストールが終わったら設定をいじる。 /etc/nginx/conf.d/に適当な名前のconfigファイルを作成する。
中身は以下の感じ。

/etc/nginx/conf.d/myapp.conf

upstream unicorn_server {
    # This is the socket we configured in unicorn.rb
    server unix:/tmp/unicorn.sock 
    fail_timeout=0;
}

server {
    listen 80;
    client_max_body_size 4G;
    server_name _;

    keepalive_timeout 5;

    # Location of our static files
    root /vagrant/myApp/public; # 適宜変更 /vagrant/myAppはrailsプロジェクトルートディレクトリ

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        # If you don't find the filename in the static files
        # Then request it from the unicorn server
        if (!-f $request_filename) {
            proxy_pass http://unicorn_server;
            break;
        }
    }

    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root /vagrant/myApp/public; # 適宜変更
    }
}

そして、/etc/nginx/nginx.conf中の最後の方にある
Virtual Host Configs部分のinclude /etc/nginx/sites-enabled/*;コメントアウトする。

/etc/nginx/nginx.conf(抜粋)

##
# Virtual Host Configs
##

include /etc/nginx/conf.d/*.conf;
# include /etc/nginx/sites-enabled/*;

設定を読み込ませる。

sudo /etc/init.d/nginx restart

unicorn

次にアプリケーションサーバーであるunicornをインストールする。インストール自体はgemで行う。 まずはrailsプロジェクト作成しておく。

rails new myApp

プロジェクト内に移動する。

cd myApp

Gemfileに以下を追記してunicornをインストール。

# Use unicorn as the app server
gem 'unicorn'
bundle install

そして、unicornの設定ファイルunicorn.rbmyApp/config/に作成する。 中身は以下の感じ。

myApp/config/unicorn.rb

@app_path = '/vagrant/myApp' # railsのルートディレクトリ

worker_processes 2
working_directory "#{@app_path}/"

# This loads the application in the master process before forking
# worker processes
# Read more about it here:
# http://unicorn.bogomips.org/Unicorn/Configurator.html
preload_app true

timeout 30

# This is where we specify the socket.
# We will point the upstream Nginx module to this socket later on
listen "/tmp/unicorn.sock", :backlog => 64 # nginx側の設定と合わせる必要がある

pid "/tmp/unicorn.pid"

# Set the path of the log files inside the log folder of the testapp
stderr_path "#{@app_path}/log/unicorn.stderr.log"
stdout_path "#{@app_path}/log/unicorn.stdout.log"

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!

  old_pid = "#{server.config[:pid]}.oldbin"
    if old_pid != server.pid
      begin
        sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
        Process.kill(sig, File.read(old_pid).to_i)
      rescue Errno::ENOENT, Errno::ESRCH
      end
    end

    sleep 1
  end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

起動確認のためscaffold作成する。

rails g scaffold User name:string age:integer

マイグレーションを行う。

rake db:migrate

そして以下のコマンドでunicornを起動する。

bundle exec unicorn -c config/unicorn.rb -E development -D

localhost:8080/users/にアクセスする。

f:id:orange_lily27:20150714174458p:plain

終了は以下のコマンドでプロセスを削除する。

cat /tmp/unicorn.pid | xargs kill

エラーとか

エラーログはmyApp/log/unicorn.stderr.log中に書かれている。

unlinking existing socket

上記のようなエラーが出てにっちもさっちもいかなくなったので
ソケットmyApp/tmp/unicorn.sockごと削除したら上手く動作した。

参考