<?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: Nginx - Apache killer</title>
    <link>http://blog.zabiello.com/articles/2006/11/08/nginx-apache-killer</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <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>
    <item>
      <title>"Nginx - Apache killer" by dsoul</title>
      <description>&lt;p&gt;nginx moze przeladowac konfiguracje w sposob niewidoczny dla klinetow, kill -HUP, a nawet potrafi zrobic update w ten sposob, jest to opisnae na wiki, szukaj command line&lt;/p&gt;</description>
      <pubDate>Tue, 18 Sep 2007 20:20:32 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:c5022c56-668a-4e0f-b377-60b38dd9e6f8</guid>
      <link>http://blog.zabiello.com/articles/2006/11/08/nginx-apache-killer#comment-995</link>
    </item>
    <item>
      <title>"Nginx - Apache killer" by marcin</title>
      <description>&lt;p&gt;@gaber wydajno&#347;&#263; mathopd jest tragiczna, ju&#380; przy &#347;rednim obci&#261;&#380;eniu zaczyna gubi&#263; po&#322;&#261;czenia z klientami. Je&#380;eli szukasz czego&#347; w tej klasie to polecam boa.org &amp;#8211; jest poprostu zab&#243;jczy a przy serwowaniu statycznych plik&#243;w potrafi by&#263; niejednokrotnie szybszy ni&#380; lighttpd, CGI obs&#322;uguje w takim samym czasie co Apache2 &amp;#8211; do szcze&#347;cia brakuje tylko FastCGI&lt;/p&gt;


	&lt;p&gt;@Jaros&#322;aw mam pytanie odno&#347;nie prze&#322;adowania konfiguracji nginxa &amp;#8211; czy podczas tego procesu zrywa on po&#322;&#261;czenia tak jak robi to lighttpd, czy te&#380; jest to niewidoczne dla klienta?&lt;/p&gt;</description>
      <pubDate>Tue, 18 Sep 2007 11:05:34 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:587454aa-5451-477b-9025-8751620c0ac6</guid>
      <link>http://blog.zabiello.com/articles/2006/11/08/nginx-apache-killer#comment-994</link>
    </item>
    <item>
      <title>"Nginx - Apache killer" by gaber</title>
      <description>&lt;p&gt;A jak sie ma wydajnosc Nginx&#8217;a do np. &lt;a href="http://www.mathopd.org/" rel="nofollow"&gt;http://www.mathopd.org/&lt;/a&gt; ? Ktos z was porownywal wyniki?
Wiadomo ze apache to kobyla i do prostych requestow nie jest potrzebna.&lt;/p&gt;</description>
      <pubDate>Sun, 28 Jan 2007 23:49:49 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:0eb9c0f9-322c-40d2-975a-53d7659c23a6</guid>
      <link>http://blog.zabiello.com/articles/2006/11/08/nginx-apache-killer#comment-456</link>
    </item>
    <item>
      <title>"Nginx - Apache killer" by envp</title>
      <description>&lt;p&gt;a zrobi&#322; kto&#347; w nginxie katalogi user&#243;w (/home/user/public_html) ? bez dodawania wirtualnych host&#243;w &amp;#8211; chodzi mi o jeden wpis&amp;#8230;&lt;/p&gt;</description>
      <pubDate>Sat, 02 Dec 2006 22:52:27 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:b3c8d97f-b224-4312-a9c7-af09aec4bffa</guid>
      <link>http://blog.zabiello.com/articles/2006/11/08/nginx-apache-killer#comment-324</link>
    </item>
    <item>
      <title>"Nginx - Apache killer" by PLum</title>
      <description>&lt;p&gt;a jest jakas mozliwosc na stworzenie malego howto? jak to wszystko polaczyc do tzw. &amp;#8220;kupy&amp;#8221; :) ?&lt;/p&gt;</description>
      <pubDate>Wed, 22 Nov 2006 21:41:08 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:18e8f0fb-a50e-4f43-a2f6-e637c2c450ab</guid>
      <link>http://blog.zabiello.com/articles/2006/11/08/nginx-apache-killer#comment-308</link>
    </item>
    <item>
      <title>"Nginx - Apache killer" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;Te problemy mia&#322;em z Lighttpd 4.11 (instalowany za pomoc&#261; aptitude pod Ubuntu 6) i zbieg&#322;o to si&#281; w czasie z jakim&#347; przeci&#261;&#380;eniem VPS&amp;#8217;a.&lt;/p&gt;


	&lt;p&gt;Blog si&#281; szybciej wy&#347;wietla g&#322;&#243;wnie dzi&#281;ki serwerowi dedykowanemu. Zauwa&#380;y&#322;em tak &amp;#8220;na oko&amp;#8221; &#380;e &lt;a href="http://creationism.org.pl" rel="nofollow"&gt;Plone&lt;/a&gt; te&#380; mi dzia&#322;a jakie&#347; 2x szybciej.&lt;/p&gt;


	&lt;p&gt;Co do reverse-proxy &amp;#8211; nie wiem. Rails i Django mi dzia&#322;a bez problemu, ale uzywam tam tylko odpowiednio: load-balancera do proces&#243;w mongrela (dla RoR) i fastcgi/wsgi (dla Pythona). Jedynie dla Plone u&#380;ywam  proxy ale problem&#243;w nie widz&#281;.&lt;/p&gt;</description>
      <pubDate>Mon, 13 Nov 2006 16:50:09 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:60ddabfc-c78b-4861-b12b-ca03d1eb2af6</guid>
      <link>http://blog.zabiello.com/articles/2006/11/08/nginx-apache-killer#comment-285</link>
    </item>
    <item>
      <title>"Nginx - Apache killer" by maniel</title>
      <description>&lt;p&gt;@Riklaunim: w takim razie polecam arch64:-)&lt;/p&gt;


	&lt;p&gt;@Jaros&#322;aw Zabie&#322;&#322;o: hmm, na stronie nginx&amp;#8217;a czytalem &#380;e ichnie reverse-proxy u&#380;ywa tylko HTTP/1.0 do komunikacji z backendami, czy to powa&#380;na wada je&#347;li chodzi o frameworki takie jak nitro, rails czy django? mo&#380;e pytanie wygl&#261;da g&#322;upio, ale jestem zielony w tej kwestii:-)&lt;/p&gt;</description>
      <pubDate>Sat, 11 Nov 2006 16:17:22 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:f610586c-9528-4e97-b468-de5ee04812b3</guid>
      <link>http://blog.zabiello.com/articles/2006/11/08/nginx-apache-killer#comment-283</link>
    </item>
    <item>
      <title>"Nginx - Apache killer" by hosiawak</title>
      <description>&lt;p&gt;&#346;wietna robota z opisaniem konfiguracji,  Nginx potrzebuje takich przyk&#322;ad&#243;w z &#380;ycia wzi&#281;tych ! Na pewno przyda si&#281; wielu osobom, kt&#243;re przechodz&#261; na Nginx&amp;#8217;a.&lt;/p&gt;


	&lt;p&gt;Tak BTW, nie wiem czy to ten dedykowany serwer czy Nginx, ale teraz Tw&#243;j blog pojawia si&#281; rzeczywi&#347;cie b&#322;yskawicznie :)&lt;/p&gt;</description>
      <pubDate>Sat, 11 Nov 2006 16:02:18 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:bb7d5880-0619-4058-b3b0-fb56339f2374</guid>
      <link>http://blog.zabiello.com/articles/2006/11/08/nginx-apache-killer#comment-282</link>
    </item>
    <item>
      <title>"Nginx - Apache killer" by Pawel</title>
      <description>&lt;p&gt;Jakie wersje lighttpd maja takie problemy?&lt;/p&gt;</description>
      <pubDate>Fri, 10 Nov 2006 00:13:24 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:82d1f134-e611-441c-bc1f-000933d538ca</guid>
      <link>http://blog.zabiello.com/articles/2006/11/08/nginx-apache-killer#comment-281</link>
    </item>
    <item>
      <title>"Nginx - Apache killer" by yezooz</title>
      <description>&lt;p&gt;no to gr8 ;)&lt;/p&gt;</description>
      <pubDate>Thu, 09 Nov 2006 08:20:09 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:06c65ba5-beab-4a5b-baf5-a4cf3e3f643a</guid>
      <link>http://blog.zabiello.com/articles/2006/11/08/nginx-apache-killer#comment-277</link>
    </item>
    <item>
      <title>"Nginx - Apache killer" by Riklaunim</title>
      <description>&lt;p&gt;&amp;#8220;Po paru godzinach pracy, przestawa&#322; odpowiada&#263; na zapytania a nawet w og&#243;le proces znika&#322; z pami&#281;ci.&amp;#8221;&lt;/p&gt;


	&lt;p&gt;Mia&#322;em to przy testowaniu lighttpd na archu &amp;#8211; pada&#322; pod du&#380;ym obci&#261;&#380;eniem. Niedawne pr&#243;by zabicia go tym samym na gentoo amd64 nie powiod&#322;y si&#281; :)&lt;/p&gt;</description>
      <pubDate>Thu, 09 Nov 2006 08:02:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:67983f21-22ad-48c1-934c-6369c7a76b6c</guid>
      <link>http://blog.zabiello.com/articles/2006/11/08/nginx-apache-killer#comment-276</link>
    </item>
    <item>
      <title>"Nginx - Apache killer" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;yeap&lt;/p&gt;</description>
      <pubDate>Thu, 09 Nov 2006 00:55:07 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:5fcfa80b-22ce-4b6a-84e4-7e15d91e6580</guid>
      <link>http://blog.zabiello.com/articles/2006/11/08/nginx-apache-killer#comment-275</link>
    </item>
    <item>
      <title>"Nginx - Apache killer" by yezooz</title>
      <description>&lt;p&gt;czyli jak rozumiem dla Railsow uzywasz w tej chwili:
nginx + mongrel (bezposrednio) ?&lt;/p&gt;</description>
      <pubDate>Thu, 09 Nov 2006 00:01:13 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:ff5f4fb6-8a30-4bf2-afbd-9cc8a13b4382</guid>
      <link>http://blog.zabiello.com/articles/2006/11/08/nginx-apache-killer#comment-274</link>
    </item>
  </channel>
</rss>
