<?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: Skalowanie RoR</title>
    <link>http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Skalowanie RoR</title>
      <description>&lt;p&gt;Mit o rzekomej niskiej wydajno&#347;ci Rails&#243;w wydaje si&#281; by&#263; przesadzony. Interpreter Rubiego jest co prawda wolniejszy od interpretera Pythona (i tym samym &lt;a href="http://djangoproject.com"&gt;Django&lt;/a&gt; jest szybsze od &lt;a href="http://rubyonrails.com"&gt;Rails&#243;w&lt;/a&gt;). Ale ju&#380; por&#243;wnanie Django, Rails&#243;w i pehapowego Symphony pokazuje &#380;e &lt;a href="http://wiki.rubyonrails.com/rails/pages/Framework%20Performance"&gt;Rails jest wyra&#378;nie szybszy od Symphony&lt;/a&gt; (kt&#243;ry u&#380;ywa &lt;span class="caps"&gt;PHP5&lt;/span&gt; i akceleratora!). Skoro &lt;span class="caps"&gt;PHP&lt;/span&gt; jest wolniejszy, to z szybko&#347;ci&#261; Rails&#243;w nie jest a&#380; tak &#378;le, prawda? Ale to nie wszystko, Rails posiada wygodny mechanizm kt&#243;ry pozwala bez trudu powali&#263; na kolana typow&#261; aplikacj&#281; Django.&lt;/p&gt;


	&lt;h3&gt;Si&#322;a skalowania poziomego.&lt;/h3&gt;


	&lt;p&gt;Gdy mamy na my&#347;li wydajno&#347;&#263; ca&#322;ej aplikacji to nie spos&#243;b pomin&#261;&#263; wa&#380;ny jej element: skalowalno&#347;&#263;. Aplikacj&#281; webow&#261; mo&#380;na skalowa&#263; &lt;strong&gt;pionowo&lt;/strong&gt; (dok&#322;adaj&#261;c wi&#281;cej &lt;span class="caps"&gt;RAM&lt;/span&gt;&amp;#8217;u, mocniejszy procesor) lub &lt;strong&gt;poziomo&lt;/strong&gt; (dok&#322;adaj&#261;c po prostu kolejny serwer). Ta ostatnia opcja jest szczeg&#243;lnie interesuj&#261;ca, bo do&#322;o&#380;enie mocniejszego procesora nie mo&#380;na ci&#261;gn&#261;&#263; bez ko&#324;ca.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Ruby on Rails &#347;wietnie skaluje si&#281; poziomo&lt;/strong&gt;. Zamiast klasycznego zestawu Lighttpd + kilka proces&#243;w fasctgi polecam znacznie lepszy zestaw oparty na procesach &lt;a href="http://mongrel.rubyforge.org/"&gt;mongrel&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Scenariusz 1:&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;Lighttpd na froncie obs&#322;uguje wszystkie statyczne pliki. Pozosta&#322;e kieruje do &lt;a href="http://mongrel.rubyforge.org/docs/pound.html"&gt;Pound&lt;/a&gt; (szybkiego i lekkiego load balancera&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;), kt&#243;ry z kolei kieruje ruch do kilku proces&#243;w mongrela (ka&#380;dy z nich mo&#380;e by&#263; nawet na innej maszynie).&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Scenariusz 2:&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;Apache 2.2 na froncie z wbudowanym modu&#322;em load balancera rozk&#322;ada ruch na kilka proces&#243;w mongrela.&lt;/p&gt;


	&lt;h3&gt;Przyk&#322;ad.&lt;/h3&gt;


	&lt;p&gt;Zak&#322;adam, &#380;e u&#380;yj&#281; Lighttpd + Pound + 4 procesy mongrela z roz&#322;o&#380;onym ruchem na 2 serwery. Fragment pliku konfiguracyjnego dla serwera Lighttpd:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="global"&gt;$HTTP&lt;/span&gt;&lt;span class="punct"&gt;[&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;host&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;]&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;domena.host&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;
  &lt;span class="global"&gt;$HTTP&lt;/span&gt;&lt;span class="punct"&gt;[&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;url&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;]&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;^/(cgi-bin|images|stylesheets|javascripts)&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;proxy&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;server&lt;/span&gt; &lt;span class="punct"&gt;=&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&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;(&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;host&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;127.0.0.1&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&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;port&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;9000&lt;/span&gt; &lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;))&lt;/span&gt;
  &lt;span class="punct"&gt;}&lt;/span&gt;
  &lt;span class="ident"&gt;server&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;document&lt;/span&gt;&lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="ident"&gt;root&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/domena.host/public&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;server&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;indexfiles&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;dispatch.fcgi&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
  &lt;span class="ident"&gt;server&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;error&lt;/span&gt;&lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="ident"&gt;handler&lt;/span&gt;&lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="number"&gt;404&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;/dispatch.fcgi&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Lighttpd obs&#322;uguje wszystkie pliki statyczne. Robi to wyj&#261;tkowo szybko, lepiej ni&#380; Apache. Ca&#322;y pozosta&#322;y ruch jest spi&#281;ty za pomoc&#261; proxy z procesem na porcie 9000. Na tym porcie b&#281;dzie nas&#322;uchiwa&#322; &lt;a href="http://mongrel.rubyforge.org/docs/pound.html"&gt;Pound&lt;/a&gt;, kt&#243;ry zajmie si&#281; rozk&#322;adaniem ruchu na pozosta&#322;e serwery. Plik konfiguracyjny dla Pound&amp;#8217;a mo&#380;e wygl&#261;da&#263;:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;
&lt;span class="constant"&gt;User&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;nobody&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="constant"&gt;ListenHTTP&lt;/span&gt;
  &lt;span class="constant"&gt;Address&lt;/span&gt; &lt;span class="number"&gt;0.0&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="number"&gt;0.0&lt;/span&gt;
  &lt;span class="ident"&gt;Port&lt;/span&gt;    &lt;span class="number"&gt;9000&lt;/span&gt;
  &lt;span class="ident"&gt;Service&lt;/span&gt;
    &lt;span class="ident"&gt;BackEnd&lt;/span&gt;
      &lt;span class="ident"&gt;Address&lt;/span&gt; &lt;span class="number"&gt;127.0&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="number"&gt;0.1&lt;/span&gt;
      &lt;span class="ident"&gt;Port&lt;/span&gt;    &lt;span class="number"&gt;9001&lt;/span&gt;
    &lt;span class="ident"&gt;End&lt;/span&gt;
    &lt;span class="ident"&gt;BackEnd&lt;/span&gt;
      &lt;span class="ident"&gt;Address&lt;/span&gt; &lt;span class="number"&gt;127.0&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="number"&gt;0.2&lt;/span&gt;
      &lt;span class="ident"&gt;Port&lt;/span&gt;    &lt;span class="number"&gt;9002&lt;/span&gt;
    &lt;span class="ident"&gt;End&lt;/span&gt;
    &lt;span class="ident"&gt;BackEnd&lt;/span&gt;
      &lt;span class="ident"&gt;Address&lt;/span&gt; &lt;span class="number"&gt;127.0&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="number"&gt;0.3&lt;/span&gt;
      &lt;span class="ident"&gt;Port&lt;/span&gt;    &lt;span class="number"&gt;9003&lt;/span&gt;
    &lt;span class="ident"&gt;End&lt;/span&gt;
    &lt;span class="ident"&gt;BackEnd&lt;/span&gt;
      &lt;span class="ident"&gt;Address&lt;/span&gt; &lt;span class="number"&gt;127.0&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="number"&gt;0.4&lt;/span&gt;
      &lt;span class="ident"&gt;Port&lt;/span&gt;    &lt;span class="number"&gt;9004&lt;/span&gt;
    &lt;span class="ident"&gt;End&lt;/span&gt;
  &lt;span class="ident"&gt;End&lt;/span&gt;
&lt;span class="ident"&gt;End&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Pozosta&#322;o tylko uruchomi&#263; mongrela. Po zainstalowaniu (gem install mongrel), przechodzimy do folderu z nasz&#261; aplikacj&#261; rails&#243;w i odpalamy&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;mongrel_rails&lt;/span&gt; &lt;span class="ident"&gt;cluster&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="ident"&gt;configure&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="ident"&gt;e&lt;/span&gt; &lt;span class="ident"&gt;production&lt;/span&gt; \
    &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="number"&gt;9000&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="constant"&gt;N&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="ident"&gt;c&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;opt&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;ror&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;mojprojekt&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="ident"&gt;a&lt;/span&gt; &lt;span class="number"&gt;127.0&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="number"&gt;0.1&lt;/span&gt; \
    &lt;span class="punct"&gt;--&lt;/span&gt;&lt;span class="ident"&gt;user&lt;/span&gt; &lt;span class="ident"&gt;mongrel&lt;/span&gt; &lt;span class="punct"&gt;--&lt;/span&gt;&lt;span class="ident"&gt;group&lt;/span&gt; &lt;span class="ident"&gt;mongrel&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;(Parametr -a chroni nas przed mo&#380;liwo&#347;ci&#261; zewn&#281;trznego odpalenia w przegl&#261;darce Rails&#243;w dzia&#322;aj&#261;cej bezpo&#347;rednio na kt&#243;rym&#347; z proces&#243;w mongrela).&lt;/p&gt;


	&lt;p&gt;Powinien powsta&#263; plik: config/mongrel_cluster.yml&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="punct"&gt;---&lt;/span&gt;
&lt;span class="ident"&gt;port&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;9000&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="ident"&gt;environment&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="ident"&gt;production&lt;/span&gt;
&lt;span class="ident"&gt;address&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="number"&gt;127.0&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="number"&gt;0.1&lt;/span&gt;
&lt;span class="ident"&gt;pid_file&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="ident"&gt;log&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;mongrel&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;pid&lt;/span&gt;
&lt;span class="ident"&gt;servers&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Cluster odpalamy za pomoc&#261;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;mongrel_rails&lt;/span&gt; &lt;span class="ident"&gt;cluster&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="ident"&gt;start&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Dodatkow&#261; zalet&#261; u&#380;ywania mongrela jest mo&#380;liwo&#347;&#263; wygodnego restartowania dowolnej aplikacji Rails&#243;w (a mo&#380;na ich mie&#263; przecie&#380; wiele) &lt;strong&gt;bez konieczno&#347;ci restartowania serwera &lt;span class="caps"&gt;HTTP&lt;/span&gt;&lt;/strong&gt; (mongrel_rails cluster::restart)&lt;/p&gt;


	&lt;p&gt;Poza tym mongrel &#347;wietnie nadaje si&#281; do zast&#261;pienia Webricka, standardowego serwera &lt;span class="caps"&gt;HTTP&lt;/span&gt; zalecanego do tej pory do pracy developerskiej. Zamiast&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;ruby&lt;/span&gt; &lt;span class="ident"&gt;script&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;server&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
mo&#380;na u&#380;y&#263; mongrela:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;mongrel_rails&lt;/span&gt; &lt;span class="ident"&gt;start&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Domy&#347;lnie podniesie si&#281; serwer &lt;span class="caps"&gt;HTTP&lt;/span&gt; na porcie 3000 i w trybie development (czyli identycznie jak Webrick). &lt;strong&gt;Mongrel jest jednak znacznie szybszy!&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;Dla u&#380;ytkownik&#243;w windozy te&#380; jest dobra wiadomo&#347;&#263;. Mongrel mo&#380;na zainstalowa&#263; &lt;strong&gt;jako us&#322;ug&#281; windows&#243;w&lt;/strong&gt; i zarz&#261;dza&#263; standardowo tak jak inne us&#322;ugi. Mo&#380;na np. odpali&#263; sobie na jednym porcie Rails w trybie produkcyjnym, a na drugim &amp;#8211; w trybie developerskim. W tym drugim wypadku nie trzeba restartowa&#263; serwera bo zmiany w kodzie automatycznie prze&#322;adowuj&#261; serwerek (tak jak Webrick)&lt;/p&gt;


	&lt;p&gt;Oczywi&#347;cie to wszystko &#347;licznie dzia&#322;a z &lt;a href="http://manuals.rubyonrails.com/read/book/17"&gt;Capistrano&lt;/a&gt;, railsowym systemem automatycznie synchronizuj&#261;cym zmiany na n-serwerach.&lt;/p&gt;


	&lt;p&gt;Jak dla mnie, mongrel wnosi now&#261; jako&#347;&#263; do pracy z Railsami i &lt;a href="http://mongrel.rubyforge.org/docs/index.html"&gt;warto przyjrze&#263; si&#281; mu dok&#322;adniej&lt;/a&gt;. Nie zdziwi&#322;bym si&#281;, jakby nast&#281;pne wersje Rails&#243;w standardowo zaleca&#322;y u&#380;ywanie mongrela, a nie Webricka.&lt;/p&gt;


	&lt;p&gt;Tak jak si&#322;&#261; Google s&#261; tysi&#261;ce mniejszych maszyn a nie jedna &amp;#8211; super szybka, tak nawet najszybszy serwer wyposa&#380;ony w Apache i mod_python (kt&#243;ry u&#380;ywa domy&#347;lnie Django) nie ma szans w starciu z clusterem Rails&#243;w opartym na procesach mongrel i korzystaj&#261;cych z kilku serwer&#243;w.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://blog.innerewut.de/files/images/stage_2.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Wykres z artyku&#322;u &lt;a href="http://blog.innerewut.de/articles/2006/04/21/scaling-rails-with-apache-2-2-mod_proxy_balancer-and-mongrel"&gt;Scaling Rails with Apache 2.2, mod_proxy_balancer and Mongrel&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;del&gt;-&lt;/del&gt;&lt;/p&gt;


	&lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; Dlaczego nie wykorzystywany jest load balancer wbudowany w Lighttpd? Bo jest kiepsko zaimplementowany i s&#261; problemy z restartem proces&#243;w. Dlatego zalecany jest zewn&#281;trzny load balancer lub u&#380;ycie najnowszej wersji Apache 2.2 kt&#243;ry ma ten modu&#322; dobrze zaimplementowany.&lt;/p&gt;</description>
      <pubDate>Sun, 06 Aug 2006 14:54:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:6223bd41-e2b1-45c4-8d69-36778f3246ff</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror</link>
      <category>Ruby on Rails</category>
      <category>rails</category>
    </item>
    <item>
      <title>"Skalowanie RoR" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;W og&#243;lne nie tworzy&#322;em, podlinkowa&#322;em dynamicznie obrazek z angielskiego artyku&#322;u.&lt;/p&gt;</description>
      <pubDate>Sun, 25 Feb 2007 23:42:07 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:7ed357a8-f79f-4cc8-b8ea-a8feae0bc79b</guid>
      <link>http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror#comment-562</link>
    </item>
    <item>
      <title>"Skalowanie RoR" by sickill</title>
      <description>&lt;p&gt;A ja z innej beczki.
Jakiego softu uzyles do stworzenia tego diagramu? Wyglada to naprawde znakomicie i ciekaw jestem czy to cos komercyjnego czy jakos open-source.&lt;/p&gt;</description>
      <pubDate>Sun, 25 Feb 2007 23:38:03 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:be51bc57-a7cf-41ee-8cfb-ea7a76765420</guid>
      <link>http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror#comment-561</link>
    </item>
    <item>
      <title>"Skalowanie RoR" by Tomasz Czubinski</title>
      <description>&lt;p&gt;Dodam jeszcze, ze w pound.cfg to mam na samym koncu.&lt;/p&gt;


	&lt;p&gt;Service
    BackEnd
        Address 127.0.0.1
        Port    3000
    End
End&lt;/p&gt;


	&lt;p&gt;Dzieki temu reszta zostaje przekierowana na port 3000 na ktorym jest lighttpd, ktory obsluguje wszystko co statyczne.&lt;/p&gt;


	&lt;p&gt;Zalozenie Pound jest byc na froncie i obslugiwac i filtorwac bezpiecznie http/https oczywiscie z balansowaniem.
Taki szybki i zreczny doktor/mechanik :)&lt;/p&gt;</description>
      <pubDate>Fri, 11 Aug 2006 16:13:58 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:ffa015c2-1cee-4b4f-93a9-4af15b54453f</guid>
      <link>http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror#comment-185</link>
    </item>
    <item>
      <title>"Skalowanie RoR" by Tomasz Czubinski</title>
      <description>&lt;p&gt;Na poczatku tez mialem podobna konfiguracje.
Mialem problemy z lighttpd mod_proxy i fast_cgi i rozwiazalem to nieco inaczej. Dzieki dobremu przykladowi z sieci. Jak znajde to wrzuce tutaj.&lt;/p&gt;


	&lt;p&gt;Postawilem pound na 80 z BACK ENDami na 9000-4, nastepnie mongrel_cluster 9000-4
I wszystko dziala bez lighttpd.&lt;/p&gt;


	&lt;p&gt;Jesli chodzi o lighttpd(bez proxy) to uzywam go do lzejszych statycznych spraw.&lt;/p&gt;


	&lt;p&gt;Co myslicie o tym?&lt;/p&gt;</description>
      <pubDate>Fri, 11 Aug 2006 16:00:04 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:d2a2b319-dfea-499f-bd41-b828c5eaa914</guid>
      <link>http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror#comment-184</link>
    </item>
    <item>
      <title>"Skalowanie RoR" by lopex</title>
      <description>&lt;p&gt;a to si&#281; w Rubym robi bajecznie prosto nawet bez swiga ;)&lt;/p&gt;</description>
      <pubDate>Mon, 07 Aug 2006 16:36:24 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:723d0261-dff0-44c6-b7b9-45f6450d0e0c</guid>
      <link>http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror#comment-183</link>
    </item>
    <item>
      <title>"Skalowanie RoR" by hosiawak</title>
      <description>&lt;p&gt;To, &#380;e Symphony jest du&#380;o wolniejszy od Rails&#243;w nawet z w&#322;&#261;czon&#261; akceleracj&#261; to co&#347; jednak oznacza (albo Symphony jest bardzo &#378;le napisane albo w PHP nie da si&#281; pisa&#263; szybkich skomplikowanych system&#243;w &amp;#8211; osobi&#347;cie sk&#322;aniam si&#281; do tego drugiego wniosku).&lt;/p&gt;


	&lt;p&gt;Co do Rubiego i PHP &amp;#8211; pewnie poszczeg&#243;lne funkcje PHP w por&#243;wnaniu z odpowiednikami w Rubim s&#261; szybsze. Tylko komu zale&#380;y na pojedynczych funkcjach ? Zawsze mo&#380;na skorzysta&#263; z RubyInline dla jakiego&#347; krytycznego fragmentu kodu i napisa&#263; implementacj&#281; w C :)&lt;/p&gt;</description>
      <pubDate>Mon, 07 Aug 2006 15:25:56 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:a13dfbc1-9d65-4c5c-b55c-c04421122761</guid>
      <link>http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror#comment-182</link>
    </item>
    <item>
      <title>"Skalowanie RoR" by hosiawak</title>
      <description>&lt;p&gt;Chcia&#322;em jedynie wskaza&#263; j&#281;zyk CML u&#380;ywany w Lighttpd jakos mod_cml i zarz&#261;dzanie keszowanymi statycznymi stron (page cache) kt&#243;re Railsy generuj&#261;. Ale oczywi&#347;cie mo&#380;na i tak jak napisa&#322;e&#347; powy&#380;ej, &#380;eby keszowa&#263; tylko images/javascripts/stylesheets&lt;/p&gt;</description>
      <pubDate>Mon, 07 Aug 2006 15:21:24 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:6585a217-ae7e-4315-aea2-faa4cd0eaccb</guid>
      <link>http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror#comment-181</link>
    </item>
    <item>
      <title>"Skalowanie RoR" by lopex</title>
      <description>&lt;p&gt;a YARV si&#281; bardzo szybko rozwija ;)&lt;/p&gt;</description>
      <pubDate>Mon, 07 Aug 2006 07:44:55 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:fe71da42-e2cb-41e6-b692-babeb9568116</guid>
      <link>http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror#comment-180</link>
    </item>
    <item>
      <title>"Skalowanie RoR" by rsz</title>
      <description>&lt;p&gt;To, &#380;e Symphony jest wolny, nie znaczy, &#380;e PHP jest wolniejszy od Rubiego (jest oczywi&#347;cie odwrotnie). Zupe&#322;nie b&#322;&#281;dny i myl&#261;cy czytelnik&#243;w wniosek!&lt;/p&gt;</description>
      <pubDate>Mon, 07 Aug 2006 07:14:02 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:5b52e84e-5a97-4d83-a989-1c66108822bd</guid>
      <link>http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror#comment-179</link>
    </item>
    <item>
      <title>"Skalowanie RoR" by Jaros&#322;aw zabie&#322;&#322;o</title>
      <description>&lt;p&gt;Ale&#380; napisa&#322;em. Przyjrzyj si&#281; dok&#322;adnie:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;...
$HTTP[&amp;quot;url&amp;quot;] !~ &amp;quot;^/(cgi-bin|images|stylesheets|javascripts)&amp;quot; {
    proxy.server = ( &amp;quot;/&amp;quot; =&amp;gt; ( ( &amp;quot;host&amp;quot; =&amp;gt; &amp;quot;127.0.0.1&amp;quot; , &amp;quot;port&amp;quot; =&amp;gt; 9000 ) ))
}
server.document-root = &amp;quot;/home/httpd/domena.host/public&amp;quot;
...&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Ten wpis m&#243;wi, &#380;e je&#347;li w url NIE wyst&#281;puje na pocz&#261;tku &#380;adne ze s&#322;&#243;w: cgi-bin, images, stylesheets czy javascripts, to wtedy ma przekazywa&#263; request do load balancera. Wszystkie inne requesty maj&#261; by&#263; obs&#322;ugiwane przez Lighttpd (czyli ze &#347;cie&#380;ki document.root)&lt;/p&gt;


	&lt;p&gt;Co do lighttpd i svn, to wol&#281; poczeka&#263; na wersj&#281; oficjaln&#261;.&lt;/p&gt;</description>
      <pubDate>Mon, 07 Aug 2006 06:23:21 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:a32a4753-f707-4ed7-93dd-7314915fbf8d</guid>
      <link>http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror#comment-177</link>
    </item>
    <item>
      <title>"Skalowanie RoR" by hosiawak</title>
      <description>&lt;p&gt;lighttpd w trunku svn&amp;#8217;a posiada juz poprawna obsluge proxy, czyli dziala prawid&#322;owo jako load balancer. Nie napisa&#322;e&#347; jak dok&#322;adnie rozwi&#261;za&#263; spraw&#281; wysy&#322;ania statycznych stron do lighttpd. :) (Tutaj &lt;a href="http://mongrel.rubyforge.org/docs/lighttpd.html" rel="nofollow"&gt;link&lt;/a&gt; ze szczeg&#243;&#322;ami)&lt;/p&gt;</description>
      <pubDate>Mon, 07 Aug 2006 04:07:02 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:b949d88a-f1b8-48bb-b86e-7c226a3f11a7</guid>
      <link>http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror#comment-176</link>
    </item>
    <item>
      <title>"Skalowanie RoR" by lopex</title>
      <description>&lt;p&gt;Tutaj jest fajne howto:
&lt;a href="http://blog.codahale.com/2006/06/19/time-for-a-grown-up-server-rails-mongrel-apache-capistrano-and-you/" rel="nofollow"&gt;http://blog.codahale.com/2006/06/19/time-for-a-grown-up-server-rails-mongrel-apache-capistrano-and-you/&lt;/a&gt;
;)&lt;/p&gt;</description>
      <pubDate>Sun, 06 Aug 2006 18:52:04 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:d69527c0-3426-44d6-801f-66ab1132935b</guid>
      <link>http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror#comment-174</link>
    </item>
    <item>
      <title>"Skalowanie RoR" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;Musz&#281; zobaczy&#263; ten skrypt startowy. Nie wiedz&#261;c o tym, napisa&#322;em go sobie od zera. :)&lt;/p&gt;</description>
      <pubDate>Sun, 06 Aug 2006 18:18:52 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:1d82a35f-62c0-4a92-82da-2389dd68c941</guid>
      <link>http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror#comment-173</link>
    </item>
    <item>
      <title>"Skalowanie RoR" by lopex</title>
      <description>&lt;p&gt;oops, w gemie mongrel_cluster&lt;/p&gt;</description>
      <pubDate>Sun, 06 Aug 2006 16:48:55 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:1ef34413-9bc6-453b-b6e7-8ac9a152a098</guid>
      <link>http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror#comment-171</link>
    </item>
    <item>
      <title>"Skalowanie RoR" by lopex</title>
      <description>&lt;p&gt;Pono&#263; pen jest szybszy od pounda, z drugiej strony ten drugi jest wygodniejszy. W gemie Mongrela znajduj&#261; si&#281; dodatkowe recipes do capistrano plus skrypt startowy system V &amp;#8211; wystarczy podlinkowac.&lt;/p&gt;</description>
      <pubDate>Sun, 06 Aug 2006 16:47:53 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:117ad571-d733-490c-a0ca-4be139999b82</guid>
      <link>http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror#comment-170</link>
    </item>
  </channel>
</rss>
