rails under “production” もろはし moronatural@gmail.com http://d.hatena.ne.jp/moro/ 帰属 2.1 日本
rails アプリを"production"で動かす scaffold で雛型生成。 script/server でlighttpdを起動。 test/*で楽々TDD。 ・・できた!! で、そのあとは・・・?
fcgiを使ってrailsアプリを動かす いろんな選択肢が。 apache ←→ lighttpd 全サーバ同居 ←→ サーバの分離 単一アプリ ←→ multiple アプリ
apacheで動かす mod_fastcgi.soはあらかじめロードしておく。 Add-handler fast-cgi .fcgi もやっておく。 ポイントはdispatch.fcgiの呼び出しと fcgiプロセスの起動 httpd.conf DocumentRoot /var/webapp/saihu/current/public FastCgiServer /var/webapp/saihu/current/public/dispatch.fcgi \ -initial-env RAILS_ENV=production \ -initial-env RAILS_ROOT=/var/webapp/saihu/current \ -processes 2 public/.htaccess RewriteRule ^$ index.html [QSA] RewriteRule ^([^.]+)$ $1.html [QSA] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
lighttpdで動かす config/lighttpd.confを参考に こちらのポイントも404時のdispatch.fcgiの 呼び出し(error-handler-404)と fcgiプロセスの起動 lighttpd.conf server.modules = \ ( "mod_rewrite", "mod_accesslog", "mod_fastcgi" ) server.error-handler-404 = "/dispatch.fcgi" server.document-root = "public/" fastcgi.server = ( ".fcgi" => ( "localhost" => ( "min-procs" => 1, "max-procs" => 1, "socket" => "log/fcgi.socket", "bin-path" => "public/dispatch.fcgi", "bin-environment" => ( "RAILS_ENV" => "production" ) )))
apacheでAPサーバを分ける DocumentRootの設定は前と同様に。 FastCgiExternalServerディレクティブを使う httpd.conf FastCgiExternalServer \ /var/webapp/saihu/current/public/dispatch.fcgi \ -host my_ap_server:7000 APサーバ側ではあらかじめfcgiプロセスを 起動しておく $ ruby script/process/spinner -c \ 'ruby script/process/spawner -p 7000' your shell
lighttpdでAPサーバを分ける こちらもAPサーバはあらかじめ起動しておく。 “port”はクォート'”'不要。 RAILS_ENVの制御はAPサーバ側で。 lighttpd.conf fastcgi.server = ( ".fcgi" => ( "localhost" => ( "host" => “my_ap_server”, "port => 7000 ) )) your shell $ ruby script/process/spinner -c \ 'ruby script/process/spawner -p 7000'
apacheで複数アプリ共存 Aliasを使ってrailsアプリのpublicを指定 httpd.conf Alias /saihu /var/webapp/saihu/current/public railsアプリ側のpublic/.htaccessで RewriteBaseを指定 httpd.conf RewriteBase /saihu RewriteRule ^$ index.html [QSA] RewriteRule ^([^.]+)$ $1.html [QSA] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
lighttpdで複数アプリ共存(1) alias.urlでaliasを設定 http://myhost/saihu へのアクセス時に、 専用の404ハンドラを設定(ポイント(1)) 上記で設定したハンドラへのアクセスで fcgiプロセスを呼び出すように lihttpd.conf alias.url = ( "/saihu" => "/var/webapp/saihu/current/public" ) $HTTP["url"] =~ "^/saihu/" { server.error-handler-404 = "/saihu/dispatch.fcgi" } fastcgi.server = ( "/saihu/dispatch.fcgi" => (( "host" => "192.168.10.2" , "port" => 7000 , )))
lighttpdで複数アプリ共存(2) rails側には/saihu/controller/actionというrequest が渡るので、"/saihu"は無視するよう設定 (ポイント(2)) config/environment/production.rb ActionController::AbstractRequest.relative_url_root = "/saihu" lighttpd-1.4.8 以降 fastcgi.server内で ”strip-request-uri"という設定が可能。 →画像やCSSへのリンクが/imagesになるので 注意を。(/saihu/imagesではない)
ご静聴ありがとうございました おわり (id:osakanasさん、ありがとうございました) 【参考 - lightyの設定】 http://blog.lighttpd.net/articles/2005/11/23 /lighttpd-1-4-8-and-multiple-rails-apps (id:osakanasさん、ありがとうございました)