備忘を兼ねて、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-confはpuma.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!
参考リンク
- 【Rails 4.1】APサーバー環境構築[Mac OS X 10.9.2 Marverick] – 株式会社へんてこらぼ
- pumaでコントロールサーバを使うときはトークンをつけた方が良いよ – Qiita
- Apache and Puma and Rails Configuration