<?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 thin</title>
    <link>http://blog.zabiello.com/articles/tag/thin</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Szalej&#261;ce frameworki Rubiego i Rack/WSGI</title>
      <description>&lt;p&gt;Merb w wersji 0.9 poszed&#322; na ca&#322;o&#347;&#263; i oparli sw&#243;j midleware na &lt;a href="http://rack.rubyforge.org/"&gt;Rack&amp;#8217;u&lt;/a&gt;. Jej tw&#243;rcy nie kryj&#261; si&#281; &#380;e wzorowali si&#281; na pythonowej bibliotece &lt;a href="http://www.wsgi.org/wsgi"&gt;&lt;span class="caps"&gt;WSGI&lt;/span&gt;&lt;/a&gt;. Biblioteka ta robi niez&#322;&#261; furor&#281; w kr&#281;gach Rubiego. Powstaje sporo r&#243;&#380;nych mikroframework&#243;w lub szybkich serwer&#243;w &lt;span class="caps"&gt;HTTP&lt;/span&gt; pracuj&#261;cych asynchronicznie i wykorzystuj&#261;cych Rack. Niedawno powsta&#322; &#347;wietny &lt;a href="http://code.macournoyer.com/thin/"&gt;Thin&lt;/a&gt;, a ju&#380; mo&#380;na przeczyta&#263; o &lt;a href="http://www.rubyinside.com/ebb-web-framework-http-server-786.html"&gt;2x szybszy Ebb&lt;/a&gt;. Co ciekawe, Ebb chce docelowo obs&#322;ugiwa&#263; zar&#243;wno frameworki Rubiego jak i &lt;strong&gt;Pythona&lt;/strong&gt;! Jestem ciekaw czy b&#281;dzie w stanie zdetronizowa&#263; serwer &lt;a href="http://pythonpaste.org/"&gt;Paste&lt;/a&gt;... Rack doczeka&#322; si&#281; ju&#380; swojej &lt;a href="http://github.com/booleanman/rackinterfacefilter/tree/master"&gt;implementacji w JRuby&lt;/a&gt;! Umo&#380;liwia to  tym samym odpalanie w &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; wszystkich framework&#243;w kt&#243;re korzystaj&#261; z Rack&amp;#8217;a.&lt;/p&gt;


	&lt;h2&gt;Frameworki&lt;/h2&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://rubyonrails.pl"&gt;&lt;strong&gt;Rails&lt;/strong&gt;&lt;/a&gt; &amp;#8211; najwa&#380;niejszy framework Rubiego, mo&#380;e by&#263; odpalany za pomoc&#261; Thina kt&#243;ry &lt;em&gt;u&#380;ywa Rack&lt;/em&gt;. Rails mo&#380;na odpali&#263; na JRuby nawet prosto z &lt;a href="http://www.netbeans.org/features/ruby/index.html"&gt;Netbeans 6&lt;/a&gt; :)&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://merbivore.com/"&gt;&lt;strong&gt;Merb&lt;/strong&gt;&lt;/a&gt; &amp;#8211; pretendent do detronizacji Rails, _u&#380;ywa Rack_i tym samym mo&#380;na go odpali&#263; na JRuby.&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://ramaze.net/"&gt;Ramaze&lt;/a&gt; &amp;#8211; podobnie do Merba, stara si&#281; promowa&#263; bardziek elastyczne podej&#347;cie, &lt;em&gt;u&#380;ywa Rack&lt;/em&gt;, raczej nie zagrozi Merbowi&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://fuzed.rubyforge.org/"&gt;Fuzed&lt;/a&gt; &amp;#8211; Rails z &lt;a href="http://yaws.hyber.org/"&gt;&lt;span class="caps"&gt;YAWS&lt;/span&gt;&lt;/a&gt; (szybkim serwerem &lt;span class="caps"&gt;HTTP&lt;/span&gt; napisanym w &lt;a href="http://en.wikipedia.org/wiki/Erlang_programming_language"&gt;Erlangu&lt;/a&gt;)&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.nitroproject.org/"&gt;Nitro&lt;/a&gt; &amp;#8211; typu &lt;span class="caps"&gt;MVC&lt;/span&gt; z w&#322;asnym &lt;span class="caps"&gt;ORM&lt;/span&gt; &amp;#8211; &lt;a href="http://www.nitroproject.org/docs/rdoc/classes/Og.html"&gt;Ogg&lt;/a&gt; i naciskiem na &lt;span class="caps"&gt;AJAX&lt;/span&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://enigo.com/projects/iowa/"&gt;&lt;span class="caps"&gt;IOWA&lt;/span&gt;&lt;/a&gt; &amp;#8211; komponentowy, &lt;/li&gt;
		&lt;li&gt;&lt;a href="https://rubyforge.org/projects/wee/"&gt;Wee&lt;/a&gt; wzorowany na smalltalkowym &lt;a href="http://www.seaside.st/"&gt;Seaside&lt;/a&gt; u&#380;ywaj&#261;cym &lt;a href="http://en.wikipedia.org/wiki/Continuation"&gt;kontynuacji&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://sinatra.rubyforge.org/"&gt;Sinatra&lt;/a&gt; &amp;#8211; mikroframework wzorowany na minimalistycznym, pythonowym &lt;a href="http://webpy.org"&gt;Web.py&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://sergiosantos.info/2007/7/camping-a-ruby-microframework"&gt;Camping&lt;/a&gt; &amp;#8211; kolejny mikroframework w Ruby&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://rubywaves.com/"&gt;Wave&lt;/a&gt; &amp;#8211; wzorowany na Camping, te&#380; u&#380;ywa Rack i Rubiego wsz&#281;dzie gdzie si&#281; da.&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://github.com/macournoyer/invisible/tree/master"&gt;Invisible&lt;/a&gt; mikroframework u&#380;ywaj&#261;cy Rack napisany w 35 linijkach kodu Rubiego (bardziej ciekawostka)&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;Mongrel i sp&#243;&#322;ka&lt;/h2&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.webrick.org/"&gt;Webrick&lt;/a&gt; &amp;#8211; serwer http dost&#281;pny razem ze standardow&#261; bibliotek&#261; Rubiego&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://dev.robotcoop.com/Libraries/webrick-high-performance/classes/WEBrick/HighPerformanceServer.html"&gt;Highperformance Webrick&lt;/a&gt; &amp;#8211; szybsza wersja Webricka (u&#380;ywaj&#261;ca uniksowych fork&#243;w)&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://mongrel.rubyforge.org/"&gt;Mongrel&lt;/a&gt; &amp;#8211; klasyka, napisany cz&#281;&#347;ciowo w C, to od niego zacz&#281;&#322;a si&#281; rewolucja i odej&#347;cie od FastCGI jako metody odpalania Rails&#243;w.&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://swiftiply.swiftcore.org/mongrel.html"&gt;Swiftyply i evented_mongrel&lt;/a&gt; asychroniczne, szybsze wersje Mongrela&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://code.macournoyer.com/thin/"&gt;&lt;strong&gt;Thin&lt;/strong&gt;&lt;/a&gt; &amp;#8211; asynchroniczny web server u&#380;ywaj&#261;cy Mongrela i Rack&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://ebb.rubyforge.org/"&gt;&lt;strong&gt;Ebb&lt;/strong&gt;&lt;/a&gt; &amp;#8211; u&#380;ywa Rack, wi&#281;kszo&#347;&#263; kodu jest w C, dlatego jest taki szybki, na razie ma&#322;o dokumentacji, by&#263; mo&#380;e nast&#281;pca Thin&lt;/li&gt;
	&lt;/ul&gt;</description>
      <pubDate>Tue, 04 Mar 2008 22:56:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:bdcbae56-a710-43b1-84a6-77d5471f8cac</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2008/03/04/frameworki-rubiego-rack-wsgi</link>
      <category>merb</category>
      <category>jruby</category>
      <category>rack</category>
      <category>python</category>
      <category>ruby</category>
      <category>frameworks</category>
      <category>thin</category>
      <category>rails</category>
      <category>ramaze</category>
      <category>mongerl</category>
      <category>ebb</category>
      <category>fuzed</category>
    </item>
    <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>
