タイトルの通りの内容で、さくらレンタルサーバーでRailsは糞遅いというお話です。
経緯
ホームページを作成する案件があって、それに付随するプログラムの開発がありました。
ホームページを動作させるのがメインだったので、レンタルサーバーが選択されました。
個人的にPHPが嫌い(Java育ちなのでPHPの曖昧さがなじめない)なのでそれ以外の言語はないのかとRubyを選択しました。
初めてのRuby on Railsでしたが、Java経験者からすると今までにない感じのプログラミングだったので、非常に楽しくワクワクしながら開発できました。
さて、ひと通り出来上がったのでテストしてもらうために、動作環境であるレンタルサーバーにRuby on Railsが動作する環境を構築しました。
事前に動作するというのは確認できていたので、いろんなサイトを参考にしながら試行錯誤で環境を構築しました。
この時点で、レスポンスが遅いというのは情報として知ってました。
でも、本当に遅いのかというのがわからなかったのと、FCGIだと速いという情報もあったので大丈夫だろうと思ってました。
デプロイ
環境の構築も完了したのでデプロイしていました。
トップページにアクセスしてみると、なかなか画面が表示されません。
何度やっても遅い、遅い、遅い。
確か画面表示に10秒以上かかってたと思います。
「これはあかん」ということで、PHPで最初から作りなおしました…。
構築手順
かなり日にちが経っててよく覚えてませんが、当時のメモをそのまま載せておきます。ものすごく適当です。
お遊びで構築したい人向けです。間違っても本番運用しないで下さい。泣くのは開発者であるあなたです。
1.wwwディレクトリと同階層にappディレクトリを作成する
2.appディレクトリにRailsプロジェクトを配置する
3.Rails/publicに.htaccessを作成する
RewriteEngine On
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
ErrorDocument 500 "Application errorRails application failed to start properly"
4.Rails/publicにdispatch.cgiを作成し、権限を755にする
#!/home/user/local/rbenv/versions/2.2.3/bin/ruby
ENV["RAILS_ENV"] = "production"
ENV["SECRET_KEY_BASE"] = "7cd8a5e38cfeddd0d0a4b45ad4bf75fd2cffe124f43388c34e6f29cf2c2e78f7d9cc1b2003f913be65c54f6ec61c7032609d3c9d88d6b3dc5226925a825b8379"
ENV["RAILS_SERVE_STATIC_FILES"] = "true"
require File.dirname(__FILE__) + '/../config/environment'
class Rack::PathInfoRewriter
def initialize(app)
@app = app
end
def call(env)
env.delete('SCRIPT_NAME')
parts = env['REQUEST_URI'].split('?')
env['PATH_INFO'] = parts[0]
env['QUERY_STRING'] = parts[1].to_s
env['PATH_INFO'] = env['PATH_INFO'].gsub(/\A#{ENV['RAILS_RELATIVE_URL_ROOT']}(.*)\Z/, '\1')
env['SCRIPT_NAME'] = ENV['RAILS_RELATIVE_URL_ROOT']
@app.call(env)
end
end
Rack::Handler::CGI.run Rack::PathInfoRewriter.new(Hoge::Application)
5.Rails/config/boot.rbに以下を追記する
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
$LOAD_PATH.push('/home/user/local/rbenv/versions/2.2.3/lib/ruby/2.2.0')
$LOAD_PATH.push('/home/user/local/rbenv/versions/2.2.3/lib/ruby/site_ruby/2.2.0')
$LOAD_PATH.push('/home/user/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0')
$LOAD_PATH.push('/home/user/local/rbenv/versions/2.2.3/lib/ruby')
$LOAD_PATH.push('/home/user/local/rbenv/versions/2.2.3/lib')
ENV['PATH'] += ':/home/user/local/bin'
ENV['GEM_HOME'] ||= '/home/user/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0'
ENV['RAILS_RELATIVE_URL_ROOT'] = '/hoge'
6.静的ファイルをプレコンパイルする
rake assets:precompile RAILS_ENV=production
7.node.jsを編集する
/local/src/node-v0.10.38/deps/v8/tools/gyp/v8.gyp
['OS=="freebsd"', {
'include_dirs+':[
'/home/user/local/include'
],
'link_settings': {
'libraries': [
'-L/usr/local/lib -L${HOME}/local/lib -lexecinfo',
]},
'sources': [
'../../src/platform-freebsd.cc',
'../../src/platform-posix.cc'
],
}
],
$ cd ~/local/src
$ wget http://www.fastcgi.com/dist/fcgi.tar.gz
$ tar xvzf fcgi.tar.gz
$ cd fcgi-2.4.1-SNAP-0311112127
$ ./configure --prefix=$HOME/local CFLAGS="-g -O2 -Wall -fPIC" CXXFLAGS="-g -O2 -Wall -fPIC"
$ make
$ make install
$ cd ~/appdir
$ bundle exec gem install fcgi -- --with-fcgi-include=$HOME/local/include --with-fcgi-lib=$HOME/local/lib
$ vi Gemfile
追記 gem 'fcgi'
$ bundle update