Support:

08000 638 287

Mo-Fr. 10-18 Uhr (Kostenfrei aus dem deutschen Festnetz)

Ruby on Rails Vorbereitung fuer VServer

Aus netcup Wiki
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Einen virtuellen Server für „Ruby on Rails“ vorbereiten

Einleitung

„Ruby on Rails“ ist schon seit vielen Jahre das Vorzeige-Webframework, an dem sich viele neu entstandene Frameworks orientieren. Mitte 2010 ist nun die neueste Version 3.0 mit einer großen Anzahl an Neuerungen erschienen. Im Folgenden möchte ich beschreiben, wie auf einem Ubuntu-basierenden virtuellen Server von netcup.de die notwendige Software für ein „Ruby on Rails“-Projekt installiert wird. Als Webserver wird Apache, als Datenbank MySQL und zur Versionsverwaltung GIT verwendet.

System

Zuerst werden die Paketquellen mittels aptitude aktualisiert.

sudo aptitude update
sudo aptitude upgrade

Datenbank

Sollte noch keine MySQL-Datenbank installiert sein – das hängt vom Server-Image ab –, muss man Server und Client installieren.

sudo aptitude install mysql-server
sudo aptitude install mysql-client

Bei der Installation des Servers wird automatisch ein Root-Account angelegt und noch während der Installation wird das Passwort für diesen abgefragt. Dieser hat aber nichts mit dem System-Root-Account zu tun. Danach werden über den MySQL-Client eine neue Datenbank (railsprojekt_production) und ein neuer User (railsuser) mit genügend Berechtigungen für das Rails-Projekt anlegt.

mysql -uroot -pgeheim
mysql> CREATE DATABASE railsprojekt_production;
mysql> GRANT ALL ON railsprojekt_production.* TO 'railsuser'@'localhost' IDENTIFIED BY 'auchgeheim'; 

Versionsverwaltung

Git ist ein Versionsverwaltungssystem ähnlich wie Mercurial oder Subversion. Gerade im Ruby-Umfeld erfreut es sich großer Beliebtheit. Es müssen nun alle nötigen Pakete installiert und ein Projekt-Repository in ~/git/railsprojekt.git für das Rails-Projekt erstellt werden. (In der Praxis wäre es aus Sicherheitsgründen sinnvoll, Versionsverwaltungssystem und Produktionsserver auf zwei Servern zu trennen.)

sudo aptitude install git-core
mkdir -p ~/git/railsprojekt.git
cd ~/git/railsprojekt.git
git init --bare

Ruby

Ruby 1.9.1 ist ebenfalls (wie Rails 3) relativ neu und verfügt über deutlich verbesserte Performance, da deren Qualität lange ein Kritikpunkt war. Die Installation erfolgt ebenso über aptitude. Neben Ruby selbst sollten auch IRB, die interaktive Ruby Shell, hilfreich zum Debuggen, und der MySQL-Treiber installiert werden.

sudo aptitude --assume-yes install \
  build-essential \
  irb1.9.1 \
  libmysql-ruby \
  libmysql-ruby1.9.1 \
  libreadline-ruby1.9.1 \
  libruby1.9.1 \
  rdoc \
  rdoc1.9.1 \
  ri \
  ri1.9.1 \
  ruby \
  ruby1.9.1 \
  ruby1.9.1-dev

Gem

Gems sind Softwarepakete, die einfach installiert werden können. Einen Großteil der Gems findet man auf github.com. Zur Verwaltung der Pakete (Suche, Installation, Update, Deinstallation) wird rubygems verwendet.

sudo aptitude install rubygems1.9.1

Ruby on Rails

Rails selbst wird über den eben installierten Gem-Installer installiert. Da sich die Versionen recht schnell ändern können, sollte man vorher einen Blick auf http://rubyonrails.org/ werfen. Es ist aber auch möglich, Rails sowie alle anderen Gem-Pakete gar nicht am Server zu installieren, sondern mittels „rake rails:freeze“ in der Rails-Anwendung selbst einzufrieren. Damit hat man die Sicherheit, dass das Projekt alle richtigen Versionen von Gems und Rails selbst hat.

Apache-Modul mod-rails

Der Apache-Webserver sollte auf dem Virtuellen-Server-Image von netcup.de schon vorinstalliert sein. Es fehlt nur noch das nötige Modul für Rails, gennant mod-rails oder passenger.

sudo gem install passenger
sudo passenger-install-apache2-module

Am Ende der Installation sieht man die Beispielkonfigurationsdatei eines Virtuellen Hosts.

Caching mit memcached

Bei großen Anwendungen mit viel Web-Traffic empfiehlt sich ein Caching-Dienst. Ein sehr einfach aufzusetzender Dienst ist memcached, der auch von Rails gut unterstützt wird. Die Installation und der Betrieb von memcached ist sehr simpel.

sudo aptitude install memcached

Gestartet wird memcached mit

/etc/init.d/memcached start

Die Konfigurationsdatei befindet sich in /etc/memcached.conf. Man sollte kontrollieren, ob memcached nur auf das interne Interface (localhost) hört, damit niemand von außen Zugriff auf den Cache-Server hat.

Projektpflege mit Capistrano

Capistrano hilft beim Verwalten des Projekts, neudeutsch „deployen“. Es werden dabei Rezepte definiert, um z.B. den aktuellen Code aus dem Verwaltungssystem auszuchecken und am Produktionsserver zu aktualisieren oder die Datenbankstruktur zu ändern. Geht etwas schief, kann man ganz einfach auf den alten Stand zurücksetzen. Es ist ebenfalls möglich, eigene „Tasks“ zu definieren, um etwa Datenbankbackups lokal zu kopieren oder Skripte aufzurufen. Da Capistrano sehr mächtig ist, möchte ich auf die Website http://www.capify.org/ verweisen und an dieser Stelle nur anhand der Grundkonfiguration in deploy.rb für einen netcup-Server zeigen, wie mittels GIT-Repository geupdatet wird.

set :application, "railsprojekt"
set :deploy_to, "/home/user/www/#{application}"
set :deploy_via, :remote_cache

set :scm, :git
set :repository,  "ssh://user@mein-netcupserver.de/home/user/git/railsprojekt.git"
set :branch, "master"
set :scm_username, "user"

set :user, "user"
set :ssh_options, { :forward_agent => true}
set :use_sudo, false
set :keep_releases, 4 

role :web, "mein-netcupserver.de"
role :app, "mein-netcupserver.de"
role :db,  "mein-netcupserver.de", :primary => true 

Software-Wartungs-Tipps

Um per E-Mail Informationen über neue Pakete oder Sicherheitspatches zu bekommen, bietet sich apticron an. Dabei wird per Cron regelmäßig geprüft, ob neue Updates vorhanden sind und ein E-Mail an den User root geschickt.

sudo aptitude install apticron

Um Informationen über Updates für installierte Gems zu bekommen, verwende ich dieses kleine Ruby-Script, das als Cronjob eingetragen ist und ebenfalls ein E-Mail sendet.


require 'net/smtp'
	
update = `gem outdate`.strip
	
if update.size > 0

  from_email = "from@example.org"
  to_email = "to@example.org"
	  
  msg = <<MESSAGE
  From: #{from_email} <#{from_email}>
  To: #{to_email} <#{to_email}>
  Content-Type: text/plain; charset=UTF-8
  Subject: neue GEM Updates gefunden 
  
  #{update}
  MESSAGE
	  
  Net::SMTP.start('example.org', 25) do |smtp|
    smtp.send_message msg, from_email, [to_email]
  end

end

Eingesendet von Bernhard E.

Meine Werkzeuge
Namensräume

Varianten
Aktionen
netcup
Webhosting
vServer / Root-Server
Groupware
F.A.Q.
Sonstiges