<?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 nginx</title>
    <link>http://blog.zabiello.com/articles/tag/nginx</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>
    <item>
      <title>Nginx i problem z wyd&#322;u&#380;onym timeoutem dla FastCGI</title>
      <description>&lt;p&gt;Domy&#347;lne timeouty Nginxa s&#261; dosy&#263; kr&#243;tkie (60 s.) i czasami trzeba je wyd&#322;u&#380;y&#263;. Np. podczas aktualizacji du&#380;ego forum w &lt;span class="caps"&gt;PHP&lt;/span&gt; gdzie tego typu operacj&#281; robi si&#281; zwykle z poziomu przegl&#261;darki. Przeszukuj&#261;c stron&#281; domow&#261; &lt;a href="http://nginx.net"&gt;Nginxa&lt;/a&gt; i internet znalaz&#322;em tylko opis wyd&#322;u&#380;enia timeoutu dla po&#322;&#261;cze&#324; proxy (&lt;code&gt;proxy_read_timeout 15m;&lt;/code&gt;) Dzia&#322;a to dobrze w wypadku typowych po&#322;acze&#324; proxy, np. &lt;a href="http://mongrel.rubyforge.org/"&gt;Mongrela&lt;/a&gt; i Rails&#243;w, ale nie dzia&#322;a dla &lt;span class="caps"&gt;PHP&lt;/span&gt;, kt&#243;ry u&#380;ywa FastCGI i procesu spawn-fcgi b&#281;d&#261;cego cz&#281;&#347;ci&#261; serwera Lighttpd.&lt;/p&gt;


	&lt;p&gt;Po bezproduktywnej pr&#243;bie z ustawieniami Nginxa, spr&#243;bowa&#322;em jego konkurenta, &lt;a href="http://www.cherokee-project.com/"&gt;Cherokee&lt;/a&gt;. Niestety ten ma jeszcze ubo&#380;sz&#261; dokumentacj&#281; i nic nie wymy&#347;li&#322;em. W ko&#324;cu, zrezygnowany, postawi&#322;em Apache2 bo ten nie mia&#322; &#380;adnych problem&#243;w z dowolnie d&#322;ugo wisz&#261;cym procesem (w&#322;a&#347;ciwie to w&#261;tkiem, bo uruchomi&#322;em wersj&#281; wielow&#261;tkow&#261;). Wystarczy&#322;o wyd&#322;u&#380;y&#263; czasy odpowiedzi w php.ini i posz&#322;o.&lt;/p&gt;


	&lt;p&gt;Ostatecznie, uda&#322;o mi si&#281; uzyska&#263; brakuj&#261;c&#261; informacj&#281; od Igora Sysojewa, tw&#243;rcy Nginxa. Rozwi&#261;zanie by&#322;o proste, cho&#263; nie znajdowa&#322;o si&#281; w dokumentacji. Trzeba by&#322;o ustawi&#263;: &lt;code&gt;fastcgi_read_timeout 15m;&lt;/code&gt; Ca&#322;e szcz&#281;&#347;cie, bo niezbyt u&#347;miecha&#322;o mi si&#281; wraca&#263; do wolniejszego i bardziej zasobo&#380;ernego Apache&amp;#8217;a.&lt;/p&gt;</description>
      <pubDate>Mon, 30 Jul 2007 12:10:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:e9535481-d43e-4e6c-b0c7-eed5b01e82bf</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2007/07/30/nginx-timeouts</link>
      <category>nginx</category>
    </item>
    <item>
      <title>Nginx - Apache killer</title>
      <description>&lt;p&gt;W ostatnim artykule (&lt;a href="http://blog.zabiello.com/articles/2006/10/29/railsy-lighttpd-czy-apache-2-2-x"&gt;Railsy: Lighttpd czy Apache 2.2.x?&lt;/a&gt;) por&#243;wnywa&#322;em najbardziej popularne serwery &lt;span class="caps"&gt;HTTP&lt;/span&gt; dla &lt;a href="http://rubyonrails.org"&gt;Rails&#243;w&lt;/a&gt;. Zaintrygowany paroma &lt;a href="http://blog.zabiello.com/articles/2006/10/29/railsy-lighttpd-czy-apache-2-2-x#comments"&gt;wpisami w blogu&lt;/a&gt; postanowi&#322;em przyjrze&#263; si&#281; dosy&#263; ma&#322;o znanemu serwerowi &lt;span class="caps"&gt;HTTP&lt;/span&gt; kt&#243;ry zaczyna zdobywa&#263; coraz wi&#281;cej uwagi na Zachodzie. Chodzi o ultraszybki serwer &lt;a href="http://nginx.net"&gt;nginx&lt;/a&gt; napisany przez rosyjskiego programist&#281; Igora Sysojewa.&lt;/p&gt;


	&lt;p&gt;Na pierwszy b&#243;j poszed&#322; prosty test wy&#347;wietlenia &amp;#8220;Hello World!&amp;#8221; Na u&#380;ywanym przeze mnie serwerze dedykowanym (Athlon 64 3000+, 1GB &lt;span class="caps"&gt;RAM&lt;/span&gt;, Linux Ubuntu 64bit) dla 100 tys. zapyta&#324; (musia&#322;em u&#380;y&#263; a&#380; tyle, bo serwer jest za szybki na mniejsz&#261; liczb&#281; zapyta&#324;) uzyska&#322;em nast&#281;puj&#261;ce wyniki (dla polecenia &amp;#8220;ab -n 100000 -c 1 http://localhost&amp;#8221;):&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Apache 2.2.3 = 4439 req/s&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt; Lighttpd 1.4.11 = 7150 req/s&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt; Nginx 0.4.12 = 8700 req/s&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Co prawda Nginx wykazuje mia&#380;dz&#261;c&#261; przewag&#281; wydajno&#347;ci nad Apachem ale, z racji tego, &#380;e u&#380;ywam Lighttpd, kt&#243;ry co prawda odstaje od Nginxa ale nie a&#380; tak, postanowi&#322;em na razie zaczeka&#263; z ewentualn&#261; migracj&#261;.&lt;/p&gt;


	&lt;p&gt;Okaza&#322;o si&#281; jednak, &#380;e b&#281;d&#281; musia&#322; przeprowadzi&#263; tak&#261; migracj&#281; szybciej ni&#380; bym chcia&#322;. Co&#347; z&#322;ego zacz&#281;&#322;o si&#281; dzia&#263; z Ligthttpd. Po paru godzinach pracy, przestawa&#322; odpowiada&#263; na zapytania a nawet w og&#243;le proces znika&#322; z pami&#281;ci. Ki diabe&#322;? Trudno powiedzie&#263;, nie mam czasu aby analizowa&#263; dok&#322;adniej problem. Jedyne co pomaga&#322;o to regularny restart Lighttpd. Troch&#281; g&#322;upie rozwi&#261;zanie.  Postanowi&#322;em zatem zrobi&#263; wcze&#347;niejsz&#261; migracj&#281; do Nginxa. Wg &lt;a href="http://survey.netcraft.com/Reports/0609/byserver/nginx/index.html"&gt;statystyk Netcraftu&lt;/a&gt; z Nginxa korzysta ju&#380; ponad 90 tys. domen. Wydaje si&#281; to wystarczaj&#261;c&#261; ilo&#347;ci&#261; aby mo&#380;na by&#322;o uzna&#263; ten serwer za stabilny.&lt;/p&gt;


	&lt;p&gt;Jednak&#380;e moja migracja ma pewn&#261; trudno&#347;&#263;. U&#380;ywam bowiem r&#243;wnocze&#347;nie &lt;a href="http://php.net"&gt;&lt;span class="caps"&gt;PHP&lt;/span&gt;&lt;/a&gt;, &lt;a href="djangoproject.com"&gt;Django&lt;/a&gt;, &lt;a href="http//rubyonrails.org"&gt;Rails&lt;/a&gt; i &lt;a href="http://zope.org"&gt;Zope&lt;/a&gt; (&#347;ci&#347;lej: &lt;a href="http://plone.org"&gt;Plone&lt;/a&gt;). Czyli ca&#322;kiem niez&#322;a mieszanka aplikacji. &lt;span class="caps"&gt;Z PHP&lt;/span&gt; i Railsami by&#322;o najmniej problem&#243;w, bo przyk&#322;ady konfiguracji s&#261; z grubsza podane w &lt;a href="http://wiki.codemongers.com/Nginx"&gt;Wiki&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Z Plone by&#322;o troszk&#281; gorzej. Musia&#322;em bowiem znale&#378;&#263; odpowiednik mniej wi&#281;cej takiego kodu w Apache:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;RewriteRule&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;quot;&lt;/span&gt;&lt;span class="string"&gt;http://88.198.15.160:6001/VirtualHostBase/http/apologetyka.com:80/app/VirtualHostRoot/$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="constant"&gt;P&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;&lt;span class="constant"&gt;L&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;To nie jest zwyk&#322;y rewrite, to jest po&#322;&#261;czenie proxy z rewrite.&lt;/p&gt;


	&lt;p&gt;W Lighttpd (te&#380; si&#281; swego czasu nam&#281;czy&#322;em aby to uzyska&#263;) uzyskuje si&#281; to tak:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;url&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;rewrite&lt;/span&gt;&lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="ident"&gt;once&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;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/VirtualHostBase/http/apologetyka.com:80/plone/VirtualHostRoot/$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="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;/VirtualHostBase/&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;88.198.15.160&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;6001&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;

Troch&#281; pr&#243;b i si&#281; uda&#322;o. Nginx potrzebowa&#322; takiego wpisu:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;location&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;
  &lt;span class="ident"&gt;rewrite&lt;/span&gt; ^&lt;span class="punct"&gt;/(.*)&lt;/span&gt;&lt;span class="global"&gt;$ &lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;VirtualHostBase&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;http&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;apologetyka&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;com&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;&lt;span class="number"&gt;80&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;plone&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="constant"&gt;VirtualHostRoot&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="global"&gt;$1&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;
&lt;span class="ident"&gt;location&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="constant"&gt;VirtualHostBase&lt;/span&gt;&lt;span class="punct"&gt;/&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="ident"&gt;opt&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;nginx&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;conf&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;conf&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
  &lt;span class="ident"&gt;proxy_pass&lt;/span&gt; &lt;span class="ident"&gt;http&lt;/span&gt;&lt;span class="punct"&gt;:/&lt;/span&gt;&lt;span class="regex"&gt;&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="number"&gt;88.198&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="number"&gt;15.160&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;&lt;span class="number"&gt;6001&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Najtrudniej by&#322;o z konfiguracj&#261; &lt;a href="http://djangoproject.com"&gt;Django&lt;/a&gt; bo opisu do Django na Nginx nie ma ani w  dokumentacji do Django, ani w dokumentacji do NGinxa. Zm&#281;czony eksperymentowaniem napisa&#322;em na list&#281; dyskusyjn&#261; Django i dosta&#322;em ca&#322;kiem po&#380;yteczn&#261; wskaz&#243;wk&#281; odno&#347;nie strony &lt;a href="http://www.python.rk.edu.pl/w/p/django-pod-serwerem-nginx/"&gt;http://www.python.rk.edu.pl/w/p/django-pod-serwerem-nginx/&lt;/a&gt;. Niestety mia&#322;em pecha, bo akurat trafi&#322;em na zmian&#281; wpis&#243;w w &lt;span class="caps"&gt;DNS&lt;/span&gt; i artyku&#322; by&#322; niedost&#281;pny. Uda&#322;o mi si&#281; na szcz&#281;&#347;cie wy&#322;uska&#263; jego kopi&#281; z cache Googli. Autor  mi&#281;dzyczasie podes&#322;a&#322; mi te&#380; pliki z artyku&#322;ami. Zauwa&#380;y&#322;em &#380;e napotka&#322; pewne problemy ze zmuszeniem Django do wy&#347;wietlania statycznej tre&#347;ci. Troch&#281; pod&#322;uba&#322;em w kodzie i problem rozwi&#261;za&#322;em. :)&lt;/p&gt;


	&lt;p&gt;Zauwa&#380;y&#322;em &#380;e Django wy&#347;wietla&#322; mi pliki statyczne w trybie debug. Wynika&#322;o to pewnie z tego, &#380;e w urls.py stosuj&#281; zawsze taki wpis:&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="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;DEBUG&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
  &lt;span class="ident"&gt;urlpatterns&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="ident"&gt;patterns&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&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;r&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;^images/(?P&amp;lt;path&amp;gt;.*)$&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;django.views.static.serve&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;{'&lt;/span&gt;&lt;span class="string"&gt;document_root&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="constant"&gt;MEDIA_ROOT&lt;/span&gt;&lt;span class="punct"&gt;+'&lt;/span&gt;&lt;span class="string"&gt;/images&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;show_indexes&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="constant"&gt;True&lt;/span&gt;&lt;span class="punct"&gt;}),&lt;/span&gt;
    &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;^stylesheets/(?P&amp;lt;path&amp;gt;.*)$&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;django.views.static.serve&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;{'&lt;/span&gt;&lt;span class="string"&gt;document_root&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="constant"&gt;MEDIA_ROOT&lt;/span&gt;&lt;span class="punct"&gt;+'&lt;/span&gt;&lt;span class="string"&gt;/stylesheets&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;show_indexes&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="constant"&gt;True&lt;/span&gt;&lt;span class="punct"&gt;}),&lt;/span&gt;
    &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;^javascripts/(?P&amp;lt;path&amp;gt;.*)$&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;django.views.static.serve&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;{'&lt;/span&gt;&lt;span class="string"&gt;document_root&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="constant"&gt;MEDIA_ROOT&lt;/span&gt;&lt;span class="punct"&gt;+'&lt;/span&gt;&lt;span class="string"&gt;/javascripts&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;show_indexes&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="constant"&gt;True&lt;/span&gt;&lt;span class="punct"&gt;}),&lt;/span&gt;
    &lt;span class="punct"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Dla trybu produkcyjnego (settings.DEBUG=False) trzeba zmusi&#263; serwer &lt;span class="caps"&gt;HTTP&lt;/span&gt; aby si&#281; zajmowa&#322; plikami statycznymi. Django ma tylko przetwarza&#263; Pythona. Mozna to zrobi&#263; np. tak:&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;location&lt;/span&gt; ~&lt;span class="punct"&gt;*&lt;/span&gt; ^&lt;span class="punct"&gt;.+\.(&lt;/span&gt;&lt;span class="ident"&gt;jpg&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;jpeg&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;gif&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;png&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;ico&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;css&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;zip&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;tgz&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;gz&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;rar&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;bz2&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;doc&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;xls&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;exe&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;pdf&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;ppt&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;txt&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;tar&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;mid&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;midi&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;wav&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;bmp&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;rtf&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;js&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;mov&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;
  &lt;span class="ident"&gt;access_log&lt;/span&gt;   &lt;span class="ident"&gt;off&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="comment"&gt;# po co mi logi obrazk&#243;w :)&lt;/span&gt;
  &lt;span class="ident"&gt;expires&lt;/span&gt;      &lt;span class="number"&gt;30&lt;/span&gt;&lt;span class="ident"&gt;d&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; 
&lt;span class="punct"&gt;}&lt;/span&gt;
&lt;span class="ident"&gt;location&lt;/span&gt; &lt;span class="punct"&gt;/&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="ident"&gt;opt&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;nginx&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;conf&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;fastcgi&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;conf&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
  &lt;span class="ident"&gt;fastcgi_pass&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="number"&gt;6002&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
  &lt;span class="ident"&gt;fastcgi_pass_header&lt;/span&gt; &lt;span class="constant"&gt;Authorization&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
  &lt;span class="ident"&gt;fastcgi_intercept_errors&lt;/span&gt; &lt;span class="ident"&gt;off&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Gdzie plik fastcgi.conf:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;GATEWAY_INTERFACE&lt;/span&gt;  &lt;span class="constant"&gt;CGI&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="number"&gt;1.1&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;SERVER_SOFTWARE&lt;/span&gt;    &lt;span class="ident"&gt;nginx&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;

&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;QUERY_STRING&lt;/span&gt;       &lt;span class="global"&gt;$query_string&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;REQUEST_METHOD&lt;/span&gt;     &lt;span class="global"&gt;$request_method&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;CONTENT_TYPE&lt;/span&gt;       &lt;span class="global"&gt;$content_type&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;CONTENT_LENGTH&lt;/span&gt;     &lt;span class="global"&gt;$content_length&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;

&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;SCRIPT_NAME&lt;/span&gt;        &lt;span class="global"&gt;$fastcgi_script_name&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;REQUEST_URI&lt;/span&gt;        &lt;span class="global"&gt;$request_uri&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;DOCUMENT_URI&lt;/span&gt;       &lt;span class="global"&gt;$document_uri&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;DOCUMENT_ROOT&lt;/span&gt;      &lt;span class="global"&gt;$document_root&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;SERVER_PROTOCOL&lt;/span&gt;    &lt;span class="global"&gt;$server_protocol&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;

&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;REMOTE_ADDR&lt;/span&gt;        &lt;span class="global"&gt;$remote_addr&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;REMOTE_PORT&lt;/span&gt;        &lt;span class="global"&gt;$remote_port&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;SERVER_ADDR&lt;/span&gt;        &lt;span class="global"&gt;$server_addr&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;SERVER_PORT&lt;/span&gt;        &lt;span class="global"&gt;$server_port&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;SERVER_NAME&lt;/span&gt;        &lt;span class="global"&gt;$server_name&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;

&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;PATH_INFO&lt;/span&gt;          &lt;span class="global"&gt;$fastcgi_script_name&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Plik startowy napisa&#322;em sobie ju&#380; w Pythonie:&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 python&lt;/span&gt;

&lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="ident"&gt;os&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;sys&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;time&lt;/span&gt;
&lt;span class="constant"&gt;DEBUG&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;True&lt;/span&gt;
&lt;span class="comment"&gt;# All Django project are inside /home/app/django/&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;/home/app/django&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="ident"&gt;projects&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="string"&gt;biblia&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="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;project&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;searchers&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
        &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;port&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt;&lt;span class="number"&gt;6002&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
        &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;pidfile&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/var/run/django_searchers.pid&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
        &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;children&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="number"&gt;4&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="string"&gt;koran&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="string"&gt;project&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;django_project&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
        &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;port&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt;&lt;span class="number"&gt;6003&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
        &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;pidfile&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/var/run/django_koran.pid&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
        &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;children&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;
        &lt;span class="punct"&gt;},&lt;/span&gt;
    &lt;span class="punct"&gt;}&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;start&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&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;projects&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;]['&lt;/span&gt;&lt;span class="string"&gt;project&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt;
    &lt;span class="ident"&gt;os&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="string"&gt;%s/%s/&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;path&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;appl&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;./manage.py runfcgi host=127.0.0.1&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
    &lt;span class="ident"&gt;cmd&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;%s port=%s minspare=1 maxspare=%s pidfile=%s --settings=%s.settings&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;appl&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;projects&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;]['&lt;/span&gt;&lt;span class="string"&gt;port&lt;/span&gt;&lt;span class="punct"&gt;'],&lt;/span&gt; &lt;span class="ident"&gt;projects&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;]['&lt;/span&gt;&lt;span class="string"&gt;children&lt;/span&gt;&lt;span class="punct"&gt;'],&lt;/span&gt; &lt;span class="ident"&gt;projects&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;]['&lt;/span&gt;&lt;span class="string"&gt;pidfile&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="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;DEBUG&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="ident"&gt;cmd&lt;/span&gt;
    &lt;span class="ident"&gt;os&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;(&lt;/span&gt;&lt;span class="ident"&gt;cmd&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;stop&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
    &lt;span class="ident"&gt;pidfile&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;projects&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;]['&lt;/span&gt;&lt;span class="string"&gt;pidfile&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;os&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;path&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="ident"&gt;pidfile&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
        &lt;span class="ident"&gt;cmd&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/bin/kill -TERM %s&lt;/span&gt;&lt;span class="punct"&gt;'&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;pidfile&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;read&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
        &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;DEBUG&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="ident"&gt;cmd&lt;/span&gt;
        &lt;span class="ident"&gt;os&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;(&lt;/span&gt;&lt;span class="ident"&gt;cmd&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="ident"&gt;os&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;unlink&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;pidfile&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;restart&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
    &lt;span class="ident"&gt;stop&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;sleep&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;start&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&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;__name__&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;__main__&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt;
    &lt;span class="ident"&gt;try&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="ident"&gt;sys&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&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;sys&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;argv&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;2&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;action&lt;/span&gt; &lt;span class="keyword"&gt;in&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="string"&gt;stop&lt;/span&gt;&lt;span class="punct"&gt;',&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="keyword"&gt;and&lt;/span&gt; &lt;span class="ident"&gt;project&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;projects&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;action&lt;/span&gt; &lt;span class="punct"&gt;==&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;start&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;elif&lt;/span&gt; &lt;span class="ident"&gt;action&lt;/span&gt; &lt;span class="punct"&gt;==&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;stop&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;elif&lt;/span&gt; &lt;span class="ident"&gt;action&lt;/span&gt; &lt;span class="punct"&gt;==&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;restart&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="keyword"&gt;else&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
                &lt;span class="keyword"&gt;raise&lt;/span&gt; &lt;span class="constant"&gt;IndexError&lt;/span&gt;
        &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
            &lt;span class="keyword"&gt;raise&lt;/span&gt; &lt;span class="constant"&gt;IndexError&lt;/span&gt;
    &lt;span class="ident"&gt;except&lt;/span&gt; &lt;span class="constant"&gt;IndexError&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;Usage: %s {start|stop|restart} {%s}&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;(&lt;/span&gt;&lt;span class="ident"&gt;sys&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&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="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;|&lt;/span&gt;&lt;span class="punct"&gt;'.&lt;/span&gt;&lt;span class="ident"&gt;join&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;projects&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;keys&lt;/span&gt;&lt;span class="punct"&gt;()))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Migracja si&#281; uda&#322;a. Plone, &lt;span class="caps"&gt;PHP&lt;/span&gt;, Django i Rails &#347;migaj&#261; mi teraz na ultraszybkim (i zajmuj&#261;cym ma&#322;o pami&#281;ci!) serwerze Nginx.  Acha, zapomnia&#322;em doda&#263;: Nginx to nie tylko du&#380;a wydajno&#347;&#263; i oszcz&#281;dno&#347;&#263; pami&#281;ci. Nginx ma du&#380;o  modu&#322;&#243;w. Mo&#380;e nie tyle, co Apache, ale znacznie lepiej ni&#380; Lighttpd.&lt;/p&gt;


	&lt;p&gt;&lt;span class="caps"&gt;BTW&lt;/span&gt;, ciekawie wygl&#261;da tak&#380;e serwer &lt;a href="http://www.cherokee-project.com/"&gt;Cherokee&lt;/a&gt;. Nginx dzia&#322;a tylko pod systemami &lt;span class="caps"&gt;POSIX&lt;/span&gt; (Unix, MacOS-X, Linux, FreeBSD). Cherokee natomiast posiada&amp;#8230; binarn&#261; instalacj&#281; pod Windows!  Ale o tym mo&#380;e napisz&#281; co&#347; innym razem. :)&lt;/p&gt;</description>
      <pubDate>Wed, 08 Nov 2006 00:47:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:779dd78c-3248-4818-a9e4-1b2a20f8d7cb</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/11/08/nginx-apache-killer</link>
      <category>Ruby on Rails</category>
      <category>Django</category>
      <category>nginx</category>
      <category>django</category>
      <category>rails</category>
      <category>cherokee</category>
      <category>fastcgi</category>
    </item>
  </channel>
</rss>
