CentOS7+nginxでRuby on Railsを利用する(Unicorn)
2017/01/31
こんにちは、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になっていますが無視してください)。
アプリ起動時に画面が真っ白になってしまう場合
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を動かしたい方の参考になれば幸いです。
Web開発のお仕事を募集しています
フリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。
「Ruby on Rails」「JavaScript(jQuery, Reactなど)」「HTML + CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。
ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。
LINKお問い合わせ
スポンサーリンク