Ruby

From TuxFamilyFAQ
Jump to navigationJump to search

Exécuter des scripts Ruby via CGI est lent, donc pas à recommander pour des pages avec beaucoup de trafic. Par contre ça peut être utile pour des fonctions qui ne sont utilisés que rarement ou que par une petite partie de vos utilisateurs.

Pour éviter de se bloquer définitivement sur CGI, vous pouvez écrire votre script pour Rack. Rack peut utiliser aujourd'hui CGI et demain autre chose, si possible!

Installer son propre environnement RubyGems

Le RubyGems 1.2.0 dans Debian Lenny est malheureusement inutilisable, peut-être ça serait mieux en Squeeze. De toute manière, voici comment vous pouvez utiliser un RubyGems moderne dans votre groupe. Bien sûr, il faut veiller à bien installer les mises à jour de sécurité, comme toujours.

On peut utiliser le répertoire php-include comme racine. C'est dans l'éspace du groupe web, mais pas accessible via HTTP.

Le RubyGems dans cet exemple est la version 1.8.5. Il faut distinguer trois répertoires :

  1. L'installation de RubyGems lui-même, on fait cela dans php-include/rubygems. C'est le "prefix" pour l'installation.
  2. Le dépôt pour les gems, ici c'est php-include/rubygems/gems. C'est le $GEM_HOME.
  3. Les fichiers témporaires et de configuration que la commande gem utilise. Normalement c'est $HOME/.gem mais pour le mettre dans le quota de l'espace web, je mets un lien symbolique vers php-include/rubygems-config.
cd ~/[maGroupe]/[maDomaine]-web/php-include

mkdir rubygems-config
ln -s $PWD/rubygems-config ~/.gem

wget 'http://production.cf.rubygems.org/rubygems/rubygems-1.8.5.tgz'
tar xvzf rubygems-1.8.5.tgz
rm rubygems-1.8.5.tgz
export GEM_HOME=$PWD/rubygems/gems
ruby setup.rb --prefix=$PWD/rubygems

Voici le contenu de mon ~/.gemrc :

gem: --no-rdoc --no-ri
gemhome: /home/[maGroupe]/[maDomaine]-web/php-include/rubygems/gems
gempath:
  - /home/[maGroupe]/[maDomaine]-web/php-include/rubygems/gems

L'installation se termine par l'information qu'on peut désormais utiliser la commande php-include/rubygems/bin/gem1.8. Mais ce n'est pas aussi facile que ça:

php-include$ rubygems/bin/gem1.8 -v
1.2.0

Qu'est-ce qui se passe ? gem1.8 est lui-même un programme Ruby qui utilise require 'rubygems'. Or, c'est toujours le RubyGems du système (Debian Lenny) qui est trouvé. Il faut donc modifier la variable $RUBYLIB. Je me crée un wrappeur en bash ~/mygem (chmod u+x) que j'appelle toujours au lieu de gem :

#!/bin/sh
export RUBYLIB=/home/[maGroupe]/[maDomaine]-web/php-include/rubygems/lib:$RUBYLIB
/home/[maGroupe]/[maDomaine]-web/php-include/rubygems/bin/gem1.8 "$@"

Et voilà :

php-include$ ~/mygem -v
1.8.5

Pour utiliser les nouveaux RubyGems dans un script pour le serveur web, il faut mettre les variables $RUBYLIB et $GEM_HOME dans un .htaccess. A noter que le serveur web ne connait pas /home/[maGroupe]. Un chemin relatif vers php-include est à éviter, sinon on ne peut pas avoir des scripts Ruby que dans ce niveau d'arborescence des fichiers. Pour trouver le chemin absolu vers php-include, il faut regarder la sortie de phpinfo().

Par exemple, voici mon .htaccess pour le répertoire racine ("htdocs"):

SetEnv RUBYLIB  /data/web/xx/xx/xx/[maDomaine]/php-include/rubygems/lib
SetEnv GEM_HOME /data/web/xx/xx/xx/[maDomaine]/php-include/rubygems/gems