タイトルの通りの内容で、さくらレンタルサーバーでRailsは糞遅いというお話です。
経緯
ホームページを作成する案件があって、それに付随するプログラムの開発がありました。
ホームページを動作させるのがメインだったので、レンタルサーバーが選択されました。
個人的にPHPが嫌い(Java育ちなのでPHPの曖昧さがなじめない)なのでそれ以外の言語はないのかとRubyを選択しました。
初めてのRuby on Railsでしたが、Java経験者からすると今までにない感じのプログラミングだったので、非常に楽しくワクワクしながら開発できました。
Ruby on Rails動作環境構築
さて、ひと通り出来上がったのでテストしてもらうために、動作環境であるレンタルサーバーにRuby on Railsが動作する環境を構築しました。
事前に動作するというのは確認できていたので、いろんなサイトを参考にしながら試行錯誤で環境を構築しました。
この時点で、レスポンスが遅いというのは情報として知ってました。
でも、本当に遅いのかというのがわからなかったのと、FCGIだと速いという情報もあったので大丈夫だろうと思ってました。
デプロイ
環境の構築も完了したのでデプロイしていました。
トップページにアクセスしてみると、なかなか画面が表示されません。
何度やっても遅い、遅い、遅い。
確か画面表示に10秒以上かかってたと思います。
「これはあかん」ということで、PHPで最初から作りなおしました…。
構築手順
かなり日にちが経っててよく覚えてませんが、当時のメモをそのまま載せておきます。ものすごく適当です。
お遊びで構築したい人向けです。間違っても本番運用しないで下さい。泣くのは開発者であるあなたです。
1.wwwディレクトリと同階層にappディレクトリを作成する
2.appディレクトリにRailsプロジェクトを配置する
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" # rake secretで生成したもの 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' ], } ],
FCGI対応
$ 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 #### $ gem install fcgi -- --with-fcgi-include=$HOME/local/include --with-fcgi-lib=$HOME/local/lib $ 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
まとめ
さくらレンタルサーバーでは、Ruby on Railsは動作するが、レスポンスが糞遅いのでやめましょう。
レンタルサーバーというと全てのサーバーをイメージされると思いますが、root権限のない制約のあるレンタルサーバーのことです。
さくらのVPS等root権限のあるサーバーでは、普通に動作しますので勘違いされないようにお願いします。
開発時に参考にしたサイト
- rbenvでRubyを管理し、Rails開発環境を構築する | mae's blog
- Ruby の gem をプロジェクト毎に Bundler で管理する - fugafuga.write
- 【Mac】Ruby on Railsの環境構築とbundlerについて - TASK NOTES
- bundler経由でmysql gemを入れるときの--with-mysql-configの指定方法 - There's an echo in my head
- mysql - I can't run "bundle update" because of "mysql2" gem - Stack Overflow
- ruby on rails - Gem::LoadError for mysql2 gem, but it's already in Gemfile - Stack Overflow
Ruby on Rails 4 アプリケーションプログラミング
- 作者: 山田祥寛
- 出版社/メーカー: 技術評論社
- 発売日: 2014/04/11
- メディア: 大型本
- この商品を含むブログ (5件) を見る
- 作者: すがわらまさのり,前島真一,近藤宇智朗,橋立友宏
- 出版社/メーカー: 技術評論社
- 発売日: 2014/10/31
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
- 作者: 高橋征義,後藤裕蔵,まつもとゆきひろ
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/02/26
- メディア: 単行本
- この商品を含むブログ (1件) を見る