CentOS+Rails4+Apache2.2でPumaを設定する

備忘を兼ねて、CentOS 6.6, Apache 2.2.15, Ruby 2.1.5-p273, Rails 4.2.0, Puma 2.10.2 でサービスを動かす際の設定や実行方法について書いておく。
ApacheやRailsのインストールは完了している前提なので注意。

環境情報

Ruby, Rails, RubyGems

% rake about
About your application's environment
Rails version        4.2.0
Ruby version         2.1.5-p273 (x86_64-linux)
RubyGems version     2.4.4
Rack version         1.5

Puma

% puma --version
puma version 2.10.2

Apache

% /usr/sbin/httpd -v
Server version: Apache/2.2.15 (Unix)
Server built:   Oct 16 2014 14:48:21

CentOS

% inxi -SM
System:    Host: hakone.vps.sakura.ne.jp Kernel: 2.6.32-431.1.2.0.1.el6.x86_64 x86_64 (64 bit)
           Console: tty 1 Distro: CentOS release 6.6 (Final)
Machine:   System: Red Hat product: KVM v: RHEL 6.4.0 PC
           Mobo: N/A model: N/A Bios: Sea v: 0.5.1 date: 01/01/2007

Railsアプリの作成からPumaのインストール

通常通りRailsアプリを作成し、GemfileへPumaのgemをインストールするよう記載。

Railsアプリ作成

% rails new MYAPP
% cd MYAPP
% bundle exec rails runner 'puts Rails.root'
/PATH/TO/MYAPP

Pumaインストール

% echo "gem 'puma', group: :development" >> Gemfile
% bundle install

Pumaの初期設定と設定ファイル作成

Pumaのpid等ファイルを置く場所を作る

% mkdir -p tmp/pids
% mkdir -p tmp/sockets

config/puma.rb

以下の内容でconfig/puma.rbを作成する。

require 'active_support'
require 'active_support/core_ext'

rails_root = Dir.pwd

unless ENV['RACK_ENV'] == 'production'
  environment ENV['RACK_ENV'] || 'development'
  daemonize true  # デーモン化

  workers 0  # 1以上を指定するとCluster化する
  threads 0,2  # スレッド数(最小, 最大)

  bind 'unix://' + File.join(rails_root, 'tmp', 'sockets', 'puma.sock')  # /PATH/TO/MYAPP/tmp/sockets/puma.sock
  port 9293  # Port番号

  pidfile File.join(rails_root, 'tmp', 'pids', 'puma.pid')  # /PATH/TO/MYAPP/tmp/pids/puma.pid
  state_path File.join(rails_root, 'tmp', 'puma.state')  # /PATH/TO/MYAPP/tmp/puma.state

  stdout_redirect(  # pumaのログをlog/以下に出力する。trueは追記モード。
    File.join(rails_root, 'log', 'puma.log'),
    File.join(rails_root, 'log', 'puma-error.log'),
    true
  )

  # pumactlのトークンを指定 via. http://qiita.com/takkkun/items/ecdee7e7dec1bcc9a5b5
  activate_control_app('auto', auth_token: rails_root.camelize.parameterize)
end

起動できるか試してみる

% pumactl --config-file config/puma.rb start
Puma starting in single mode...
* Version 2.10.2 (ruby 2.1.5-p273), codename: Robots on Comets
* Min threads: 0, max threads: 2
* Environment: development
* Daemonizing...

起動できた。

ApacheをWebサーバとしてPumaへアクセスできるよう設定

バーチャルホストを利用している。virtualhost_MYAPP.confはドメイン(Railsアプリ)毎に作成し、puma-confは共通なので一度作成すれば良い。なお、puma-confpuma.confではないので注意。これは置いてあるディレクトリの性質上.confとすると自動的にIncludeされてしまうためだ。(他の良い方法あればコメントほしい)

大元の設定ファイルを含めて3ファイルのInclude関係は以下の通り。ここでは大元のhttpd.confの内容は割愛するが、バーチャルホストを利用すること以外は通常のものと変わりない。

conf/httpd.conf
  -(include)-> conf.d/virtualhost_MYAPP.conf
    -(include)-> conf.d/puma-conf

virtualhost_MYAPP.conf

Railsアプリのアプリケーションサーバ(Puma)へ接続するためのリバースプロキシ設定をバーチャルホストとして設定する。

# -*- coding: utf-8; mode: conf; -*-

##
# MYAPP
#
<virtualhost *:80>
    DocumentRoot "/PATH/TO/MYAPP/public" # Railsアプリのpublicディレクトリを指定
    ServerName myapp.example.com  # Railsアプリのドメインを指定

    RewriteLog logs/MYAPP-rewrite_log
    RewriteLogLevel 1
    ErrorLog logs/MYAPP-error_log
    CustomLog logs/MYAPP-access_log combined env=!no_log

    SetEnv RACK_ENV developmen  # Railsアプリの実行環境(development/test/production)

    # for puma config
    include conf.d/puma-conf  # ここでPuma共通設定ファイルを読み込んでいる
    RewriteRule ^/(.*)$ http://0.0.0.0:9293%{REQUEST_URI} [P]  # '9293'のところにはconf/puma.rbで指定したPort番号を設定

    <directory "/PATH/TO/MYAPP/public">
        AllowOverride All
        Options FollowSymLinks -MultiViews
        Order deny,allow
        Allow from all
    </directory>

</virtualhost>

puma-conf

共通で使うpuma-confファイル。パスの変換や静的ファイルはApacheで処理することなどが書かれている。

# -*- coding: utf-8; mode: conf; -*-

    # Redirect all requests that don't match a file on disk
    # under DocumentRoot get proxied to Puma
    RewriteEngine On
    RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f

    # Don't allow client to fool Puma into thinking connection is secure
    RequestHeader unset X-Forwarded-Proto

    # Disable ETags (https://github.com/h5bp/server-configs-apache/tree/master/doc#configure-etags)
    # Set Expiration date for all assets to one year in the future
    <locationmatch "^/assets/.*$">
        Header unset ETag
        FileETag None

        ExpiresActive On
        ExpiresDefault "access plus 1 year"
    </locationmatch>

    # Rewrite requests for js and css to gzipped versions
    # if client and server support it
    <locationmatch "^/assets/.*\.(css|js)$">
        RewriteEngine on
        RewriteCond %{HTTP:Accept-Encoding} \b(x-)?gzip\b
        RewriteCond %{REQUEST_FILENAME}.gz -s
        RewriteRule ^(.+)$ $1.gz
    </locationmatch>

    # Set type and headers for gzipped css
    <locationmatch "^/assets/.*\.css\.gz$">
        ForceType text/css
        Header set Content-Encoding gzip
        Header add Vary Accept-Encoding
    </locationmatch>

    # Set type and headers for gzipped js
    <locationmatch "^/assets/.*\.js\.gz$">
        ForceType application/javascript
        Header set Content-Encoding gzip
        Header add Vary Accept-Encoding
    </locationmatch>

    # Compress HTML on the fly
    AddOutputFilterByType DEFLATE text/html

Apacheを再起動してアクセスしてみる

これら設定ファイルが用意できたら、設定ファイルをテストして問題無ければApacheを再起動する。

% sudo /etc/init.d/httpd configtest
Syntax OK
% sudo /etc/init.d/httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

これで、ServerNameに設定したmyapp.example.comへブラウザでアクセスしてみて見慣れたRailsアプリのTOPページが表示されればOKだ。

まとめ

CentOS, Apache2.2, Rails4の環境でアプリケーションサーバPumaを利用するための一連の手順を書いてみた。
config/puma.rbは同じサーバで動く別アプリとPort番号が被らないように設定すれば使い回しができるようにしてあるので、テンプレートにしてみても良いかもしれない。もっと良い方法などあればコメント等で教えてもらえると嬉しい。

では、Enjoy Ruby! Enjoy Rails!

参考リンク

スポンサード

Rails4+Paperclip(ImageMagick)のサムネイルサイズ一覧

20140102

必要だったのでまとめたシリーズ。

Ruby on Railsに画像アップロード機能を実装する際のデファクトスタンダードであるPaperclipには、ImageMagickと連携してサムネイル画像を自動生成する機能がある。

サムネイル画像のサイズは、Modelクラスに簡単なスタイル記述を追加することで指定可能になるが、使える記号と加工された画像サイズが分かりづらかったので調べてみた。

下記の表にまとめてあるので参考になれば。なお、元の画像は横長(400x200px)と縦長(200x400px)の2種類を用意し、それぞれ同じスタイル指定でサムネイル加工している。

スタイル指定とサムネイル加工の動作対応表

スタイル指定 400×200 200×400 備考
100×100 100×50 50×100 100×100>と同じ
100×100! 100×100 100×100 アスペクト比を無視して強制的にサイズを合わせる
100×100> 100×50 50×100 長辺が指定サイズに合うように縮小しアスペクト比は維持する
100×100^ 200×100 100×200 短辺が指定サイズに合うように縮小しアスペクト比は維持する
100×100# 100×100 100×100 短辺が指定サイズに合うように縮小し中央を切り取ってもう一辺も合わせる

実際にサムネイル化された画像を含めて示すと以下。

元画像とサムネイル画像加工後対応表

スタイル指定 元画像(400×200)
400x200
元画像(200×400)
200x400
100×100 400x200_square 200x400_square
100×100! 400x200_square_ignore_aspect 200x400_square_ignore_aspect
100×100> 400x200_square_adjust_longer 200x400_square_adjust_longer
100×100^ 400x200_square_adjust_shorter 200x400_square_adjust_shorter
100×100# 400x200_square_croped_center 200x400_square_croped_center

スポンサード