RubyOnRails

Aus Hostsharing Wiki
Version vom 26. August 2012, 15:29 Uhr von Srv00-wiki (Diskussion | Beiträge) (init)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Ruby on Rails bei Hostsharing

Um Probleme mit den Benutzerrechten von vorne herein auszuschließen, läuft Ruby (wie alle Anwendungen bei Hostsharing) mit den Rechten des jeweiligen Useraccounts. Die Ausführung erfolgt in den Webpaketen standardmäßig über die FastCGI Schnittstelle des Apache Webservers.

Für den Betrieb von sehr anspruchsvollen Anwendungen haben wir auch Tools wie haproxy, varnish, nginx etc. installiert. Wir können auch mod_passenger (mod_wsgi haben wir schon) oder mongrel oder Green Unicorn (gunicorn) installieren. Anwender, die solche Tools auf unserer managed Plattform nutzen wollen, brauchen dafür nur eigene Daemons buchen.


Vorbereitungen

Einige Einstellungen für den Paketuser.

~/.gemrc

install: --no-rdoc --no-ri
update:  --no-rdoc --no-ri


~/.bashrc

alias gem="nice -n19 gem"


Ruby

= Vorinstalliert

Soll nur die zentral installierte Ruby Version verwendet werden legt man eine ~/.profile Datei an, bzw. ergänzt eine vorhanden ~/.bashrc:

# keep user's own ruby stuff below $HOME/ruby
export PATH="$HOME/bin:$HOME/ruby/.gem/bin:$PATH"
export RUBYLIB="$HOME/ruby/lib:$RUBYLIB"
export GEM_HOME="$HOME/ruby/.gem"
export GEM_PATH="$GEM_HOME:$( gem env gempath )"
export RAILS_ENV=production
# avoid to require an extra parameter: ruby -rubygems prog_that_uses_gems
export RUBYOPT=rubygems

Eigene Installation

Um eine andere als die vorinstallierte Ruby Version zu verwenden, istalliert man zunächst den Ruby Versions Manager (rvm),

curl -L https://get.rvm.io | bash -s stable
source ~/.rvm/scripts/rvm
rvm notes
rvm requirements
rvm pkg install openssl


und lässt dann die gewünschte Ruby Version installieren.

rvm install x.y.z

RVM passt die Umgebungsvariablen automatisch an die ausgewählt Version an. Die Version wählt man global per

rvm use x.y.z --default

oder nur für ein spezielles Verzeichnis:

cd ~/verzeichnis/mit/ruby-x.y.z-Anwendung
rvm use x.y.z-p??? --rvmrc

Zur Verwaltung von gems installiert man noch rubygems.

rvm rubygems current


Rails

Nun kann Rails einfach durch installieren des gem-Pakets (mit seinen Abhängigkeiten) installiert werden.

gem install rails


Einrichtung

Rails-Anwendung

Seine Rails-Anwendung kopiert man Beispielweise in ~/rails, oder erstellt dort einen Neue (rails ~/rails, ...).

Datenbank

Mit hsadmin einen Postgres-User (z.B. 'xyz00_rails', Passwort sei 'geheim') und eine Datenbank anlegen (z.B. 'xyz00_rails'.

Die Datenbank konfigurieren,

 cd ~/rails-app/config/
 nano database.yml

mit folgendem Inhalt:

 production:
   adapter: postgresql
   database: xyz00_rails
   host: localhost
   username: xyz00_rails
   password: geheim

E-Mail, Dateiablage

Beispielhafte Konfiguration:

 default:
   email_delivery:
     delivery_method: :smtp
     smtp_settings:
       address: localhost
       port: 25
       domain: example.org
   attachments_storage_path: /home/pacs/xyz00/users/rails/attach

Laden von Abhängigkeiten, Datenbankschema

Initialisieren und migrieren der Datenbank je nach Rails-Anwendung.

 cd ~/rails
 ...
 rake ...


Konfiguration von FastCGI

~/doms/rails.example.org/htdocs/.htaccess

 RewriteEngine On
 RewriteRule ^$ index.html [QSA]
 RewriteRule ^([^.]+)$ $1.html [QSA]
 RewriteCond %{REQUEST_FILENAME} !-f [OR]
 RewriteCond %{REQUEST_FILENAME} dispatch.fcgi$
 RewriteRule ^(.*)$ /fastcgi-bin/dispatch.fcgi [QSA,L]

Ältere Versionen von Rails, die noch nicht auf rack middleware aufbauen, laufen mit folgender ~/doms/www.example.org/fastcgi/dispatch.fcgi

 #!/usr/bin/env ruby
 require "/home/pacs/xyz00/users/meinuser/rails/config/environment" 
 require 'fcgi_handler'
 RailsFCGIHandler.process!

Für aktuelle Versionen von Rails, die auf der "rack" Middleware aufbauen, ~/doms/www.example.org/fastcgi/dispatch.fcgi (siehe https://github.com/dre3k/rails3_fcgi)

 #!/usr/bin/env ruby

require_relative '../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
    @app.call(env)
  end
end

Rack::Handler::FastCGI.run  Rack::PathInfoRewriter.new(HIER_APPLIKATIONSNAME_AUS_config/application.rb_EINTRAGEN::Application)


FastCGI-Skript ausführbar machen:

 chmod 755 ~/doms/rails.example.org/fastcgi/dispatch.fcgi


Am Anfang von ~/rails/config/environment.rb einfügen:

 ENV['RAILS_ENV'] ||= 'production'
 ENV['GEM_PATH'] ||= '/home/pacs/xyz00/users/meinuser/ruby/.gem/ruby/1.8:/var/lib/gems/1.8'

Die Inhalte von ~/doms/rails.example.org/public/ als webroot sichtbar machen:

 # Vorhandene Dateien sichern. (Alternativ in ~/rails/public kopieren)
 mv ~/doms/rails.example.org/htdocs ~/doms/rails.example.org/htdocs.old
 ln -s ~/rails/public ~/doms/rails.example.org/htdocs

Konfiguration von SSL

Die Verzeichnisse ~/doms/rails.example.org/fastcgi-ssl/ und ~/doms/rail.example.org/htdocs-ssl/ werden analog zu bzw. anstelle von fastcgi und htdocs gefüllt.