vdeep

*

vdeepはプログラミング、IT、Web技術、ライフハックの事などなどを管理人okutaniがつぶやくブログです。月間11万PV〜。

CentOS7+nginxでRuby on Railsを利用する(Unicorn)

      2017/01/12

LINEで送る
Pocket

nginx-rubyonrails
こんにちは、okutaniです。前回、「CentOS7にnginxを導入&初期設定まとめ | vdeep」という記事を本ブログで紹介しました。

今回は「CentOS7+nginx上でRuby on Railsを動作」させるまでを紹介します。

Ruby on Railsをnginxで動作させるには「Unicorn」というツールを利用します。ここでは、nginxでRubyを使うのにUnicornが必要、ぐらいに捉えておいてください。

また、Ruby, Ruby on Rails自体のインストール方法は「CentOS7にRuby on Railsを導入する方法 | vdeep」を参考にしてください。本記事では割愛しています。

ではさっそく、Unicornを導入してnginx上でRuby on Railsを動かしてみましょう。

参考Rails 4.2 + Unicorn + Nginx でアプリケーションサーバの構築 – Qiita

参考[Rails][CentOS6]Unicorn + NginxでRails4アプリ公開まで | Coffee Breakにプログラミング備忘録

スポンサーリンク

Unicornを導入する

Unicornを導入しておくと、nginx上でRuby on Railsが使えるようになります。

Rails以外のその他Rubyフレームワーク(sinatraなど)でも、同じ手順で利用することができるかと思います。

では、nginxを導入したCentOS7にUnicornを導入してみましょう。導入はgemからおこなえます。

$ sudo gem install unicorn

次のように、Gemfileに次の行を記述、Railsアプリの場合はコメントアウトされている該当行の#を削除し、「$ bundle install」でインストールしてもOKです。

$ sudo vi Gemfile
...省略...
gem "unicorn"
...省略...

次のコマンドでGemfileからUnicornをインストール。

$ bundle install

これでUnicornが導入できました。

unicorn.rbの設定

次に、プロジェクト内にあるconfigディレクトリに「unicorn.rb」を作成して、Unicornを利用できるように設定していきましょう。

前準備として、.sock, .pidファイルを格納するディレクトリをパーミッション777で作成しておきます。

$ sudo mkdir /var/run/unicorn
$ sudo chmod 777 /var/run/unicorn

プロジェクトファイル内(ここではmyappとします)に「config/unicorn.rb」ファイルを作成します。次のように記述しましょう。

$ sudo vi config/unicorn.rb

application = 'myapp'

# ワーカープロセス数: CUPコア数の2倍程度に設定
worker_processes 4

#15秒応答がなければワーカーをkill
timeout 15

# PID, ソケット
pid "/var/run/unicorn/unicorn_#{application}.pid"
listen "/var/run/unicorn/unicorn_#{application}.sock"

# ダウンタイム無しでデプロイ可
preload_app true

# before_forkとafter_forkで個々のワーカーの外部接続を管理
before_fork do |server, worker|
  Signal.trap 'TERM' do
  puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
  Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
  ActiveRecord::Base.connection.disconnect!end

after_fork do |server, worker|
  Signal.trap 'TERM' do
  puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) and
  ActiveRecord::Base.establish_connection
end

# ログ
stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])

Unicornの実行

Unicornをデーモンで実行します。myapp直下でおこないましょう。

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

本番環境で起動させたい場合は以下。

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

下記のコマンドでUnicornのプロセスを確認できます。

$ ps aux | grep unicorn

Unicornの停止は次のコマンドでkillすればOK(適宜myappの箇所を置き換えてください)。

$ kill -QUIT `cat /var/run/unicorn/unicorn_myapp.pid`

補足: 再起動時に/var/run/unicornが削除される場合の対処

CentOS7では、再起動時に「/var/run」以下のディレクトリが削除される仕様になっています。

OSを再起動する場合は「/var/run/unicorn」の作成・権限の追加を再度おこないましょう。

もしくは、~/.bashrcファイルなどに以下の記述をしておけば、自動でunicornディレクトリの設定をしてくれるので便利です。

sudo mkdir -p /var/run/unicorn && sudo chmod 777 /var/run/unicorn

OSを再起動後、unicornが立ち上がらなくて困ったときは参考にしてください。

nginx default.confの設定

default.confを下記のように書き換える、もしくは、hoge.confなどを作成して記述してもOKです。適宜、myappを置き換えてください。

$ sudo vi /etc/nginx/conf.d/default.conf

upstream unicorn {
  # unicorn.rbで設定したunicorn.sockを指定
  server unix:/var/run/unicorn/unicorn_myapp.sock;
}

server {
  listen 80;
  server_name myapp.example.com;

  root [myappまでのパス];

  access_log /var/log/nginx/myapp_access.log;
  error_log /var/log/nginx/myapp_error.log;

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

  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を再起動します。

$ sudo systemctl restart nginx

上記が設定できたら「http://IPアドレス」へアクセスし、次のように画面が表示されればOKです(画像ではポート番号3000になっていますが無視してください)。

centos7-ruby-on-rails2

アプリ起動時に画面が真っ白になってしまう場合

Unicornをproductionで起動している場合、画面が真っ白になってしまうことがあります(参考Rails が production 環境で真っ白、SECRET_KEY_BASE 設定忘れが原因でした | EasyRamble)。次のように対処しましょう。

下記コマンドで生成されたランダム値をメモします。

$ bundle exec rake secret
47f51690f34ca8120862513d58dbb33f34f4375b7bea3d340a0766edde2493552ddb77a407d58def43f9d9721f0f3bc8133b3bf34e40d5bc605a5de015d6ac7f

生成されたランダム値を「secrets.yml」の「secret_key_base: <%= ENV[“SECRET_KEY_BASE”] %>」へ直接記述するか、「~/.bash_profile」の最終行あたりに下記を記述。

$ sudo vi ~/.bash_profile
export SECRET_KEY_BASE='生成したランダム値'

下記コマンドで再読み込みします。

$ source ~/.bash_profile

上記以外の方法では、dotenvというgemを使うやり方もあるようです。興味があったら調べてみてください。

The page you were looking for doesn’t exist.と出てしまう場合

productionでアプリを起動すると、デフォルトでは「The page you were looking for doesn’t exist.」と表示されます(参考railsアップをproduction serverでデプロイしたら、 ActionController::RoutingError (No route matches [GET] “/”): – QA@IT)。

確認するだけであれば、publicディレクトリにindex.htmlを作成すればOKです。

ただ、それ以外の対処法は、私の手元の環境では解決できませんでした。nginx, Unicornの問題ではなく、単純にRuby on Ralisをproductionで動作させる設定がきちんとできていないせいだと思います。

今はしかたなくdevelopmentで動作させていますが、productionできちんと動作できるようになったら本記事に追記いたします。

まとめ

Unicornを使ってRuby on Railsをnginxで動作することができました。

productionで動作させるといろいろとエラーが出てしまいました。とりあえず動かしたいのであれば、developmentでOKかと思います。

nginx上でRuby on Railsを動かしたい方の参考になれば幸いです。

この記事が気に入ったら
いいね ! しよう

Twitter で
LINEで送る
Pocket

okutani (@okutani_t) のヒトコト
CentOS7、nginx、unicorn、Ruby on Railsと、様々な知識がないとアプリを動かすこともやっとですね。。やっとサーバーに慣れてきたので、もっといろいろいじってみていこうかと思います。

 - nginx, Ruby on Rails

スポンサーリンク

PC用AdSense

PC用AdSense

Share
  • このエントリーをはてなブックマークに追加

  こちらの関連記事もどうぞ

CentOS7にnginxを導入&初期設定まとめ

こんにちは、okutani(@okutani_t)です。本記事では、高速で軽量な …

CentOS7+nginxでPHPを利用する方法(PHP-FPM)

こんにちは、okutani(@okutani_t)です。前回の「CentOS7に …

nginxでベーシック認証をかける方法

こんにちは、okutani(@okutani_t)です。本記事ではオープンソース …

CentOS7にRuby on Railsを導入する方法

こんにちは、okutani(@okutani_t)です。本記事ではCentOS7 …

nginxでhttps!自己署名証明書でSSL設定してみよう

こんにちは、okutani(@okutani_t)です。本記事では、「nginx …

vdeepのトップページへ戻る画像です。風船の形をした島を女の子が掴んでいます。