Versioni multiple di Ruby in produzione con RVM e Passenger Standalone

Scritto da Silvio Relli circa un anno fa. Dec16

Rails RVM NginxVisto il rilascio odierno di Phusion Passenger 3.0.2 mi sono finalmente deciso a scrivere un articolo su come utilizzare versioni diverse di Ruby contemporaneamente su un server di produzione.

Con Ruby on Rails 3 ed il suo pieno supporto a Ruby 1.9.2 ci troviamo di fronte al problema di sfruttare questa accoppiata vincente (e molto performante) su server in produzione su cui è configurato il buon vecchio Ruby 1.8.7
Tra l'altro ci sono già esempi di applicazioni come ror_ecommerce che hanno abbandonato totalmente il supporto a Rails 2.x e Ruby 1.8.x

Grazie a Ruby Version Manager già  da tempo è possibile installare su una macchina di sviluppo varie versioni indipendenti di Ruby, ognuna col proprio insieme di gemme, ed effettuare lo switch da una versione all'altra secondo le necessità  in modo veloce ed indolore.

Cosa differente è invece il tenere contemporaneamente in esecuzione applicazioni che si appoggiano a set di librerie di versioni diverse!

Fino a qualche tempo fa  era necessario ricorrere a configurazioni molto particolari (o alla virtualizzazione), mentre con il rilascio di Phusion Passenger 3 nella sua incarnazione standalone la faccenda si è abbastanza semplificata.
Anche se questa guida sembra lunga vi assicuro che gli step da compiere sono veramente pochi!

Vediamo allora come far girare in produzione una web app Rails 3 con Ruby 1.9.2 in un server su cui sono già presenti Ruby 1.8.7 Enterprise Edition, Apache 2 e Passenger 3.
La configurazione seguente è stata fatta su una Debian Testing, ma non credo ci siano problemi ad applicarla a Ubuntu server o una qualsiasi macchina Linux.

La soluzione è utilizzare Passenger Standalone (basato su Nginx) come webserver e connetterlo ad Apache tramite reverse proxy.

Personalmente ho l'abitudine di effettuare l'installazione di una web app nella home di un utente (es: /home/railsuserX/sites/web-app-X) in modo da effettuare il deploy con Capistrano tramite un utente non privilegiato.
Ciò va perfettamente d'accordo con RVM, la cui installazione di default è tramite utente comune (non root e non system-wide).

Il primo passo è dunque installare RVM come utente non privilegiato, potete seguire la ottima guida ufficiale sempre aggiornata.

Completata l'installazione di rvm, installiamo e switchamo su Ruby 1.9.2
rvm install 1.9.2
rvm use 1.9.2


Installiamo le prime gemme essenziali
gem install rails bundler passenger

Andiamo nella directory dove è installata la nuova webapp che deve girare con Ruby 1.9.2 ed installiamo le relative gemme.
Anche se molte gemme sono già  installate system-wide per la versione nativa di Ruby sul sistema, esse devono essere installate anche per il corrente gemset di RVM.
cd /home/railsusrX/sites/web-app-X/
bundle install


Avviamo l'app con Passenger Standalone come demone in background su una porta diversa da quella di default, ad esempio la 3001, poichè sulla 80 già risiede Apache di sistema.
In maniera quasi sorprendente Passenger scaricherà , compilerà ed installerà tutto il necessario per poi avviarsi.
passenger start -a 127.0.0.1 -p 3001 -d -e production

Se tutto è andato bene la nostra applicazione sta girando in background su Nginx e Ruby 1.9.2
Possiamo controllare eseguendo
ps aux | grep passenger-standalone
ed ottentendo qualcosa di simile a
railsusrX    15369  0.0  0.1  33588   804 ?        Ss   17:26   0:00 nginx: master process /home/railsusrX/.passenger/standalone/3.0.2-x86_64-ruby1.9.2-linux-gcc4.4.5-1002/nginx-0.8.53/sbin/nginx -c /tmp/passenger-standalone.9740/config -p /tmp/passenger-standalone.9740/
railsusrX    15622  0.0  0.1 112344   844 pts/1    S+   17:46   0:00 grep passenger-standalone


Adesso dobbiamo collegare i due webserver tramite reverse proxy.
Le prossime operazioni vanno eseguite come root o tramite sudo.
Creiamo il virtualhost di Apache in /etc/apache2/sites-available/web-app-X.it.vhost con il seguente contenuto
<VirtualHost *:80>
  ServerName web-app-X.it
  ServerAdmin silvio@web-app-X.it

  ErrorLog /var/log/apache2/testbox_error.log
  CustomLog /var/log/apache2/testbox_access.log combined

  DocumentRoot /home/railsusrX/sites/web-app-X/public

  PassengerEnabled off
  ProxyPass / http://127.0.0.1:3001/
  ProxyPassReverse / http://127.0.0.1:3001/
</VirtualHost>


Fate attenzione a porre una / in fondo agli indirizzi del proxy altrimenti gli asset del sito non saranno accessibili.

Attiviamo i moduli di Apache che si occupano di proxare e riavviamo Apache
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_connect
/etc/init.d/apache2 restart


Infine abilitiamo il nuovo virtual host
a2ensite web-app-X.it.vhost
/etc/init.d/apache2 reload


Il deploy di versioni aggiornate della nostra applicazione web può essere fatto normalmente con Capistrano in quanto il webserver si riavvia col solito tocco (touch /home/railsusrX/sites/web-app-X/tmp/restart.txt)
 

Postato in ,  | Tag , , ,  | Nessun commento

Installare Ruby on Rails su Mac Osx Snow Leopard

Scritto da Silvio Relli oltre un anno fa. Jun3

Guida installazione rails leopard

Questa breve guida descrive come effettuare un'ottima installazione di Ruby a 64bit e tutto ciò che è necessario per iniziare a sviluppare con Ruby on Rails su Mac OSX.

Vedremo anche come installare MacPorts e MySQL dai sorgenti.

1) Installare Xcode 3.

L'installazione di Xcode si rende necessaria non tanto per l'editor stesso, quanto per l'insieme di librerie e tool che compongono l'SDK, come il compilatore gcc.

Potete trovare Xcode nel dvd di Snow Leopard oppure scaricare una versione aggiornata da qui: http://developer.apple.com/technologies/xcode.html (circa 2,3GB).

2) Installare Macports.

Macports è un tool che serve a scaricare, compilare e installare software opensource su Mac OSX.

Conosciuto fino a qualche anno fa come Darwin Ports, agisce in maniera simile ad Apt per Debian/Ubuntu o Yum per Redhat/Fedora risolvendo e scaricando le dipendenze del programma desiderato.

Scaricate l'immagine .dmg ed installate il .pkg in essa contenuto: http://www.macports.org/install.php

3) Settare le variabili d'ambiente.

Con il vostro editor preferito (Textmate regna!) dovrete aggiungere dei percorsi alla variabile PATH, la quale definisce le directory in cui il sistema cerca i programmi eseguibili da linea di comando.

Aprite dunque il terminale (Applicazioni/Utilità) e digitate:

mate ~/.profile 

La tilde ~ sulla tastiera italiana si ottiene premendo alt+5 ed identifica la vostra Home.

Se l'installazione di MacPorts è andata a buon fine noterete che il suo installer ha già provveduto ad aggiungere questa riga:

export PATH=/opt/local/bin:/opt/local/sbin:$PATH

In fondo al file aggiungete questa riga:

export PATH="/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:$PATH"

Queste sono le directory dove finiranno i binari compilati di Ruby e MySQL.

Salvate il file e sempre da terminale eseguite

source ~/.profile

in modo da applicare le modifiche effettuate.

4) Qualche pacchetto necessario

Installiamo adesso qualche pacchetto da Port che si renderà utile in futuro: da terminale eseguite:

sudo port install curl git-core subversion bzip2

NON installate MySQL tramite Port, scaricheremo e compileremo il sorgente successivamente, in quanto l'installazione tramite Port a volte causa delle incompatibilità.

5) Download, compilazione e installazione di Ruby 1.8.7

mkdir ~/temp

cd ~/temp

curl -O ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p174.tar.gz

tar xzvf ruby-1.8.7-p174.tar.gz

cd ruby-1.8.7-p174

./configure --enable-shared --enable-pthread CFLAGS=-D_XOPEN_SOURCE=1

make

sudo make install

cd ..

6) Download, compilazione e installazione di Rubygems

curl -O http://files.rubyforge.vm.bytemark.co.uk/rubygems/rubygems-1.3.7.tgz

tar xzvf rubygems-1.3.7.tgz

cd rubygems-1.3.7

sudo /usr/local/bin/ruby setup.rb

cd ..

7) Installazione di Rails e Mongrel

Adesso che Rubygems è installato potete iniziare a usare il sistema di pacchettizazione gem per installare Rails e le altre gemme necessarie:

sudo gem install rails mongrel

Attendete prima di installare la gemma di MySQL, in quanto lo installeremo compilandolo dai sorgenti nel passo successivo.

8) Download, compilazione e installazione di MySQL

curl -O http://mysql.he.net/Downloads/MySQL-5.1/mysql-5.1.46.tar.gz

tar xzvf mysql-5.1.46.tar.gz

cd mysql-5.1.46

./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --enable-shared --with-plugins=innobase

make

sudo make install

cd /usr/local/mysql

sudo ./bin/mysql_install_db --user=mysql

sudo chown -R mysql ./var

cd ..

L'utente root di mysql per il momento è privo di password, opzionalmente potete settarla eseguendo:

mysqladmin -u root password 'miapassword'

Configuriamo launchctl in modo da avviare MySQL all'avvio del sistema:

curl -O http://hivelogic.com/downloads/com.mysql.mysqld.plist

sudo mv ./com.mysql.mysqld.plist /Library/LaunchDaemons

sudo chown root /Library/LaunchDaemons/com.mysql.mysqld.plist

sudo launchctl load -w /Library/LaunchDaemons/com.mysql.mysqld.plist

Installate infine la gemma MySQL di Ruby:

sudo gem install mysql -- --with-mysql-dir=/usr/local/mysql

Come client grafico per MySQL vi consiglio il validissimo Sequel PRO, un tempo conosciuto come Cocoa MySQL: http://www.sequelpro.com/

Postato in  | Tag , , , , ,  | Nessun commento