<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Jaros&#322;aw Zabie&#322;&#322;o - BLOG: Tag unix</title>
    <link>http://blog.zabiello.com/articles/tag/unix</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Thin, unix sockets, Rails i Merb</title>
      <description>&lt;p&gt;&lt;a href="http://code.macournoyer.com/thin/"&gt;Thin&lt;/a&gt; to szybki serwer &lt;span class="caps"&gt;HTTP&lt;/span&gt; s&#322;u&#380;&#261;cy do uruchamiania webowych framework&#243;w napisanych w j&#281;zyku Ruby. Najbardziej z nich popularny jest oczywi&#347;cie &lt;a href="http://rubyonrails.pl"&gt;Rails&lt;/a&gt;. Cho&#263; istnieje wiele sposob&#243;w uruchomienia Rails&#243;w na serwerze produkcyjnym, u&#380;ycie Thin wydaje si&#281; aktualnie najlepszym rozwi&#261;zaniem z przynajmniej dw&#243;ch powod&#243;w: zajmuje mniej pami&#281;ci i jest szybszy od popularnego &lt;a href="http://mongrel.rubyforge.org/"&gt;Mongrela&lt;/a&gt;. Thin wykorzystuje dwa bardzo szybkie modu&#322;y: &lt;a href="http://www.zedshaw.com/tips/ragel_state_charts.html"&gt;Mongel parser&lt;/a&gt;, &lt;a href="http://rubyeventmachine.com/"&gt;Event Machine&lt;/a&gt; oraz (wzorowan&#261; na pythonowym &lt;a href="http://www.python.org/dev/peps/pep-0333/"&gt;&lt;span class="caps"&gt;WSGI&lt;/span&gt;&lt;/a&gt;) bibliotek&#281; &lt;a href=""http://rack.rubyforge.org/"&gt;Rack&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Od jakiego&#347; czasu Thin udost&#281;pnia uruchamianie klastra proces&#243;w wykorzystuj&#261;cy szybsze od &lt;span class="caps"&gt;TCP&lt;/span&gt;, sockety uniksowe. Zalet&#261; jest nie tylko wi&#281;ksza szybko&#347;&#263; pracy, ale tak&#380;e odpada problem rezerwacji odpowiedniej liczby port&#243;w &lt;span class="caps"&gt;TCP&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;Wygenerowanie pliku konfiguracyjnego polega na uruchomieniu w katalogu z projektem Rails (lub Merb) komendy:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_bash "&gt;thin config -C config/thin.yml -s4 -e production \
  --socket /tmp/thin_myapp.sock&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Zostanie wygenerowany plik konfiguracyjny o mniej wi&#281;cej takiej tre&#347;ci:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_yaml "&gt;&lt;span class="document"&gt;--- 
pid: tmp/pids/thin.pid&lt;/span&gt;
&lt;span class="key"&gt;socket&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; /tmp/thin_myapp.sock
&lt;span class="key"&gt;log&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; log/thin.log
&lt;span class="key"&gt;max_conns&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; 1024
&lt;span class="key"&gt;timeout&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; 30
&lt;span class="key"&gt;chdir&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; /home/app/rails/myapp
&lt;span class="key"&gt;environment&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; production
&lt;span class="key"&gt;max_persistent_conns&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; 512
&lt;span class="key"&gt;servers&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; 4
&lt;span class="key"&gt;daemonize&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; true&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Opcja &lt;code&gt;-s4&lt;/code&gt; oznacza &#380;e chcemy u&#380;y&#263; 4 procesy. (W wypadku Nginksa, trzeba uwa&#380;a&#263; na opcj&#281; &lt;code&gt;max_persistent_conns&lt;/code&gt;, bo Nginx zdaje si&#281; nie ma jeszcze zaimplementowanej obs&#322;ugi persistent connections. Najlepiej j&#261;  wy&#322;&#261;czy&#263;, tzn. przypisa&#263; jej warto&#347;&#263; r&#243;wn&#261; zeru. Apache powinien to obs&#322;ugiwa&#263;. Z persistent connections wszystko powinno dzia&#322;a&#263; troch&#281; szybciej.)&lt;/p&gt;


	&lt;p&gt;Aby to uruchomi&#263;, warto stworzy&#263; plik startowy. Dla Debiana/Ubuntu nale&#380;y stworzy&#263; plik &lt;code&gt;/etc/init.d/thin.rb&lt;/code&gt; (dla wygody napisalem to w Ruby zamiast Bashu):&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;#!/usr/bin/env ruby&lt;/span&gt;

&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;fileutils&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;FileUtils&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;pids&lt;/span&gt;
  &lt;span class="constant"&gt;Dir&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;glob&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;tmp/pids/thin*.pid&lt;/span&gt;&lt;span class="punct"&gt;').&lt;/span&gt;&lt;span class="ident"&gt;map&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;entry&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; 
    &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;open&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;entry&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;read&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;start&lt;/span&gt;
  &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;pids&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;empty?&lt;/span&gt;
    &lt;span class="ident"&gt;rm_f&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;tmp/pids/thin*.pid&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;exists?&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;config/init.rb&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="comment"&gt;# start Merb&lt;/span&gt;
      &lt;span class="ident"&gt;system&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;thin start -r config.ru -C config/thin.yml&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="keyword"&gt;else&lt;/span&gt; &lt;span class="comment"&gt;# start Rails&lt;/span&gt;
      &lt;span class="ident"&gt;system&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;thin start -C config/thin.yml&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;else&lt;/span&gt;
    &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Thin cluster is already working&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;stop&lt;/span&gt;
  &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;pids&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;empty?&lt;/span&gt;
    &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Thin cluster is not working&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="keyword"&gt;else&lt;/span&gt;
    &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Stopping thin cluster&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="ident"&gt;pids&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;empty?&lt;/span&gt;
    &lt;span class="ident"&gt;pids&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="punct"&gt;{|&lt;/span&gt;&lt;span class="ident"&gt;pid&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;system&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;kill -TERM &lt;span class="expr"&gt;#{pid}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
    &lt;span class="ident"&gt;rm_f&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;tmp/pids/thin*.pid&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;restart&lt;/span&gt;
  &lt;span class="ident"&gt;stop&lt;/span&gt;
  &lt;span class="ident"&gt;sleep&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;
  &lt;span class="ident"&gt;start&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;status&lt;/span&gt;
  &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;pids&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;empty?&lt;/span&gt;
    &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Thin cluster is not working&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="keyword"&gt;else&lt;/span&gt;
    &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Thin cluster is working (pids: &lt;span class="expr"&gt;#{pids.join ', '}&lt;/span&gt;)&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;__FILE__&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="global"&gt;$0&lt;/span&gt;
  &lt;span class="ident"&gt;opts&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;%w(&lt;/span&gt;&lt;span class="string"&gt;start stop restart status&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;opts&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;include?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;ARGV&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt; &lt;span class="keyword"&gt;and&lt;/span&gt; &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;exists?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;ARGV&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
    &lt;span class="constant"&gt;Dir&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;chdir&lt;/span&gt; &lt;span class="constant"&gt;ARGV&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
    &lt;span class="ident"&gt;eval&lt;/span&gt; &lt;span class="constant"&gt;ARGV&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
  &lt;span class="keyword"&gt;else&lt;/span&gt;
    &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Syntax: ruby {&lt;span class="expr"&gt;#{File.basename($0)}&lt;/span&gt; &amp;lt;&lt;span class="expr"&gt;#{opts.join '|'}&lt;/span&gt;}&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="ident"&gt;puts&lt;/span&gt;  &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt; /path/to/rails_or_merb/project&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Nale&#380;y doda&#263; uprawnienia (&lt;code&gt;sudo chmod a+x thin.rb&lt;/code&gt;) i ustawi&#263; aby domy&#347;lnie, podczas uruchomienia ca&#322;ego serwera by&#322; uruchamiany nast&#281;puj&#261;cy skrypt (&lt;code&gt;thin_myapp.rb&lt;/code&gt;) dla konkretnego projektu Rails lub Merb (komenda &lt;code&gt;sudo update-rc.d -f thin_myapp.rb defaults&lt;/code&gt;).&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;#!/usr/bin/env ruby&lt;/span&gt;
&lt;span class="ident"&gt;path&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/path/to/rails-or-merb/project&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="ident"&gt;opts&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;%w(&lt;/span&gt;&lt;span class="string"&gt;start stop restart status&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;opts&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;include?&lt;/span&gt; &lt;span class="constant"&gt;ARGV&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
  &lt;span class="ident"&gt;system&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/etc/init.d/thin.rb &lt;span class="expr"&gt;#{ARGV[0]}&lt;/span&gt; &lt;span class="expr"&gt;#{path}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="keyword"&gt;else&lt;/span&gt;
  &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Syntax: &lt;span class="expr"&gt;#{File.basename(__FILE__)}&lt;/span&gt; {&lt;span class="expr"&gt;#{opts.join '|'}&lt;/span&gt;}&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;W wypadku &lt;a href="http://www.merbivore.com/"&gt;Merba&lt;/a&gt; trzeba pami&#281;ta&#263; aby stworzy&#263; dodatkowy plik konfiguracyjny &lt;code&gt;config.ru&lt;/code&gt; (oczywi&#347;cie dotyczy to Merba 0.9 lub nowszego):&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;# config.ru&lt;/span&gt;
&lt;span class="constant"&gt;Merb&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;BootLoader&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;run&lt;/span&gt;
&lt;span class="ident"&gt;run&lt;/span&gt; &lt;span class="constant"&gt;Merb&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Rack&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Application&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Wy&#380;ej podany plik startowy rozpoznaje czy projekt to Rails czy Merb na podstawie odnalezienia pliku &lt;code&gt;config/init.rb&lt;/code&gt;. Ale jak kto&#347; chce odpala&#263; to r&#281;cznie to Merba korzystaj&#261;cego z Thina i jego plikiu konfiguracyjnego (&lt;code&gt;config/thin.yml&lt;/code&gt;) odpala si&#281; w taki spos&#243;b:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_bash "&gt;thin start -r config.ru -C config/thin.yml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Teraz wystarczy tylko ustawi&#263; load balancing do tak uruchomionego serwera. Dla serwera &lt;a href="http://nginx.net"&gt;Nginx&lt;/a&gt; b&#281;dzie to&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_nginx "&gt;upstream thin_myapp {
  server unix:/tmp/thin_myapp.0.sock;
  server unix:/tmp/thin_myapp.1.sock;
  server unix:/tmp/thin_myapp.2.sock;
  server unix:/tmp/thin_myapp.3.sock;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;I w definicji serwera wirtualnego:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_nginx "&gt;if (!-f $request_filename) {
  proxy_pass http://thin_myapp;
  break;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Zobacz te&#380;:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://macournoyer.wordpress.com/2008/01/26/get-intimate-with-your-load-balancer-tonight/"&gt;Get intimate with your load balancer tonight!&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://macournoyer.wordpress.com/2008/02/24/staying-alive-with-thin/"&gt;Staying Alive with Thin!&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;&lt;em&gt;Update 2008-03-04:&lt;/em&gt;&lt;/p&gt;


	&lt;p&gt;Poprawi&#322;em skrypt startowy tak aby by&#322; bardziej uniwersalny w wypadku u&#380;ywania wielu projekt&#243;w Rails (lub Merb). Doda&#322;em te&#380; informacje o mo&#380;liwym problemie ze zmienn&#261; &lt;code&gt;max_persistent_conns&lt;/code&gt; w wypadku Nginksa.&lt;/p&gt;</description>
      <pubDate>Mon, 03 Mar 2008 03:36:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:fae56603-7950-4af5-8324-c4df90572cd0</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2008/03/03/thin-sockets-rails-merb</link>
      <category>merb</category>
      <category>thin</category>
      <category>rails</category>
      <category>unix</category>
      <category>nginx</category>
    </item>
  </channel>
</rss>
