<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TommyBlue.it &#187; Unicorn</title>
	<atom:link href="http://www.tommyblue.it/tag/unicorn/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tommyblue.it</link>
	<description>Bombardare per la pace è un po' come trombare per la verginità...</description>
	<lastBuildDate>Tue, 24 Jan 2012 09:34:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Deploy di applicazioni Rails con Unicorn e Nginx</title>
		<link>http://www.tommyblue.it/2009/11/14/deploy-di-applicazioni-rails-con-unicorn-e-nginx/</link>
		<comments>http://www.tommyblue.it/2009/11/14/deploy-di-applicazioni-rails-con-unicorn-e-nginx/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 17:15:41 +0000</pubDate>
		<dc:creator>TommyBlue</dc:creator>
				<category><![CDATA[How-To]]></category>
		<category><![CDATA[Informatica]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[RubyOnRails]]></category>
		<category><![CDATA[Unicorn]]></category>

		<guid isPermaLink="false">http://www.tommyblue.it/?p=705</guid>
		<description><![CDATA[Come avevo promesso avrei dedicato del tempo ad indagare circa le possibilità offerte da Unicorn per il deploy delle applicazioni Ruby On Rails. Di seguito un riepilogo di quel che ho fatto per configurare il nuovo deploy di Kickin&#8217; utilizzando Unicorn, Nginx e Apache. Unicorn L&#8217;installazione di Unicorn si fa &#8220;di tacco&#8221; (per una descrizione [...]]]></description>
			<content:encoded><![CDATA[<p>Come <a href="http://www.tommyblue.it/2009/10/08/unicorn-rack-http-server-for-unix-and-fast-clients/">avevo promesso</a> avrei dedicato del tempo ad indagare circa le possibilità offerte da <a href="http://unicorn.bogomips.org/" target="_blank">Unicorn</a> per il deploy delle applicazioni Ruby On Rails. Di seguito un riepilogo di quel che ho fatto per configurare il nuovo deploy di <a href="http://kickin.kreations.it" target="_blank">Kickin&#8217;</a> utilizzando Unicorn, Nginx e Apache.</p>
<h3>Unicorn</h3>
<p>L&#8217;installazione di Unicorn si fa &#8220;di tacco&#8221; (per una descrizione più dettagliata <a href="http://www.tommyblue.it/2009/10/08/unicorn-rack-http-server-for-unix-and-fast-clients/">leggete il vecchio post</a>), basta un semplice:</p>
<pre>gem install unicorn</pre>
<p>Per le applicazioni anzichè farle rispondere su socket tcp ho deciso di utilizzare le socket Unix (posiziondole in /tmp), quindi il comando completo (da lanciare dentro la root dell&#8217;applicazione Rails) è:</p>
<pre>unicorn_rails -D -E production -l /tmp/kickin.kreations.it.sock</pre>
<p>ovvero lancio unicorn in modalità demone (<strong>-D</strong>), con l&#8217;environment production (<strong>-E production</strong>) e sulla socket /tmp/kickin.kreations.it.sock (<strong>-l /tmp/kickin.kreations.it.sock</strong>). Per la lista completa delle opzioni c&#8217;è il solito <strong>-h</strong> :)</p>
<p><span id="more-705"></span>Per rendere tutto automatizzato ho creato (in stile apache2) la cartella <strong>/etc/unicorn</strong> con dentro le cartelle <strong>sites-available</strong> e <strong>sites-enabled</strong>. Il contenuto di <strong>/etc/unicorn/sites-available/kickin.kreations.it</strong> è:</p>
<pre>#!/bin/bash
cd /var/www/tommyblue/kickin.kreations.it
su tommyblue -c "unicorn_rails -D -E production -l /tmp/kickin.kreations.it.sock"</pre>
<p>Quindi il file <strong>/etc/init.d/unicorn_rails</strong>:</p>
<pre>#! /bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/unicorn_rails
NAME=unicorn_rails
DESC=unicorn_rails
SITES=/etc/unicorn/sites-enabled
test -x $DAEMON || exit 0
set -e
start_instances() {
   for i in `ls $sites`; do
   echo -n "Starting $i"
   $SITES/$i
   done
}
case "$1" in
  start)
    start_instances;
    ;;
  stop)
    echo -n "Stopping $DESC: "
    killall $NAME
    ;;
  *)
    N=/etc/init.d/$NAME
    echo "Usage: $N {start|stop}" &gt;&amp;2
    exit 1
    ;;
esac
exit 0</pre>
<p>Ed ho quindi aggiunto lo script ai runlevel:</p>
<pre>update-rc.d unicorn_rails defaults 99</pre>
<p>Adesso ci si può sbizzarrire a lanciare e fermare i siti</p>
<h3>Nginx</h3>
<p>Installato nginx (<strong>apt-get install nginx</strong>) si passa a configurarlo. Io ho eliminato il sito di default e ho creato solo i files che mi interessavano (tanto la porta 8080 è chiusa dall&#8217;esterno quindi non ho problemi riguardo al visitare siti &#8220;imprevisti&#8221;). Ecco <strong>/etc/nginx/sites-available/kickin.kreations.it</strong>:</p>
<pre>upstream backend {
  server unix:/tmp/kickin.kreations.it.sock;
}
server {
  listen   8080;
  server_name  kickin.kreations.it;
  access_log  /var/log/nginx/kickin.kreations.it.access.log;
  location / {
    proxy_pass http://backend;
    proxy_redirect off;
    proxy_set_header        Host    $host;
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    root   /var/www/nginx-default;
    index  index.html index.htm;
    }
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
  root   /var/www/nginx-default;
  }
}</pre>
<p>Come si vede dalla configurazione il backend utilizzato è la socket unix creata con unicorn e nginx risponde sulla porta 8080. Collegandosi al sito sulla porta 8080 (supponendo che il vostro server abbia tale porta accessibile dall&#8217;esterno) potete già constatare la riuscita del deploy. Se poi, diversamente dal mio caso, non avete apache che risponde sulla 80, vi basterà far rispondere nginx su tale porta e il gioco è fatto.</p>
<h3>Apache</h3>
<p>Se invece è apache che risponde sulla porta 80 è necessario questo ultimo passaggio. Innanzitutto bisogna attivare mod_proxy con:</p>
<pre>a2enmod proxy</pre>
<p>e quindi effettuare il reload di apache. Quindi si passa alla configurazione del sito, ecco <strong>/etc/apache2/sites-available/kickin.kreations.it</strong> (ho eliminato le righe non rilevanti):</p>
<pre>&lt;VirtualHost *:80&gt;
  ServerName kickin.kreations.it
  ProxyRequests off
  ProxyPreserveHost On
  &lt;Proxy *&gt;
    Order deny,allow
    Allow from all
  &lt;/Proxy&gt;
  ProxyPass / http://127.0.0.1:8080/
  ProxyPassReverse / http://127.0.0.1:8080/
&lt;/VirtualHost&gt;</pre>
<p>Una volta attivato il sito (con <strong>a2ensite</strong>), <a href="http://kickin.kreations.it" target="_blank">http://kickin.kreations.it</a> è disponibile e funzionante!</p>
<h3>Conclusioni</h3>
<p>Sebbene effettuare il deploy con Unicorn non sia ancorà così agevole (e, a quanto dicono gli sviluppatori, ancora neanche troppo stabile, la versione è la 0.94.0) il risultato è veramente strabiliante. Non ho ancora provato dei test intensivi, ma la sensazione è di applicazioni molto più reattive e addirittura la generazione di un pdf che con Passenger impiegava circa 2 minuti con Unicorn viene generato in una <strong>ventina di secondi</strong>!</p>
<p>Termino segnalando <a href="http://rainbows.rubyforge.org/" target="_blank">Rainbows! Unicorn for sleepy apps and slow clients</a>, che proverò a breve :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tommyblue.it/2009/11/14/deploy-di-applicazioni-rails-con-unicorn-e-nginx/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Unicorn: Rack HTTP server for Unix and fast clients</title>
		<link>http://www.tommyblue.it/2009/10/08/unicorn-rack-http-server-for-unix-and-fast-clients/</link>
		<comments>http://www.tommyblue.it/2009/10/08/unicorn-rack-http-server-for-unix-and-fast-clients/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 10:16:28 +0000</pubDate>
		<dc:creator>TommyBlue</dc:creator>
				<category><![CDATA[How-To]]></category>
		<category><![CDATA[Informatica]]></category>
		<category><![CDATA[Software Libero]]></category>
		<category><![CDATA[Passenger]]></category>
		<category><![CDATA[RubyOnRails]]></category>
		<category><![CDATA[Unicorn]]></category>
		<category><![CDATA[Webrick]]></category>

		<guid isPermaLink="false">http://www.tommyblue.it/?p=635</guid>
		<description><![CDATA[Ho appena scoperto Unicorn, un server HTTP per applicazioni Rack (quindi anche Ruby on Rails) pensato per Kernel Unix o Unix-like e connessioni veloci a bassa latenza. Come suggerito dal sito client lenti dovrebbero essere serviti non da Unicorn ma da un proxy che si interfacci con Unicorn attraverso una connessione veloce ed effettui il [...]]]></description>
			<content:encoded><![CDATA[<p>Ho appena scoperto <a href="http://unicorn.bogomips.org/" target="_blank">Unicorn</a>, un server HTTP per applicazioni <a title="Rack provides a minimal interface between webservers supporting Ruby and Ruby frameworks" href="http://rack.rubyforge.org/" target="_blank">Rack</a> (quindi anche <a href="http://rubyonrails.org/" target="_blank">Ruby on Rails</a>) pensato per Kernel Unix o Unix-like e connessioni veloci a bassa latenza.<br />
Come suggerito dal sito client lenti dovrebbero essere serviti non da Unicorn ma da un proxy che si interfacci con Unicorn attraverso una connessione veloce ed effettui il buffering dei dati per poi gestire la connessione col client lento (ganzo! Ora devo scoprire come si fa&#8230;)</p>
<p>Installare Unicorn è semplicissimo, basta un:</p>
<pre>gem install unicorn</pre>
<p>dopodichè, se si tratta di un&#8217;applicazione Rails, basta andare nella RAILS_ROOT e lanciare:</p>
<pre>unicorn_rails</pre>
<p>Se invece si tratta di un&#8217;applicazione non Rails il comando è:</p>
<pre>unicorn</pre>
<p>In entrambi i casi Unicorn fa il binding della porta 8080 su tutte le interfacce (il comportamento è comunque configurabile).</p>
<p>L&#8217;impressione generale è una velocità molto maggiore sia di Webrick che di Passenger. Un confronto al volo su una pagina con un tabellone da un migliaio di righe dice:</p>
<pre>Webrick =&gt; 6131ms
Unicorn =&gt; 5698ms</pre>
<p>Quindi circa <strong>8%</strong> in meno.</p>
<p>Prossimamente approfondirò l&#8217;argomento :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tommyblue.it/2009/10/08/unicorn-rack-http-server-for-unix-and-fast-clients/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

