rails5+puma+nginxで本番環境を構築してみる

本番環境でのrailsアプリケーションはunicorn+nginxで構成していました。
herokuがunicornではなくpumaを今後推奨していく流れや、rails5でpumaが標準搭載になった流れから、今回本番環境をpuma+nginxで構築しました。
その備忘録を記述したいと思います。

pumaって何よ?

ここ参照
[blogcard url=”http://qiita.com/kompiro/items/223bb04c2f009787eea8″][/blogcard]

http://puma.io/ で公開されているconcurrentなWebサーバー。thinやunicornはワーカー毎にプロセスを立ち上げるが、pumaはワーカー毎にスレッドを立ち上げる。production環境ではサイトのパフォーマンスを上げるため、複数のワーカーを立ち上げるが、thinやunicornはワーカー毎にプロセスが異なるため、排他処理ができない。しかし、pumaはスレッドで動作するため、Mutexでsynchronizeブロックを記述すれば、排他処理を行える。

なんか良さげですね。スレッドベースで立ち上がるってことは並列処理してくれる感じでしょうか。
まぁ、今回は一旦構築するというだけで、細かな設定などは行いません。

構成

今回は下記構成上で本番環境を構築します。

Ubuntu
rails5
postgreSQL

構築する

pumaの設定

rails5アプリケーションを作成すると、configフォルダ配下にpuma.rbというファイルが作成される。
そのファイルを下記のように追記編集する。

#ここから
#_homeは各自環境で設定してください。
_proj_path = "#{File.expand_path("../..", __FILE__)}"
_proj_name = File.basename(_proj_path)
_home = ENV.fetch("HOME") { "/home/gaku" }

pidfile "#{_home}/run/#{_proj_name}.pid"
bind "unix://#{_home}/run/#{_proj_name}.sock"
directory _proj_path
#ここまで追記
# Puma can serve each request in a thread from an internal thread pool.
# The `threads` method setting takes two numbers a minimum and maximum.
# Any libraries that use thread pools should be configured to match
# the maximum value specified for Puma. Default is set to 5 threads for minimum
# and maximum, this matches the default thread size of Active Record.
#
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count

# Specifies the `port` that Puma will listen on to receive requests, default is 3000.
#
port        ENV.fetch("PORT") { 3000 }

# Specifies the `environment` that Puma will run in.
#
environment ENV.fetch("RAILS_ENV") { "development" }

# Specifies the number of `workers` to boot in clustered mode.
# Workers are forked webserver processes. If using threads and workers together
# the concurrency of the application would be max `threads` * `workers`.
# Workers do not work on JRuby or Windows (both of which do not support
# processes).
#
# workers ENV.fetch("WEB_CONCURRENCY") { 2 }

# Use the `preload_app!` method when specifying a `workers` number.
# This directive tells Puma to first boot the application and load code
# before forking the application. This takes advantage of Copy On Write
# process behavior so workers use less memory. If you use this option
# you need to make sure to reconnect any threads in the `on_worker_boot`
# block.
#
# preload_app!

# The code in the `on_worker_boot` will be called if you are using
# clustered mode by specifying a number of `workers`. After each worker
# process is booted this block will be run, if you are using `preload_app!`
# option you will want to use this block to reconnect to any threads
# or connections that may have been created at application boot, Ruby
# cannot share connections between processes.
#
# on_worker_boot do
#   ActiveRecord::Base.establish_connection if defined?(ActiveRecord)
# end

# Allow puma to be restarted by `rails restart` command.
plugin :tmp_restart

pumaの設定はこれだけです。

nginxの設定

nginxを設定していきます。まだインストールしていない場合は下記コマンドでインストールします。

sudo apt-get install -y nginx

設定ファイルを/etc/nginx/conf.d/の配下に作成します。
ファイル名は何でも良いです。わかりやすいようにアプリケーション名で作成してあげれば良いかと思います。

upstream TranslateEroticVideoSite_Rails {
    # railsのアプリケーション名とhome/gakuを各自編集してください。
    server unix:/home/gaku/run/TranslateEroticVideoSite_Rails.sock fail_timeout=0; 
}

server {
    listen 80;
    server_name 127.0.0.1; # 本番環境のipアドレスもしくはホスト名を記述

    root /path/to/TranslateEroticVideoSite_Rails/public; # アプリケーション名を記述

    try_files $uri/index.html $uri @TranslateEroticVideoSite_Rails; # アプリケーション名を記述

    location / {
        proxy_pass http://TranslateEroticVideoSite_Rails; # アプリケーション名を記述
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }

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

上記設定ファイルを記述しましたら、nginxを再起動しておきましょう。

sudo service nginx restart

起動してみる

この状態だと、sockファイルを格納するフォルダが存在しないと怒られるため、今回の場合/home/gaku配下にrunフォルダを作成します。

cd /home/gaku
mkdir run

これで準備完了です。
pumaをdevelop環境で起動する場合は下記コマンドを

puma -w 4

pumaをproduction環境で起動する場合は下記コマンドを記述し実行する。

rails assets:precompile RAILS_ENV=production
SECRET_KEY_BASE=$(rake secret) RAILS_SERVE_STATIC_FILES=true RAILS_ENV=production puma -w 4

(※4はスレッドの数です。)

おわり(‘◇’)ゞ

おわりに

比較的簡単にpuma+nginx環境を構築することが可能でした。
unicorn+nginxの場合はいろいろ設定しないといけませんでしたが、rails5になって各段に簡単になりましたね。
今後、railsアプリケーションを本番環境で構築する場合はpuma+nginxで決まりです!( ゚Д゚)

天下のAppleはもう終わりなのか

9月7日にApple Special Eventで新しいiPhoneとApple Watchの発表がありました。

結局、僕は起きてライブを見るか悩んだあげく寝ちゃったんですが、、、

今回の発表のまとめ記事は以下
[blogcard url=”http://www.lifehacker.jp/2016/09/160908apple_special_event.html”][/blogcard]

これじゃないんだよAppleさん

ほんとね。

発表された機能は、日本のガラケー時代(5年前以上)にはすでにあった機能ばかり。
今更感が半端ないです。
それを表したTwitterの投稿が話題です。

[blogcard url=”https://twitter.com/seibuensen/status/773652964019884032″][/blogcard]
「防水」「おサイフケータイ」「イヤフォンジャックなし」。。。

あと、薄さに拘りすぎてるんだよ。
そりゃ、スティーブジョブスがMacBookAirの発表をしたあの時、僕はものすごく感動しましたよ。

「ノートパソコンでこの薄さ!このスペック!買いだな!」

本当そう思いました。今でもMacBookAirは僕の愛用機です。

ただ、iPhoneに限っては違います!薄さを重視してiPhone6は曲がるとか言われていました。
ユーザはもうiPhoneに薄さを求めてません。
薄さはiPhone4で完成されたのです。
むしろ、薄くしすぎたため壊れやすい印象から、厚さを求めてるんじゃないかと思ったりしてます。

iPhoneSEもスペックは変われどiPhone4からスタイルは何も変わってないし、、、

これぐらいの発表があれば「Apple復活したな」と思ったものですが。。。
[blogcard url=”https://www.youtube.com/watch?v=xIZY7RgRVWU”][/blogcard]

スティーブジョブスが亡き今、Appleはイノベーションを起こせないのか

悲しいです。昔はAppleの発表があれば本当にわくわくしたものです。
スティーブジョブスが亡くなってから、「今回こそは、今回こそは」といつも思ってました。
でも、今回の発表でもう思わないでおこうと心に固く誓った発表会でした。

じゃあ、Apple信者やめんの?

やめません。

というか、やめれません!

結局Apple製品の使いやすさを考えると徐々に移行していくという感じになると思います。
やっぱり現状は使いやすいApple製品であり、他はそこそこといった感じだからです。

おわりに

僕が本当に望んでいるのは、11インチMacBookAirのスペックそのままで、retinaディスプレイを採用した製品です。
それだったら15万出しても良いです。
MacBookとかいう糞スペックバカ高い製品を出す前にMacBookAirのretina化を進めてください、お願いします。