のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Ruby on Rails 4.1でUnicorn + Nginxでデプロイ(Ubuntu)

Sponsored Links

皆さんこんにちは
お元気ですか。私は元気です。

思ったよりも手こずったUnicorn + Nginxでのデプロイを行ってみます。
既にRailsはinstallされているとします。

まずは、Unicornから

Unicorn

Gemfile

gem unicorn

Unicornの設定

configの直下にunicorn.rbを置き、以下のように記載する。

@app_path = '/home/[apppath]' #自分のディレクトリを入力してください。

worker_processes 2
working_directory "#{@app_path}/"
preload_app true
timeout 30
#listen "/tmp/unicorn.sock", :backlog => 64
listen 8080, :tcp_nopush => true

pid "/tmp/unicorn.pid"
stderr_path "#{@app_path}/log/unicorn.stderr.log"
stdout_path "#{@app_path}/log/unicorn.stdout.log"

起動

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

もしこの地点でエラーが出るようであれば、logを見に行こう、場所はlog/unicorn.stderr.logにある

エラー対策

You have already activated rack 1.6.0, but your Gemfile requires rack 1.5.2. Prepending `bundle exec` to your command may solve this

最後のコマンドでbundle execを付け忘れることで発生するエラー

Unknown database '[db]_production'Run `$ bin/rake db:create db:migrate` to create your database (ActiveRecord::NoDatabaseError)

データベース作成を忘れている時に発生する。productionの作り忘れ時に発生する。

Can't connect to local MySQL server through socket '/tmp/mysql.sock'

mysql.sockがない時に発生します。
以下のコマンドを打ってsockの場所を探して設定を更新してください。

mysqladmin version -p

Nginx

インストール

sudo apt-get install nginx

設定ファイル

場所は/etc/nginx/nginx.confにあります。

upstream unicorn_server {
    server localhost:8080;
}

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

    keepalive_timeout 5;

    # Location of our static files
    root  [rails appの場所]/public;

    try_files $uri @unicorn;

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

        proxy_pass http://unicorn_server;
    }

    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root [rails appの場所]/public;
    }
}

nginx の再起動

sudo /etc/init.d/nginx restart

動作確認

いつものサンプルが映れば問題無いです。
f:id:tereka:20150104023348p:plain

その他

Unicornのシャットダウン

$ps -ef | grep unicorn | grep -v grep
tereka   25234     1  1 16:54 ?        00:00:04 unicorn master -E production -c config/unicorn.rb -D
tereka   25240 25234  0 16:55 ?        00:00:00 unicorn worker[0] -E production -c config/unicorn.rb -D
tereka   25243 25234  0 16:55 ?        00:00:00 unicorn worker[1] -E production -c config/unicorn.rb -D
$kill -QUIT 25234

Nginxの文法確認

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful