<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/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 mongrel</title>
    <link>http://blog.zabiello.com/articles/tag/mongrel</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>W&#347;ciek&#322;y Zed i dyskusja wok&#243;&#322; Rubiego i Rails&#243;w</title>
      <description>&lt;p&gt;Ostatnio jest troch&#281; szumie w bran&#380;y po bezpardonowym (i niewybrednym) &lt;a href="http://www.zedshaw.com/rants/rails_is_a_ghetto.html"&gt;ataku Zeda Shaw&lt;/a&gt; uderzaj&#261;cym w kilka znanych postaci z kr&#281;g&#243;w Rubiego i Rails. Pewnie nikt by na to nie zwr&#243;ci&#322; uwagi gdyby nie to, &#380;e Zed jest autorem znanego projektu &lt;a href="http://mongrel.rubyforge.org/"&gt;Mongrel&lt;/a&gt;. Cho&#263; wpis si&#281; &#378;le czyta (bo jest rozwlek&#322;y i niepotrzebnie przeplatany ci&#261;g&#322;ymi przekle&#324;stwami autora) to zwr&#243;ci&#322; uwag&#281; na kilka istotnych problem&#243;w.&lt;/p&gt;


	&lt;p&gt;Autor zwraca uwag&#281;, &#380;e core team Rails&#243;w dosy&#263; opornie i wolno reaguje na podsy&#322;ane uwagi i poprawki. Fakt, jedn&#261; z poprawek jak&#261; kiedy&#347; podes&#322;a&#322;em odno&#347;nie &#378;le dzia&#322;aj&#261;cej funkcji render_to_string uwzgl&#281;dniono po.. o&#347;miu miesi&#261;cach. Zed si&#281; wkurzy&#322;, &#380;e ignorowano jego uwagi a potem i tak wychodzi&#322;o na jego. Tak z po&#322;owa core teamu to wg niego banda idiot&#243;w z wyp&#322;ukanymi przez &lt;span class="caps"&gt;PHP&lt;/span&gt;  m&#243;zgami. Ze swej strony bym m&#243;g&#322; do tej listy niekompetencji owej &amp;#8220;bandy&amp;#8221; te&#380; co&#347; do&#322;o&#380;y&#263;, ale to nie jest najwa&#380;niejsze. Jest reszta, kt&#243;ra dobrze robi swoj&#261; robot&#281;.  Ale mo&#380;e taka krytyka podzia&#322;a jak kube&#322; zimnej wody i w ko&#324;cu ca&#322;y core team zacznie skupia&#263; si&#281; na jako&#347;ci i optymalizacji ju&#380; istniej&#261;cego kodu. Bo jak nie, to programi&#347;ci Rails zaczn&#261; sukcesywnie przesuwa&#263; si&#281; do konkurencyjnego projektu &lt;a href="http://merbivore.com/"&gt;Merb&lt;/a&gt;. Ezra Zygmuntowicz udowodni&#322;, &#380;e mo&#380;na napisa&#263; &amp;#8220;lepsze Railsy&amp;#8221; (szybsze,  wielow&#261;tkowe i bardziej przejrzyste). Podoba mi si&#281; in&#380;ynieryjne podej&#347;cie Ezry Zygmuntowicza. Jego Merb jest bardzo &#322;adny, przejrzysty i szybki. Co ciekawe, Ezra zatrudni&#322; kilku developer&#243;w &lt;a href="http://rubini.us/"&gt;Rubiniusa&lt;/a&gt;. Zapowiada si&#281; &#380;e Railsy w ko&#324;cu spotka&#322;y bardzo trudn&#261; konkurencj&#281; (i bardzo dobrze). Sytuacj&#281; Rals&#243;w pog&#322;&#281;bia to, &#380;e nowe &lt;span class="caps"&gt;ORM&lt;/span&gt;&amp;#8217;y takie jak &lt;a href="http://datamapper.org/why.html"&gt;DataMapper&lt;/a&gt; i &lt;a href="http://code.google.com/p/ruby-sequel/"&gt;Sequel&lt;/a&gt; r&#243;wnie&#380; stanowi&#261; zagro&#380;enie dla dominacji &lt;a href="http://ar.rubyonrails.com/"&gt;Active Record&lt;/a&gt; nawet w kontek&#347;cie Rails&#243;w.&lt;/p&gt;


	&lt;h3&gt;PickAxe i inne ksi&#261;&#380;ki&lt;/h3&gt;


	&lt;p&gt;Zed przeprowadzi&#322; bardzo ciekaw&#261; krytyk&#281; chwalonej &lt;a href="http://helion.pl/ksiazki/prruby.htm"&gt;PickAxe&lt;/a&gt;. Ostro rozjecha&#322; autora za u&#380;ywanie g&#322;upich przyk&#322;ad&#243;w, niezgodnego z konwencjami Rubiego nazewnictwem zmiennych, i co najwa&#380;niejsze, omini&#281;cie szerokim &#322;ukiem najwa&#380;niejszej i najbardziej atrakcyjnej cechy Rubiego &amp;#8211; &#322;atwo&#347;ci metaprogramowania. PickAxe, zdaniem Zeda, odwo&#322;uje si&#281; do starych praktyk projektowania obiektowego z roku 2001. Zed idzie nawet dalej, uwa&#380;a &#380;e ta ksi&#261;&#380;ka promuje z&#322;e nawyki programistyczne i zach&#281;ca do pisania z&#322;ego kodu. Twierdzi nawet, &#380;e ta ksi&#261;&#380;ka zamiast pom&#243;c, zaszkodzi&#322;a Rubiemu aby wcze&#347;niej wyp&#322;yn&#261;&#322; na szerok&#261; scen&#281;.&lt;/p&gt;


	&lt;p&gt;Faktycznie, w latach 2001-2004 o Ruby praktycznie nikt nie s&#322;ysza&#322;. Jakie&#347; nieliczne wyj&#261;tki uczy&#322;y si&#281; Rubiego na &lt;a href="http://www.ruby-doc.org/docs/ProgrammingRuby/"&gt;ksi&#261;&#380;ce Dave&amp;#8217;a Thomasa&lt;/a&gt; ale j&#281;zyk jako taki by&#322; czym&#347; bardzo malo znanym. Sytuacj&#281; zmieni&#322;o dopiero pojawienie &lt;a href="http://rubyonrails.org"&gt;Ruby on Rails&lt;/a&gt; w 2005 roku, ktore spowodowa&#322;y &lt;strong&gt;znacz&#261;cy wzrost&lt;/strong&gt; popularno&#347;ci Rubiego (ja sam te&#380; zainteresowa&#322;em si&#281; te&#380; Railsami, a dopiero p&#243;&#378;niej Rubim). &lt;strong&gt;Dopiero Railsy pokaza&#322;y pi&#281;kno i moc metaprogramowania w Ruby&lt;/strong&gt;, co&#347; co zachwyci&#322;o rzesze ludzi, co&#347; czego nie maj&#261; inne j&#281;zyki. I nie wiem jak by si&#281; wysilano, nie da si&#281; uzyska&#263; tak pi&#281;knego i eleganckiego metaproramowania w &lt;span class="caps"&gt;PHP&lt;/span&gt;, Javie, czy nawet Pythonie. Zed bezpardonowo stwierdzi&#322;, &#380;e PickAxe tylko zaszkodzi&#322; Rubiemu zamiast mu pom&#243;c.&lt;/p&gt;


	&lt;p&gt;Wpierw mnie zaskoczy&#322;a ta opinia, ale p&#243;&#378;niej, jak si&#281; zastanowi&#322;em, to musz&#281; przyzna&#263; &#380;e du&#380;o w tym racji. Nigdy do mnie nie przemawia&#322;y u&#380;yte w ksi&#261;&#380;ce przyk&#322;ady. Ceni&#322;em j&#261; g&#322;&#243;wnie za to, &#380;e w og&#243;le jest cokolwiek na temat Rubiego, i &#380;e opisano bibliotek&#281; standardow&#261; Rubiego. Jestem ciekaw, co Zed by powiedzia&#322; na ksi&#261;&#380;k&#281; Hala Fultona &amp;#8220;The Ruby Way&amp;#8221;. Jej drugie wydanie w&#322;a&#347;nie &lt;a href="http://helion.pl/ksiazki/swruby.htm"&gt;zosta&#322;o wydane po polsku&lt;/a&gt;. Szkoda tylko, &#380;e ma w polskim wydaniu myl&#261;cy tytu&#322; sugeruj&#261;cy, &#380;e to tylko jaki&#347; zestaw 400 przyk&#322;ad&#243;w. Ksi&#261;&#380;k&#281; si&#281; dosy&#263; dobrze czyta. Lepiej ni&#380; PickAxe. T&#261; pierwsz&#261; troch&#281; traktuj&#281; jak podr&#281;cznik do bibliotek Rubiego.&lt;/p&gt;


	&lt;p&gt;Co ciekawe, dosta&#322;o si&#281; te&#380; troch&#281; ksi&#261;&#380;ce &lt;a href="http://helion.pl/ksiazki/agilep.htm"&gt;Agile&lt;/a&gt; :) Ale generalnie du&#380;o nie ma co si&#281; przyczepi&#263;. Ksi&#261;&#380;ka jest raczej dobrze napisana, szkoda tylko, &#380;e opisuje starsze Rails 1.2 a nie 2.0. No c&#243;&#380;, nie wiadomo czy wyjdzie trzecie wydanie, bo &lt;a href="http://www.loudthinking.com/about.html"&gt;&lt;span class="caps"&gt;DHH&lt;/span&gt;&lt;/a&gt; jako&#347; si&#281; do niego nie pali.&lt;/p&gt;


	&lt;p&gt;Z ciekawo&#347;ci sprawdzi&#322;em inn&#261; ksi&#261;&#380;k&#281;, polecan&#261; przez Zeda, &lt;a href="http://www.amazon.com/Rails-Way-Addison-Wesley-Professional-Ruby/dp/0321445619/"&gt;The Rails Way&lt;/a&gt;. Faktycznie wygl&#261;da na dobrze napisan&#261; i uwzgl&#281;dnia nowsze cechy Rails&#243;w. Jest dost&#281;pna online (cho&#263; nie za darmo) przez &lt;a href="http://safari.oreilly.com/"&gt;O&amp;#8217;Reilly Safari Books Online&lt;/a&gt; (tak w og&#243;le to &#347;wietny serwis, kt&#243;ry warto sobie zaprenumerowa&#263;).&lt;/p&gt;


	&lt;h3&gt;Rubinius, JRuby i Jubinius&lt;/h3&gt;


	&lt;p&gt;Zed si&#281; wkurzy&#322;, nabluzga&#322;, ale zwr&#243;ci&#322; uwag&#281; na kilka wa&#380;nych kwestii. Tak&#380;e odno&#347;nie samego Rubiego to pochwa&#322;a dosta&#322;a si&#281; &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; i &lt;a href="http://rubini.us/"&gt;Rubiniusowi&lt;/a&gt;. Szczeg&#243;lnie ten drugi mo&#380;e wkr&#243;tce kompletnie zagrozi&#263; dominacji &lt;span class="caps"&gt;MRI&lt;/span&gt; jaki jest u&#380;ywany w dzisiejszej, opartej na C, implemementacji Rubiego. Je&#347;li szybko nie powstanie kompletnie uko&#324;czony &lt;a href="http://www.atdot.net/yarv/"&gt;&lt;span class="caps"&gt;YARV&lt;/span&gt;&lt;/a&gt; (w&#322;&#261;czony do Ruby 1.9), to Rubinius zwyci&#281;&#380;y. Temat Rubiniusa jest on tematem naszych dyskusji na kanale &lt;span class="caps"&gt;IRC&lt;/span&gt; &lt;a href="irc://irc.eu.freenode.net/rubyonrails.pl"&gt;#rubyonrails.pl&lt;/a&gt;. Podej&#347;cie jest tu troch&#281; podobne do pythonowego &lt;a href="http://codespeak.net/pypy/dist/pypy/doc/news.html"&gt;PyPy&lt;/a&gt;, cho&#263; Rubinius nawi&#261;zuje bardziej do 30 lat do&#347;wiadcze&#324; &lt;a href="http://www.smalltalk.org/main/"&gt;Smalltalka&lt;/a&gt;. Celem jest stworzenie najszybszej wirtualnej maszyny Rubiego oraz &#322;atwego i szybkiego rozwoju dla samego Rubiego. Dzi&#281;ki temu, &#380;e mamy tu do czynienia z Ruby kt&#243;rego implementacja napisana jest w Ruby, znacznie &#322;atwiej jest rozwija&#263; j&#281;zyk.&lt;/p&gt;


	&lt;p&gt;Co ciekawe, autorzy JRuby zastanawiaj&#261; si&#281; czy nie zrobi&#263; podobnie. I ju&#380; s&#261; dyskusj&#281; o tym aby stworzy&#263; analogicznie &lt;a href="http://ola-bini.blogspot.com/2007/09/rubinius-is-important.html"&gt;Jubiniusa&lt;/a&gt;. Tak jak Rubinius w &#322;atwy spos&#243;b wci&#261;ga biblioteki napisane w C, Jubinius wci&#261;ga&#322;by te napisane w Javie. Jubinius mia&#322;by dodatkowo o tyle wygodniejsz&#261; sytuacj&#281;, &#380;e implementacja ca&#322;ej biblioteki standardowej Rubiego jest ju&#380; przepisana do Rubiego. Jubinius m&#243;g&#322;by z marszu wykorzysta&#263; ten kod.&lt;/p&gt;</description>
      <pubDate>Sun, 06 Jan 2008 23:49:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:1c2f3888-12a8-42dd-b190-ddd345a03248</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2008/01/06/zed-ruby-rails</link>
      <category>mongrel</category>
      <category>ruby</category>
      <category>rubinius</category>
      <category>merb</category>
      <category>rails</category>
      <category>datamapper</category>
      <category>sequel</category>
      <category>activerecord</category>
      <category>jruby</category>
      <category>jubinius</category>
    </item>
    <item>
      <title>Szybszy, asynchroniczny Mongrel z EventMachine lub Swiftiply</title>
      <description>&lt;p&gt;Du&#380;o si&#281; zmieni&#322;o od czasu zalecania u&#380;ywania Rails&#243;w w trybie FastCGI. To si&#281; nie sprawdzi&#322;o i miejsce zestawu Lighttpd + FastCGI zaj&#261;&#322; Apache2/Nginx + proxy do Mongrel clustera. Z Mongrel clusterem jest jednak problem, &#380;e nie dzia&#322;a poza systemami uniksowymi. Poza tym uda&#322;o mi si&#281; zaobserwowa&#263; kilka razy pewn&#261; niestabilno&#347;&#263; dla mongrel clustera: czasami pojedynczy Mongrel si&#281; zawiesi i trzeba restartowa&#263; ca&#322;y ich klaster. Wi&#281;ksz&#261; stabilno&#347;&#263; i du&#380;o wi&#281;ksz&#261; wydajno&#347;&#263; (szczeg&#243;lnie przy wielu r&#243;wnoleg&#322;ych &#380;&#261;daniach) zapewnia&#263; Mongrel dzia&#322;aj&#261;cy z &lt;a href="http://swiftiply.swiftcore.org/"&gt;Swiftiply&lt;/a&gt; lub z &lt;a href="http://rubyeventmachine.com/"&gt;EventMachine&lt;/a&gt;.&lt;/p&gt;


	&lt;h3&gt;Swiftiply&lt;/h3&gt;


	&lt;p&gt;&lt;a href="http://swiftiply.swiftcore.org/"&gt;Swiftiply&lt;/a&gt; jest reklamowany jako klasterowy proxy dla aplikacji internetowych. Korzysta z trwa&#322;ych po&#322;&#261;cze&#324; z klientami i mo&#380;na go skalowa&#263; bez zmian w konfiguracji i restart&#243;w. Po prostu podpina si&#281; kolejny Mongrel z kolejnego komputera do tego samego adresu IP i zostaje automatycznie w&#322;&#261;czony do p&#281;tli obs&#322;ugi zdarze&#324;. Dzi&#281;ki Ezrze Zygmuntowiczowi, gem Swiftiply udost&#281;pnia te&#380; gotowy, przerobiony Mongrel dzia&#322;aj&#261;cy zar&#243;wno z Swiftiply jak i EventMachine. Sam serwer Swiftiply mo&#380;e dzia&#322;a&#263; w og&#243;le bez zewn&#281;trznego serwera &lt;span class="caps"&gt;HTTP&lt;/span&gt;, ale ci co ceni&#261; sobie max. wydajno&#347;&#263; pewnie i tak b&#281;d&#261; chcieli na froncie postawi&#263; szybkiego &lt;a href="http://nginx.net"&gt;Nginxa&lt;/a&gt;. Wystarczy spi&#261;&#263; go przez mod_proxy do jednego (sic!) Mongrela odpalonego w trybie Swiftiply.&lt;/p&gt;


	&lt;h3&gt;EventMachine&lt;/h3&gt;


	&lt;p&gt;&lt;a href="http://rubyeventmachine.com/"&gt;EventMachine&lt;/a&gt; to biblioteka napisana w C dla program&#243;w Rubiego, Javy i C++.  S&#322;u&#380;y do obs&#322;ugi zdarze&#324; w spos&#243;b &lt;strong&gt;asynchroniczny&lt;/strong&gt; zamiast wielow&#261;tkowy (podobnie jak to robi pythonowy &lt;a href="http://twistedmatrix.com"&gt;Twisted&lt;/a&gt;). EventMachine jest bibliotek&#261; bardzo szybk&#261;. Serwer pracuj&#261;cy asynchronicznie nie wpada w blokady i jest cz&#281;sto szybszy od serwer&#243;w pracuj&#261;cych wielow&#261;tkowo.&lt;/p&gt;


	&lt;p&gt;Zamiast tworzy&#263; wiele proces&#243;w Mongrela aby zapewni&#263; r&#243;wnoleg&#322;&#261; prac&#281; dla Rails, wystarczy odpali&#263; &lt;strong&gt;jeden&lt;/strong&gt; (sic!) proces Mongrela asynchronicznego. Asynchroniczny Mongrel dzia&#322;a zar&#243;wno z Railsami jaki &lt;a href="http://merbivore.com/"&gt;Merbem&lt;/a&gt;. Nie musz&#281; m&#243;wi&#263;, jakie s&#261; oszcz&#281;dno&#347;ci na pami&#281;ci w por&#243;wnaniu do klastra proces&#243;w Mongrela kt&#243;ry zwykle zaleca si&#281; u&#380;ywa&#263; dla Rails&#243;w! Z prostych test&#243;w por&#243;wnawczych wysz&#322;o mi &#380;e Mongrel asynchroniczny jest jakie&#347; dwa razy szybszy od Mongrela wielow&#261;tkowego. (Zobacz te&#380; &lt;a href="http://journal.andrewloe.com/2007/5/22/mongrel-vs-evented-mongrel"&gt;Mongrel vs Evented Mongrel&lt;/a&gt;)&lt;/p&gt;


	&lt;h3&gt;Jak to skonfigurowa&#263;?&lt;/h3&gt;


	&lt;p&gt;Po zainstalowaniu gemu Swiftiply stary skrypt &lt;code&gt;mongrel_rails&lt;/code&gt; zostaje zast&#261;piony nowszym (ale tak, &#380;e jest zgodny ze starym mongrelem wielow&#261;tkowym). Sterowanie trybem pracy dokonywane jest przez ustawienie stosownej &lt;em&gt;zmiennej &#347;rodowiskowej&lt;/em&gt;. Np. aby odpali&#263; Mongrela w trybie asynchronicznym wystarczy napisa&#263;&lt;/p&gt;


&lt;script:typo lang="bash"&gt;
&lt;span class="caps"&gt;EVENT&lt;/span&gt;=1 mongrel_rails start
&lt;/script:typo&gt;

	&lt;p&gt;Poni&#380;ej prosty skrypt startuj&#261;cy jaki napisa&#322;em dla Ubuntu (wszystkie opcje wy&#347;wietli polecenie &lt;code&gt;mongrel_rails&lt;/code&gt; start -h@)&lt;/p&gt;


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

&lt;span class="constant"&gt;ADDR&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;127.0.0.1&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; 
&lt;span class="constant"&gt;PORT&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;7100&lt;/span&gt;
&lt;span class="comment"&gt;# &#346;cie&#380;ka do projektu RoR:&lt;/span&gt;
&lt;span class="constant"&gt;ROOT&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;/home/app/rails/homepage/current&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="constant"&gt;PID&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{ROOT}&lt;/span&gt;/log/blog.pid&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="constant"&gt;USER&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;www-data&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="constant"&gt;GROUP&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;www-data&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="constant"&gt;APPL&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;/usr/bin/mongrel_rails&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;cmd_start&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;env EVENT=1 &lt;span class="expr"&gt;#{APPL}&lt;/span&gt; start -a &lt;span class="expr"&gt;#{ADDR}&lt;/span&gt; -p &lt;span class="expr"&gt;#{PORT}&lt;/span&gt; --user &lt;span class="expr"&gt;#{USER}&lt;/span&gt; --group &lt;span class="expr"&gt;#{GROUP}&lt;/span&gt; -P &lt;span class="expr"&gt;#{PID}&lt;/span&gt; -e production -d&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; 
&lt;span class="ident"&gt;cmd_stop&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{APPL}&lt;/span&gt; stop -P &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="ident"&gt;curdir&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;pwd&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;ROOT&lt;/span&gt;

&lt;span class="keyword"&gt;case&lt;/span&gt; &lt;span class="constant"&gt;ARGV&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;first&lt;/span&gt;
&lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;start&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;system&lt;/span&gt; &lt;span class="ident"&gt;cmd_start&lt;/span&gt;
&lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;stop&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;system&lt;/span&gt; &lt;span class="ident"&gt;cmd_stop&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;(&lt;/span&gt;&lt;span class="constant"&gt;PID&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;restart&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;system&lt;/span&gt; &lt;span class="ident"&gt;cmd_stop&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;(&lt;/span&gt;&lt;span class="constant"&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="ident"&gt;cmd_start&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;Usage: sudo &lt;span class="expr"&gt;#{__FILE__}&lt;/span&gt; {start|stop|restart}&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="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="ident"&gt;curdir&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Jeszcze tylko komenda&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_bash "&gt;cd /etc/init.d
update-rc.d -f mogrel_home.rb defaults&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;i Ubuntu b&#281;dzie automatycznie ten skrypt uruchamia&#322; podczas restartu maszyny.&lt;/p&gt;


	&lt;p&gt;Odno&#347;nie Nginxa to nie trzeba wiele zmienia&#263; poza tym, aby skierowa&#263; proxy na jeden port (w tym wypadku 7100)&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_nginx "&gt;upstream mongrel_blog {
  server 127.0.0.1:7100;
}

server {
  # ... inne opcje
  location / {
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect false;
    # ... reszta opcji
    if (!-f $request_filename) {
      proxy_pass http://mongrel_blog;
      break;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Stary &lt;code&gt;mongrel_cluster&lt;/code&gt; doczeka&#322; si&#281; konkurencji w postaci gema &lt;a href="http://rubyforge.org/projects/mongrel-cow/"&gt;mongrel_cow_cluster&lt;/a&gt; kt&#243;ry r&#243;wnie&#380; powinien szybciej dzia&#322;a&#263; od mongrel_cluster&amp;#8217;a. Nawet zwolennicy Webricka mog&#261; sobie doinstalowa&#263; co&#347; szybszego od domy&#347;lnego Webricka &amp;#8211; forkowy &lt;code&gt;webrick-high-performance&lt;/code&gt; (tylko systemy uniksowe). Ale wydaje mi si&#281;, &#380;e najlepszym rozwi&#261;zaniem jest Mongrel asynchroniczny.&lt;/p&gt;


	&lt;p&gt;Zobacz te&#380; entuzjastyczn&#261; opini&#281; &lt;a href="http://brainspl.at/articles/2007/05/12/event-driven-mongrel-and-swiftiply-proxy"&gt;Ezry Zygmuntowicza o event Mongrelu i o  Swiftiply&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Mon, 24 Dec 2007 14:21:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:86233fa6-a48d-492a-b8a2-4240d144349b</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2007/12/24/event-mongrel</link>
      <category>switiply</category>
      <category>mongrel</category>
      <category>eventmachine</category>
      <category>asynchronic</category>
      <category>rails</category>
      <category>ruby</category>
    </item>
    <item>
      <title>Uniksowy skrypt /etc/init.d w Ruby</title>
      <description>&lt;p&gt;Ruby ca&#322;kiem dobrze nadaje si&#281; do pisania skrypt&#243;w systemowych. W sumie nie wiem dlaczego do tej pory pisa&#322;em skrypty tego typu w uniksowym bash&amp;#8217;u. :)&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="constant"&gt;MONGREL&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/usr/bin/mongrel_rails&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="constant"&gt;PROJECT&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/home/httpd/somedomain.com/rails_project&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;execute&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;action&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;project&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="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;project&lt;/span&gt;&lt;span class="punct"&gt;)&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;&lt;span class="expr"&gt;#{MONGREL}&lt;/span&gt; &lt;span class="expr"&gt;#{action}&lt;/span&gt;...&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="global"&gt;$defout&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;flush&lt;/span&gt; &lt;span class="comment"&gt;# unbuffered output&lt;/span&gt;
  `&lt;span class="comment"&gt;#{MONGREL} cluster::#{action}`&lt;/span&gt;
  &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;done&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;case&lt;/span&gt; &lt;span class="constant"&gt;ARGV&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;first&lt;/span&gt;
  &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;start&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="ident"&gt;execute&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;start&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="constant"&gt;PROJECT&lt;/span&gt;
  &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;stop&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="ident"&gt;execute&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;stop&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="constant"&gt;PROJECT&lt;/span&gt;
  &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;restart&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="ident"&gt;execute&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;restart&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="constant"&gt;PROJECT&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="punct"&gt;%w{&lt;/span&gt;&lt;span class="string"&gt;start stop restart&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="ident"&gt;first&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;Usage: sudo &lt;span class="expr"&gt;#{__FILE__}&lt;/span&gt; {start|stop|restart}&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;exit&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 29 Sep 2006 14:04:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:8cb51bb5-b36b-493e-8e04-073e3f28170f</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/09/29/uniksowy-skrypt-etc-init-d-w-ruby</link>
      <category>Ruby</category>
      <category>ruby</category>
      <category>linux</category>
      <category>mongrel</category>
    </item>
  </channel>
</rss>
