Version 1.4, April 2008 [Changelog]

Abstract

Dieser Artikel ist eine Schritt-für-Schritt Anleitung zur Installation des beliebten Webframeworks Ruby on Rails auf einem Homepage-Server (und natürlich auch Managed-Server und Exklusiv-Server) des Providers 1&1. Dabei werden verschiedene Varianten vorgestellt, wie eine auf Ruby on Rails basierende Applikation ausgeliefert werden kann.

Caution Der Artikel wurde nach bestem Wissen und Gewissen geschrieben und überprüft. Ich übernehme jedoch keinerlei Haftung für Schäden, die durch Ausführung der in diesem Artikel aufgeführten Kommandos entstehen oder entstanden sind.

Voraussetzungen

Es wird angenommen, dass der Leser dieses Artikels zumindest Grundkenntnisse im Umgang mit Linux und der Bash besitzt. Die Kenntnis des “Dreisprungs” (./configure && make && make install) ist vorteilhaft, ebenso wie grundlegendes Verständnis von Ruby on Rails.

Aus Praktikabilitätsgründen sollte jede Domain bzw. Rails Anwendung, die auf dem Server gehostet wird, in einem eigenen DocumentRoot gespeichert werden, zugewiesen. Der Domain rails.example.com sollte das Verzeichnis

Tip Wer es gar nicht erwarten kann, findet im Anhang eine Quickstart-Anleitung.

Installation zusätzlicher Software

Um Ruby on Rails nutzen zu können, müssen einige Programme und Bibliotheken nachinstalliert werden. Die Programme und Bibliotheken werden im Verzeichnis konfiguriert werden kann, so dass der Apache httpd keinen Zugriff auf die darin enthaltenen Dateien hat.

Ruby

Ruby on Rails benötigt Ruby 1.8.2 oder höher. Im Gegensatz zur vorigen Betriebsumgebung ist auf den Homepage-Servern inzwischen Ruby 1.8.5 vorinstalliert ist, was für den Betrieb von Ruby on Rails ausreicht.

RubyGems

RubyGems ist das Gegenstück zu CPAN (Perl) oder PEAR (PHP). Es vereinfacht die Installation einzelner Ruby Bibliotheken, Frameworks oder Programme. RubyGem 0.9.0 ist vorinstalliert, jedoch benötigt Ruby on Rails eine Version >=0.9.4. Aus diesem Grund installieren wir das aktuelle Release RubyGems 1.1.0 in unserem Homeverzeichnis.

mkdir ${HOME}/executable/src/
cd ${HOME}/executable/src/
wget http://rubyforge.org/frs/download.php/34638/rubygems-1.1.0.tgz
tar -xzf rubygems-1.1.0.tgz
cd rubygems-1.1.0
Tip In der Dokumentation von RubyGems ist die Installation als normaler Benutzer beschrieben.

Im nächsten Schritt wird die eigentliche Installation von RubyGems durchgeführt. Die Gems selbst werden in dem Verzeichnis gespeichert, in dem wir zuvor schon Ruby installiert haben.

export GEM_HOME=${HOME}/executable/ruby/gems
ruby setup.rb all --no-rdoc --no-ri --no-format-executable --prefix=${HOME}/executable/ruby --siteruby=${HOME}/executable/ruby

Aus Geschwindigkeitsgründen und weil diese in einer Produktivoumgebung nicht benötigt werden, verzichten wir auf die Installation der RDoc- und RI-Dokumentation. Damit das auch für alle zukünftig installierten Gems gilt, erstellen wir eine Konfigurationsdatei für gem. In dieser werden ebenfalls die Verzeichnisse festgelegt, in denen die Dateien der Gems gespeichert werden.

cat>${HOME}/.gemrc<<EOF
gem: --no-rdoc --no-ri
gemhome: /kunden/homepages/17/d123456789/htdocs/executable/ruby/gems
gempath:
  - /kunden/homepages/17/d123456789/htdocs/executable/ruby/gems
EOF
Note Alle via gem installierten RubyGems können einfach mit dem Kommando gem update aktualisiert werden. Alte Versionen werden dabei nicht automatisch entfernt, sondern müssen mit gem cleanup gelöscht werden.

Ruby on Rails

Die Installation von Ruby on Rails wird durch die RubyGems vergleichsweise einfach. Abhängigkeiten wie Rake werden damit automatisch mitinstalliert.

gem install rails

Optional: FCGI

Je nachdem, wie Ruby On Rails später eingebunden wird, können wir noch die Bibliothek FCGI installieren.

Generell ist der Betrieb von Ruby on Rails über die FastCGI-Schnittstelle sehr zu empfehlen, da hierbei im Gegensatz zum klassischen CGI nicht für jede Anfrage ein eigener Prozess gestartet werden muss. Für Produktivumgebungen ist die Einbindung über FastCGI unbedingt zu empfehlen.

gem install fcgi

Konfiguration

Damit wir bequem in der Shell arbeiten können und nicht bei jedem Login eine Datei namens .profile in unserem Homeverzeichnis mit den notwendigen Einträgen.

cat>>${HOME}/.profile<<EOF
export GEM_HOME="${HOME}/executable/ruby/gems"
export GEM_PATH="${HOME}/executable/ruby/gems"
export RUBYLIB="${HOME}/executable/ruby/lib:/usr/lib/ruby/1.8/"
export PATH="${HOME}/executable/ruby/bin:${HOME}/executable/ruby/gems/bin:${PATH}"
EOF

Einbindung über den Apache

Da Ruby on Rails etwas wählerisch ist, was die URLs angeht, erstellen wir zunächst eine Subdomain namens rails.example.org und weisen dieser das Verzeichnis ~/rails.example.org/public auf dem Homepage-Server zu.

CGI

Prinzipiell muss nichts mehr geändert werden. Die Nutzung via CGI ist sofort nach der Installation möglich. Allerdings ist das auch die bei weitem langsamste Methode und nicht für Produktivsysteme geeignet.

Da wir RubyGems in ein anderes Verzeichnis installiert haben, müssen die Umgebungsvariablen zum richtigen Verzeichnis in der .htaccess gesetzt werden.

AddHandler cgi-script .cgi
Options +FollowSymLinks +ExecCGI

SetEnv GEM_HOME /kunden/homepages/17/d123456789/htdocs/executable/ruby/gems
SetEnv GEM_PATH /kunden/homepages/17/d123456789/htdocs/executable/ruby/gems
SetEnv RUBYLIB /kunden/homepages/17/d123456789/htdocs/executable/ruby/lib:/usr/lib/ruby/1.8

# Alternativ zu der Umgebungsvariablen hier kann die Rails-Umgebung auch in
# der Datei config/environment.rb gesetzt werden.
SetEnv RAILS_ENV production

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

ErrorDocument 500 /500.html

FastCGI

Bei Homepage-Servern besteht die Möglichkeit, Skripte über die FastCGI-Schnittstelle einzubinden. Dieses Feature muss allerdings erst aktiviert werden. Außerdem muss muss das Gem FCGI installiert sein.

Note Informationen zu mod_fastcgi können in der offiziellen Dokumentation gefunden werden.

Inhalt:

AddHandler fastcgi-script .fcgi
AddHandler cgi-script .cgi
Options +FollowSymLinks +ExecCGI

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

ErrorDocument 500 /500.html

Damit die Umgebungsvariablen bei Aufruf des Dispatchers für FastCGI korrekt gesetzt werden, wird ein Wrapperskript benötigt. Die ursprüngliche Datei public/dispatch.fcgi muss dazu in public/dispatch.orig.fcgi umgenannt werden. Der Wrapper wird public/dispatch.fcgi benannt und besitzt folgenden Inhalt:

#!/bin/bash
export GEM_HOME="/homepages/17/d123456789/htdocs/executable/ruby/gems"
export GEM_PATH=${GEM_HOME}
export RUBYLIB="/homepages/17/d123456789/htdocs/executable/ruby/lib:/usr/lib/ruby/1.8"

# Alternativ zu dieser Umgebungsvariablen kann die Rails-Umgebung auch in der
# Datei config/environment.rb gesetzt werden.
export RAILS_ENV="production"

exec ./dispatch.orig.fcgi $@

angepasst werden, wobei im Gegensatz zum Inhalt der Datei ~/.profile auf die

Beispielanwendungen

In diesem Abschnitt werden beispielhaft einige Anwendungen installiert, u .a. eine kleine Todo-Liste (Tracks) und ein Blog (Mephisto).

Simples Beispiel

Dieses Beispiel wird nichts anderes können, als eine kurze "Hello World" Nachricht anzuzeigen.

cd ${HOME}
rails RailsTest
cd RailsTest
./script/generate controller welcome hello
echo "Hello World" > app/views/welcome/hello.html.erb

Damit sich Ruby on Rails bzw. ActiveRecord auch ohne gültige Datenbankzugangsdaten zufrieden gibt, muss in der Datei werden:

config.frameworks -= [ :active_record, :active_resource, :action_mailer ]

Wir binden dieses Beispiel über die CGI-Schnittstelle ein, um das Vorgehen bei dieser Konfiguration zu verdeutlichen. Die

AddHandler cgi-script .cgi
Options +FollowSymLinks +ExecCGI

SetEnv GEM_HOME /kunden/homepages/17/d123456789/htdocs/executable/ruby/gems
SetEnv GEM_PATH /kunden/homepages/17/d123456789/htdocs/executable/ruby/gems
SetEnv RUBYLIB /kunden/homepages/17/d123456789/htdocs/executable/ruby/lib:/usr/lib/ruby/1.8

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

ErrorDocument 500 /500.html

Einbindung via FastCGI erfolgt dies über das Wrapperskript.

Die Einrichtung des Beispiels ist damit auch schon beendet und bei Aufruf von http://rails.example.org/welcome/hello sollte uns ein schönes "Hello World" begrüßen.

Tracks

Das praktische Tracks ist so etwas wie eine aufgemotzte To-Do Liste, die einen bei der GTD-Methode unterstützt.

cd ${HOME}
wget http://www.rousette.org.uk/projects/files/tracks-1.5.zip
unzip tracks-1.5.zip
mv tracks-1.5 tracks.example.org

Im Control Center des Homepage-Servers legen wir eine Subdomain namens tracks.example.org an, die auf das Verzeichnis /tracks.example.org/public/ verweist.

Note Die Einrichtung von Subdomains und die Zuweisung eines DocumentRoots werden in der FAQ von 1&1 beschrieben.

Für den Betrieb von Tracks ist eine MySQL-Datenbank notwendig, die über das Control Center erstellt werden muss. Anschließend werden die Zugangsdaten in die Datei

cat>${HOME}/tracks.example.org/config/database.yml<<EOF
production:
  adapter: mysql
  database: db123456789
  host: localhost
  username: dbo123456789
  password: geheim
EOF

Ebenso sollten wir nicht vergessen, in der Datei Wert für SALT einzutragen.

Mit den korrekten Zugangsdaten für die MySQL-Datenbank kann nun eine Initialisierung der Tabellen erfolgen.

cd ${HOME}/tracks.example.org
RAILS_ENV=production rake db:migrate

Tracks soll via FastCGI eingebunden werden. Wir ersetzen die .htaccess im

AddHandler fastcgi-script .fcgi
AddHandler cgi-script .cgi
Options +FollowSymLinks +ExecCGI

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

ErrorDocument 500 /500.html

Außerdem muss die originale dispatch.fcgi in dispatch.orig.fcgi umbenannt werden und ein Wrapperskript mit Namen dispatch.fcgi und folgendem Inhalt angelegt werden:

#!/bin/bash
export GEM_HOME="/homepages/17/d123456789/htdocs/executable/ruby/gems"
export GEM_PATH=${GEM_HOME}
export RUBYLIB="/homepages/17/d123456789/htdocs/executable/ruby/lib:/usr/lib/ruby/1.8"

# Alternativ zu dieser Umgebungsvariablen kann die Rails-Umgebung auch in der
# Datei config/environment.rb gesetzt werden.
export RAILS_ENV="production"

exec ./dispatch.orig.fcgi $@

Danach kann Tracks über die URL http://tracks.example.org/ aufgerufen werden.

Tracks in Aktion

Tracks in Aktion

Mephisto

Mephisto ist ein sehr gut anpassbares Blogsystem für Ruby on Rails. Da die aktuell stabile Version 0.7.3 nicht mit Rails 2.0.2 zusammenarbeitet, installieren wir die aktuelle Entwicklerversion auf dem Subversion-Repository. Zusätzlich ist das Gem tzinfo für den Betrieb notwendig.

cd ${HOME}
svn co http://svn.techno-weenie.net/projects/mephisto/trunk mephisto.example.org
gem install tzinfo

Im Control Center des Homepage-Servers legen wir eine Subdomain namens mephisto.example.org an, die auf das Verzeichnis /mephisto.example.org/public/ verweist.

Note Die Einrichtung von Subdomains und die Zuweisung eines DocumentRoots werden in der FAQ von 1&1 beschrieben.

Für den Betrieb von Mephisto ist eine MySQL-Datenbank notwendig, die über das Control Center erstellt werden muss. Anschließend werden die Zugangsdaten in die Datei

cat>${HOME}/mephisto.example.org/config/database.yml<<EOF
production:
  adapter: mysql
  database: db123456789
  host: localhost
  username: dbo123456789
  password: geheim
EOF

Mit den korrekten Zugangsdaten für die MySQL-Datenbank kann nun eine Initialisierung der Tabellen erfolgen.

cd ${HOME}/mephisto.example.org
RAILS_ENV=production rake db:bootstrap

Mephisto soll via FastCGI eingebunden werden. Wir ersetzen die .htaccess im

AddHandler fastcgi-script .fcgi
AddHandler cgi-script .cgi
Options +FollowSymLinks +ExecCGI

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

ErrorDocument 500 /500.html

Außerdem muss die originale dispatch.fcgi in dispatch.orig.fcgi umbenannt werden und ein Wrapperskript mit Namen dispatch.fcgi und folgendem Inhalt angelegt werden:

#!/bin/bash
export GEM_HOME="/homepages/17/d123456789/htdocs/executable/ruby/gems"
export GEM_PATH=${GEM_HOME}
export RUBYLIB="/homepages/17/d123456789/htdocs/executable/ruby/lib:/usr/lib/ruby/1.8"

# Alternativ zu dieser Umgebungsvariablen kann die Rails-Umgebung auch in der
# Datei config/environment.rb gesetzt werden.
export RAILS_ENV="production"

exec ./dispatch.orig.fcgi $@

Danach kann Mephisto über die URL http://mephisto.example.org/ aufgerufen werden.

Redmine

Redmine ist ein praktisches Projektmanagement-Werkzeug, das alles bietet, was man für kleinere Projekte benötigt. Es weist einige Ähnlichkeiten zu dem bekannten Trac auf.

cd ${HOME}
wget http://rubyforge.org/frs/download.php/33789/redmine-0.6.4.tar.gz
tar -xzf redmine-0.6.4.tar.gz
mv redmine-0.6.4 redmine.example.org

Im Control Center des Homepage-Servers legen wir eine Subdomain namens redmine.example.org an, die auf das Verzeichnis /redmine.example.org/public/ verweist.

Note Die Einrichtung von Subdomains und die Zuweisung eines DocumentRoots werden in der FAQ von 1&1 beschrieben.

Für den Betrieb von Redmine ist eine MySQL-Datenbank notwendig, die über das Control Center erstellt werden muss. Anschließend werden die Zugangsdaten in die Datei

cat>${HOME}/redmine.example.org/config/database.yml<<EOF
production:
  adapter: mysql
  database: db123456789
  host: localhost
  username: dbo123456789
  password: geheim
EOF

Wenn die Zugangsdaten korrekt waren, können wir die Tabellen initialisieren und die Grundkonfiguration von Redmine vornehmen.

RAILS_ENV=production rake db:migrate
RAILS_ENV=production rake redmine:load_default_data

Bei Aufruf von http://redmine.example.org/ erscheint nun eine Loginmaske. Die Zugangsdaten lauten Benutzer: admin, Passwort: admin. Das Passwort sollte schnellst möglich geändert werden, um einen unberechtigten Zugriff zu vermeiden.

Redmine soll via FastCGI eingebunden werden. Wir ersetzen die .htaccess im

AddHandler fastcgi-script .fcgi
AddHandler cgi-script .cgi
Options +FollowSymLinks +ExecCGI

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

ErrorDocument 500 /500.html

Außerdem muss die originale dispatch.fcgi in dispatch.orig.fcgi umbenannt werden und ein Wrapperskript mit Namen dispatch.fcgi und folgendem Inhalt angelegt werden:

#!/bin/bash
export GEM_HOME="/homepages/17/d123456789/htdocs/executable/ruby/gems"
export GEM_PATH=${GEM_HOME}
export RUBYLIB="/homepages/17/d123456789/htdocs/executable/ruby/lib:/usr/lib/ruby/1.8"

# Alternativ zu dieser Umgebungsvariablen kann die Rails-Umgebung auch in der
# Datei config/environment.rb gesetzt werden.
export RAILS_ENV="production"

exec ./dispatch.orig.fcgi $@

Danach kann Redmine über die URL http://redmine.example.org/ aufgerufen werden.

Redmine in Aktion

redmine in Aktion

Anhang

Installation für ganz Ungeduldige

Dieser Abschnitt führt alle die Installation von Ruby on Rails notwendigen Kommandos auf einem Homepage-Server ohne zusätzliche Erklärungen auf. Wer es genauer wissen will, sollte den Artikel komplett lesen.

# Umgebungsvariablen setzen und dann in das aktuelle Environment laden
cat>>${HOME}/.profile<<EOF
export GEM_HOME="${HOME}/executable/ruby/gems"
export GEM_PATH=${GEM_HOME}
export RUBYLIB="${HOME}/executable/ruby/lib:/usr/lib/ruby/1.8/"
export PATH="${HOME}/executable/ruby/bin:${HOME}/executable/ruby/gems/bin:${PATH}"
EOF

source ${HOME}/.profile

# Installation und Konfiguration von RubyGems
mkdir ${HOME}/executable/src/
cd ${HOME}/executable/src/
wget http://rubyforge.org/frs/download.php/34638/rubygems-1.1.0.tgz
tar -xzf rubygems-1.1.0.tgz
cd rubygems-1.1.0
ruby setup.rb all --no-rdoc --no-ri --no-format-executable --prefix=${HOME}/executable/ruby --siteruby=${HOME}/executable/ruby

cat>${HOME}/.gemrc<<EOF
gem: --no-rdoc --no-ri
gemhome: ${HOME}/executable/ruby/gems
gempath:
  - ${HOME}/executable/ruby/gems
EOF

# Installation der nötigen RubyGems
gem install rails fcgi

# Erstellen der .htaccess im /public-Verzeichnis der Rails-Applikation
cat>${HOME}/rails.example.org/public/.htaccess<<EOF
AddHandler fastcgi-script .fcgi
AddHandler cgi-script .cgi
Options +FollowSymLinks +ExecCGI

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

ErrorDocument 500 /500.html
EOF

# Erstellen des Wrapperskripts für FastCGI im /public-Verzeichnis der Rails-Applikation
mv ${HOME}/rails.example.org/public/dispatch.fcgi ${HOME}/rails.example.org/public/dispatch.orig.fcgi

cat>${HOME}/rails.example.org/public/dispatch.fcgi<<EOF
#!/bin/bash
export GEM_HOME="/homepages/17/d123456789/htdocs/executable/ruby/gems"
export GEM_PATH=${GEM_HOME}
export RUBYLIB="/homepages/17/d123456789/htdocs/executable/ruby/lib:/usr/lib/ruby/1.8"
export RAILS_ENV="production"

exec ./dispatch.orig.fcgi $@
EOF

chmod +x ${HOME}/rails.example.org/public/dispatch.fcgi

Changelog

Version 1.4

Version 1.3

Version 1.2

Version 1.1

Version 1.0