<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Jaros&#322;aw Zabie&#322;&#322;o - BLOG: Tag fastcgi</title>
    <link>http://blog.zabiello.com/articles/tag/fastcgi</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>Railsy: Lighttpd czy Apache 2.2.x?</title>
      <description>&lt;p&gt;Odno&#347;nie u&#380;ycia Rails&#243;w w celu produkcyjnym, du&#380;o si&#281; zmieni&#322;o od czasu pojawienia si&#281; &lt;a href="http://mongrel.rubyforge.org/"&gt;Mongrela&lt;/a&gt; &amp;#8211; ma&#322;ego, ale dosy&#263; szybkiego serwera napisanego w Ruby i C.  Nast&#281;puje generalne odej&#347;cie od podpinania kilku proces&#243;w FastCGI do Rubiego z r&#243;&#380;nych powod&#243;w.  W drugim wydaniu &lt;a href="http://www.pragmaticprogrammer.com/titles/rails/index.html"&gt;Agile Web Development in Rails&lt;/a&gt; autorzy przyznali, &#380;e pr&#243;bowali r&#243;&#380;nych opcji u&#380;ycia modu&#322;u FastCGI. Zawsze ostatecznie by&#322;y jakie&#347; problemy.&lt;/p&gt;


	&lt;p&gt;Aktualnie zalecanym podej&#347;ciem jest u&#380;ycie szybkiego serwera &lt;span class="caps"&gt;HTTP&lt;/span&gt; (&lt;a href="http://mongrel.rubyforge.org/docs/lighttpd.html"&gt;Lighttpd&lt;/a&gt;, &lt;a href="http://mongrel.rubyforge.org/docs/apache.html"&gt;Apache&lt;/a&gt; lub &lt;a href="http://mongrel.rubyforge.org/docs/litespeed.html"&gt;LiteSpeed&lt;/a&gt;) na froncie do obs&#322;ugi statycznych plik&#243;w (g&#322;&#243;wnie obrazki, style kaskadowe i pliki Javascript).  Aplikacj&#281; RoR  nale&#380;y uruchomi&#263; za pomoc&#261; kilku proces&#243;w Mongrela (nie jak wcze&#347;niej: kilka proces&#243;w FastCGI). A tym, co zepnie je z serwerem &lt;span class="caps"&gt;HTTP&lt;/span&gt; jest modu&#322; rozk&#322;adaj&#261;cy ruch (load balancing).&lt;/p&gt;


	&lt;p&gt;Niestety, okaza&#322;o si&#281; &#380;e w wypadku Lighttpd ten modu&#322; zawiera b&#322;&#281;dy. Z kolei nowy Apache 2.2 posiada dobrze dzia&#322;aj&#261;cy modu&#322; load balancingu. Spowodowa&#322;o to zrezygnowanie przez wielu z Lighttpd na rzecz nowego Apache 2.2.x.&lt;/p&gt;


	&lt;p&gt;Z racji tego, &#380;e mam troch&#281; swobody w doborze technologii w pracy, postawi&#322;em serwer na nowym Apache&amp;#8217;u. Aplikacje Rails&#243;w podpinamy za pomoc&#261; mongrela i wbudowanego w Apache modu&#322;u load_balancer. Dzia&#322;a faktycznie sprawnie.&lt;/p&gt;


	&lt;p&gt;Czy to znaczy, &#380;e Lighttpd nie ma sensu u&#380;ywa&#263;? Sk&#261;d! W wersji 1.5 maj&#261; ju&#380; mie&#263; naprawiony modu&#322; load balancingu. Ale nawet i bez tego, istnieje bardzo dobry, ma&#322;y i szybki load balancer &amp;#8211; &lt;a href="http://mongrel.rubyforge.org/docs/pound.html"&gt;Pound&lt;/a&gt;. Skuszony jednak potrzeb&#261; eksperymentowania oraz nabytym niedawno &lt;a href="http://hetzner.de/rootserver_en.html"&gt;serwerem dedykowanym&lt;/a&gt; (w miejsce wcze&#347;niejszego &lt;a href="http://tektonic.net/unmanaged.html"&gt;&lt;span class="caps"&gt;VPS&lt;/span&gt;&amp;#8217;a&lt;/a&gt;) postanowi&#322;em przenie&#347;&#263; wszystkie swoje prywatne serwisy (a jest tego sporo) z Lighttpd do Apache 2.2.3. Musia&#322;em przenie&#347;&#263; dwie aplikacje Rails, dwie aplikacje Django, dwie aplikacje &lt;span class="caps"&gt;PHP 5&lt;/span&gt;.1 oraz jedn&#261; du&#380;a aplikacj&#281; Zope/Plone. I jak wra&#380;enia?&lt;/p&gt;


	&lt;p&gt;Ot&#243;&#380;, po 2 tygodniach u&#380;ywania, stwierdzi&#322;em, &#380;e to nie ma sensu. Apache po&#380;era za du&#380;o pami&#281;ci. Dzieje si&#281; dok&#322;adnie tak, jak &lt;a href="http://blog.zabiello.com/articles/2006/04/24/lightpd-fastcgi-vs-apache-mod_php-mod_python"&gt;pisa&#322;em wcze&#347;niej&lt;/a&gt;. Nie mog&#322;em u&#380;y&#263; trybu wielow&#261;tkowego, nie tyle ze wzgl&#281;du na &lt;span class="caps"&gt;PHP&lt;/span&gt; ale ze wzgl&#281;dy na Django! Napisali bowiem, &#380;e nie nale&#380;y tego trybu u&#380;ywa&#263; w wypadku ich frameworka. Django nie jest wielow&#261;tkowy. Musia&#322;em wi&#281;c prze&#322;&#261;czy&#263; Apache z trybu worker na prefork. Zgodnie z obawami, ka&#380;dy fork musia&#322; marnowa&#263; pami&#281;&#263; na modu&#322; mod_php i mod_python nawet jak to nie ma sensu (np. podczas obs&#322;ugi obrazk&#243;w). Na dodatek nie mog&#322;em co&#347; uruchomi&#263; jednej aplikacji Django. Kompletnie nie wiem dlaczego. Druga by&#322;a prawie identycznie skonfigurowana i dzia&#322;a&#322;a.&lt;/p&gt;


	&lt;p&gt;Wr&#243;ci&#322;em zatem z powrotem do Lighttpd , Pounda i Mongrela (dla RoR) i FastCGI (dla Django i &lt;span class="caps"&gt;PHP&lt;/span&gt;). Efekty by&#322;y bardzo widoczne: zwolni&#322;o mi si&#281; ponad 200 MB pami&#281;ci. Mo&#380;e to nie ma znaczenia w pracy, gdzie mamy 2GB ale ja mam tylko 1GB i musz&#281; jeszcze uruchomi&#263; zasobo&#380;erny Plone.&lt;/p&gt;


	&lt;p&gt;Dok&#322;adniej wszystkie sprawdzone i dzia&#322;aj&#261;ce konfiguracje opisz&#281; w powstaj&#261;cej ksi&#261;&#380;ce o Railach. Moja ostateczna konlkluzja jest taka: je&#347;li zale&#380;y ci na oszcz&#281;dzeniu pami&#281;ci &amp;#8211; wybieraj Lighttpd. Je&#347;li nie jest to kluczowa sprawa, a potrzebujesz jakie&#347; specjalne, dodatkowe modu&#322;y (kt&#243;rych Apache ma pe&#322;no) nowy Apache 2.2 spe&#322;ni twe oczekiwania.&lt;/p&gt;</description>
      <pubDate>Sun, 29 Oct 2006 15:53:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:ae8c5663-3e1f-48fd-b086-a090a1cee206</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/10/29/railsy-lighttpd-czy-apache-2-2-x</link>
      <category>Ruby on Rails</category>
      <category>apache</category>
      <category>lighttpd</category>
      <category>rails</category>
      <category>mod_python</category>
      <category>fastcgi</category>
    </item>
    <item>
      <title>Django na Lighttpd + FastCGI</title>
      <description>&lt;p&gt;Okazuje si&#281;, &#380;e uruchomienie Django na serwerze Lighttpd i FastCGI nie jest wcale trudne. Taki zestaw po&#380;era &lt;a href="http://blog.zabiello.com/articles/2006/04/24/lightpd-fastcgi-vs-apache-mod_php-mod_python"&gt;znacznie mniej zasob&#243;w&lt;/a&gt; komputera ni&#380; Apache i mod_python. Efekt dost&#281;pny &lt;a href="http://koran.apologetyka.com"&gt;jest tutaj&lt;/a&gt;. Projekt Django zosta&#322; stworzony w /home/django_project. U&#380;y&#322;em Django w wersji &lt;span class="caps"&gt;SVN&lt;/span&gt; (pozbawionej &amp;#8220;magii&amp;#8221;), MySQL 5, Python 2.4.3 oraz system to Debian 3.1. Ca&#322;a konfiguracja to:&lt;/p&gt;


	&lt;p&gt;Plik lighttpd.conf (aktualny):&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="global"&gt;$HTTP&lt;/span&gt;&lt;span class="punct"&gt;[&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;host&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;]&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;koran.apologetyka.com&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;server&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;document&lt;/span&gt;&lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="ident"&gt;root&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/home/django_project/koran/public&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&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;^/(media|stylesheets|images|javascripts).*&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;$0&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;^/admin/(.*)$&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;/django-admin.fcgi/admin/$1&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;^/(.*)$&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;/django.fcgi/$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;fastcgi&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;/django.fcgi&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;bin-path&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;/home/django_project/django.fcgi&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;socket&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;/tmp/django.sock&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;check-local&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;disable&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;min-procs&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;1&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;max-procs&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;1&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;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/django-admin.fcgi&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;bin-path&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;/home/django_project/django-admin.fcgi&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;socket&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;/tmp/django-admin.sock&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;check-local&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;disable&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;min-procs&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;1&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;max-procs&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;1&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="ident"&gt;server&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;error&lt;/span&gt;&lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="ident"&gt;handler&lt;/span&gt;&lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="number"&gt;404&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/django.fcgi&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

Plik django.fcgi:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;#!/usr/local/bin/python2.4&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="ident"&gt;sys&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="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;/home&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt; 
&lt;span class="ident"&gt;from&lt;/span&gt; &lt;span class="ident"&gt;flup&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;server&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;fcgi&lt;/span&gt; &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="constant"&gt;WSGIServer&lt;/span&gt;
&lt;span class="ident"&gt;from&lt;/span&gt; &lt;span class="ident"&gt;django&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;core&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;handlers&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;wsgi&lt;/span&gt; &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="constant"&gt;WSGIHandler&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;environ&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;DJANGO_SETTINGS_MODULE&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;django_project.settings&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="constant"&gt;WSGIServer&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;WSGIHandler&lt;/span&gt;&lt;span class="punct"&gt;()).&lt;/span&gt;&lt;span class="ident"&gt;run&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;P&#243;&#378;niej opisz&#281; dok&#322;adniej sam kod Django.&lt;/p&gt;</description>
      <pubDate>Wed, 31 May 2006 23:16:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:f61babbc-17de-4bd3-9a05-49d6e338f144</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/05/31/django-na-lighttpd-fastcgi</link>
      <category>Django</category>
      <category>django</category>
      <category>lighttpd</category>
      <category>fastcgi</category>
    </item>
    <item>
      <title>Lightpd &amp;amp; FastCGI vs. Apache &amp;amp; mod_php,mod_python...</title>
      <description>Serwer &lt;a href="http://httpd.apache.org/"&gt;Apache&lt;/a&gt; jest bardzo popularnym i solidnym serwerem www. Nie dziwi wi&#281;c powszechne u&#380;ywanie jego modu&#322;ow do obs&#322;ugi Perla, &lt;span class="caps"&gt;PHP&lt;/span&gt; czy Pythona. Uzywanie mod_php jest wr&#281;cz nagminne (ca&#322;y serwis &lt;a href="http://sourceforge.net"&gt;sourceforge.net&lt;/a&gt; stoi na mod_php). Podobnie tw&#243;rcy pythonowego frameworku &lt;a href="http://djangoproject.com"&gt;Django&lt;/a&gt; 
zalecaj&#261; u&#380;ywanie mod_pythona. W &lt;a href="http://www.djangoproject.com/documentation/install/"&gt;dokumentacji&lt;/a&gt; pisz&#261;, &#380;e: 
	&lt;blockquote&gt;
		&lt;p&gt;&amp;#8220;je&#347;li chcesz u&#380;ywa&#263; Django na serwerze produkcyjnym, uzywaj Apache&amp;#8217;a z mod_pythonem (...) Django wymaga Apache 2.x oraz mod_python 3.x.&amp;#8221;&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;Zupe&#322;nie inne podej&#347;cie zalecaj&#261; tw&#243;rcy frameworka &lt;a href="http://rubyonrails.com"&gt;Ruby on Rails&lt;/a&gt;. Nie do&#347;&#263;, &#380;e zalecaj&#261; u&#380;ycie modu&#322;u &lt;a href="http://www.fastcgi.com/"&gt;FastCGI&lt;/a&gt; to na dodatek, zalecaj&#261; (o grozo:) u&#380;ywanie innego serwera www: &lt;a href="http://www.lighttpd.net/"&gt;Ligttpd&lt;/a&gt;. Kt&#243;re podej&#347;cie jest lepsze?&lt;/p&gt;


	&lt;h2&gt;Problem z uniwersalno&#347;ci&#261;&lt;/h2&gt;


	&lt;p&gt;Korzystanie z modu&#322;&#243;w Apache&amp;#8217;a wi&#261;&#380;e nas na dobre i z&#322;e z tym serwerem. korzystanie z fastcgi daje nam wi&#281;ksze pole manewru. Mo&#380;emy korzysta&#263; z Apache, Lighttpd, &lt;span class="caps"&gt;IIS&lt;/span&gt; i innych serwer&#243;w www.&lt;/p&gt;


	&lt;h2&gt;Problem stabilno&#347;ci serwera&lt;/h2&gt;


	&lt;p&gt;Jakikolwiek b&#322;&#261;d w skryptach pracuj&#261;cych  w trybie mod_php czy mod_python odbija si&#281; bardzo niebezpiecznie na stabilno&#347;ci ca&#322;ego serwera. Jeden b&#322;&#281;dnie dzia&#322;aj&#261;cy skrypt mo&#380;e zawiesi&#263; ca&#322;y serwer! Dotyczy to nie tylko Apache, ale tak&#380;e windowsowego &lt;span class="caps"&gt;IIS&lt;/span&gt; i modu&#322;&#243;w &lt;span class="caps"&gt;ISAPI&lt;/span&gt;. Co ciekawe, modu&#322; &lt;span class="caps"&gt;ISAPI&lt;/span&gt; dla j&#281;zyka &lt;span class="caps"&gt;PHP&lt;/span&gt; jest wiecznie w fazie niestabilnej i testowej. Co z tego, &#380;e jest szybszy ni&#380; klasyczny &lt;span class="caps"&gt;CGI&lt;/span&gt;, skoro jeden drobny b&#322;&#261;d w skrypcie &lt;span class="caps"&gt;PHP&lt;/span&gt; potrafi zawiesi&#263; ca&#322;y serwer i unieruchomi&#263; ca&#322;a sie&#263; intranetow&#261; na nim opart&#261;? To jeden z powod&#243;w dla kt&#243;rych &lt;span class="caps"&gt;PHP&lt;/span&gt; nie nadaje si&#281; najlepiej do pracy pod Windowsami (wiem, &#380;e istnieje Apache/win32 ale z r&#243;&#380;nych powod&#243;w, kt&#243;rych tu nie b&#281;d&#281; rozwija&#322;,  korporacyjne sieci intranetowe oparte na Windows Server wol&#261; u&#380;ywa&#263; &lt;span class="caps"&gt;IIS&lt;/span&gt;)&lt;/p&gt;


	&lt;p&gt;Procesy FastCGI s&#261; &lt;strong&gt;izolowane&lt;/strong&gt; od serwera. Jak kt&#243;ry&#347; si&#281; zawiesi, to serwerowi nic si&#281; nie stanie. Proces mo&#380;na ubi&#263;, zrestartowac. Daje to znacznie wi&#281;ksz&#261; stabilno&#347;&#263; pracy serwera.&lt;/p&gt;


	&lt;h2&gt;Problem bezpiecze&#324;stwa&lt;/h2&gt;


	&lt;p&gt;Ka&#380;dy skrypt odpalany w trybie mod_php na Apache&amp;#8217;u jest odpalany w kontek&#347;cie &lt;strong&gt;tego samego uzytkownika&lt;/strong&gt;. Tworzy to dosy&#263; powa&#380;n&#261; dziur&#281; bezpiecze&#324;stwa na serwerach hostingowych. Ka&#380;dy u&#380;ytkownik na serwerze za pomoc&#261; prostego kodu &lt;span class="caps"&gt;PHP&lt;/span&gt; mo&#380;e przegl&#261;da&#263; &lt;strong&gt;&#378;r&#243;d&#322;a&lt;/strong&gt; dowolnego pliku  innych u&#380;ytkownik&#243;w. Wszyscy maj&#261; dost&#281;p  do wszystkich! Napisa&#322;em nawet swego czasu prosty skrypt wedruj&#261;cy po ca&#322;ym sourceforge.net i przegl&#261;daj&#261;cy &#378;r&#243;d&#322;a wszystkich dost&#281;pnych tam projekt&#243;w. :) Ka&#380;dy, &#347;rednio zaawansowany programista z &#322;atwo&#347;ci&#261; napisze sobie taki kod. Nie ma znaczenia, czy to b&#281;dzie Perl (mod_perl), Python (mod_python) czy &lt;span class="caps"&gt;PHP&lt;/span&gt; (mod_php).&lt;/p&gt;


	&lt;p&gt;W FastCGI tego problemu nie ma. Ka&#380;dy u&#380;ytkownik mo&#380;e pracowa&#263; na swoich prawach w pe&#322;nej izolacji. Wystarczy ka&#380;demu przydzieli&#263; po procesie FastCGI na prawach danego u&#380;ytkownika.&lt;/p&gt;


	&lt;h2&gt;Marnowanie mo&#380;liwo&#347;ci Apache&amp;#8217;a 2.x&lt;/h2&gt;


	&lt;p&gt;To mo&#380;e nie jest najwa&#380;niejszy problem. Apache 2.x potrafi pracowa&#263; w trybie wielow&#261;tkowym (worker) lub wieloprocesowym (prefork) kt&#243;ry jest zgodny ze starym Apache 1.x . Ten pierwszy jest nowocze&#347;niejszy, szybszy i po&#380;era mniej pami&#281;ci. Problem jednak w tym, &#380;e najbardziej popularny j&#281;zyk skryptowy nie posiada poprawnie zaimplementowanej wielow&#261;tkowo&#347;ci. Je&#347;li wi&#281;c chcesz u&#380;ywa&#263; &lt;span class="caps"&gt;PHP&lt;/span&gt;, to zapomnij o trybie workera. Musisz pracowa&#263; w starym trybie prefork. Zajmuje to wi&#281;cej pami&#281;ci, ale za to nie b&#281;dzie problem&#243;w z r&#243;&#380;nymi bibliotekami &lt;span class="caps"&gt;PHP&lt;/span&gt;.&lt;/p&gt;


	&lt;h2&gt;Problem zasobo&#380;erno&#347;ci&lt;/h2&gt;


	&lt;p&gt;Gdy uruchamiamy Apache 1.x lub Apache 2.x w trybie prefork, uruchamiamy szereg podproces&#243;w. Ka&#380;dy z nich zajmuje okre&#347;lon&#261; ilo&#347;&#263; pami&#281;ci. Ka&#380;dy z zainstalowanych modu&#322;&#243;w&amp;#8230; r&#243;wnie&#380;. A to przecie&#380; nie ma sensu! W praktyce nie chcemy wykorzystywa&#263; wszystkich proces&#243;w do przetwarzania mod_pythona. Wi&#281;kszo&#347;&#263; proces&#243;w jest zaj&#281;ta podawaniem statycznej warto&#347;ci (obrazki, pliki ze stylami kaskadowymi, skryptami JavaScript itp).&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;FastCGI pozwala na ograniczenie ustalenie ilo&#347;ci swoich proces&#243;w&lt;/strong&gt; w spos&#243;b niezale&#380;ny od wszystkich proces&#243;w serwera www. Np. mo&#380;emy sobie zadecydowa&#263;, aby 100 proces&#243;w zajmowa&#322;o si&#281; warto&#347;ci&#261; statyczn&#261;, a tylko 10 warto&#347;ci&#261; dynamiczn&#261;. Takie co&#347; jest niemo&#380;liwe wypadku korzystania z mod_php czy mod_pythona. A oszcz&#281;dno&#347;ci na zu&#380;yciu pami&#281;ci b&#281;d&#261; kolosalne!&lt;/p&gt;


	&lt;p&gt;Np. mo&#380;na za&#322;ozy&#263;, &#380;e pojedy&#324;czy proces Apache podczas serwowania statycznych stron zajmie nie wi&#281;cej ni&#380; ok 5 MB pami&#281;ci. Natomiast w wypadku u&#380;ycia mod_ruby mo&#380;e wzrosn&#261;&#263; nawet do ok. 20-30MB na proces. U&#380;ycie zatem 100 proces&#243;w Apache&amp;#8217;a z tylko 10 procesami FastCGI zu&#380;yje ok. 800MB pami&#281;ci. Za&#347; u&#380;ycie mod_ruby bez problemu po&#380;re nawet i 3GB!&lt;/p&gt;


	&lt;h2&gt;Dlaczego Lighttpd a nie Apache?&lt;/h2&gt;


	&lt;p&gt;Na ko&#324;cu chcia&#322;bym jeszcze zastanowi&#263; si&#281; czy tw&#243;rcy Rails&#243;w nie maj&#261; racji i czy w og&#243;le nie warto zrezygnowa&#263; z Apache na rzecz Lighttpd? S&#261; generalnie 3 powody za i jeden przeciw.&lt;/p&gt;


	&lt;h3&gt;Za: lepiej dopracowany modu&#322; FastCGI&lt;/h3&gt;


	&lt;p&gt;Modu&#322; FastCGI do Apache&amp;#8217;a ma opini&#281; nie do ko&#324;ca stabilnego i dopracowanego. To powoduje obaw&#281; wi&#281;kszo&#347;ci u&#380;ytkownik&#243;w od u&#380;ywania go dla serwera Apache. Z kolei serwer Lighttpd od samego pocz&#261;tku k&#322;ad&#322; nacisk na dobr&#261; implementacj&#281; swego modu&#322;u FastCGI. Jest on stabilniejszy i lepiej dopracowany ni&#380; pod Apachem.&lt;/p&gt;


	&lt;h3&gt;Za: Wbudowana mo&#380;liwo&#347;&#263; rozk&#322;adania obci&#261;&#380;enia&lt;/h3&gt;


	&lt;p&gt;Lighttpd ma wbudowany mechanizm rozk&#322;adania ruchu na wiele serwer&#243;w. Je&#347;li wi&#281;c nawet kto&#347; upiera si&#281; przy Apache&amp;#8217;u, to w wypadku kiedy jeden serwer nie jest wystarczaj&#261;cy do obs&#322;ugi ruchu, mo&#380;e warto rozwa&#380;y&#263; aby postawi&#263; na froncie jeden serwer Lighttpd kt&#243;ry by rozk&#322;ada&#322; ruch pomi&#281;dzy kilka serwer&#243;w?&lt;/p&gt;


	&lt;p&gt;(Najnowszy  Apache 2.2 ma posiada&#263; podobny mechanizm. Jednak jest to jeszcze bardzo &#347;wie&#380;a wersja, kt&#243;ra (w momencie pisania tego tekstu) nie ma nawet prekompilowanej instalacji dost&#281;pnej dla Windows&#243;w oraz nie wiadomo jak jest ze stabilno&#347;ci&#261; wszystkich modu&#322;&#243;w.)&lt;/p&gt;


	&lt;h3&gt;Za: Lighttpd jest szybszy&lt;/h3&gt;


	&lt;p&gt;O ile najnowszy Apache 2.2 nie zmieni sytuacji, to wszystko wskazuje na to, ze Lighttpd &lt;a href="http://www.lighttpd.net/benchmark/"&gt;jest po prostu szybszy&lt;/a&gt;. Nie tylko zdecydowanie szybciej podaje statyczne dane ale tak&#380;e szybciej dzia&#322;a &lt;span class="caps"&gt;PHP&lt;/span&gt; pod Lighttpd ni&#380; mod_php pod Apachem. To nie s&#261; drobne r&#243;&#380;nice. To s&#261; r&#243;&#380;nice rz&#281;du 2-3 razy!&lt;/p&gt;


	&lt;h3&gt;Przeciw: Apache ma wi&#281;cej modu&#322;&#243;w&lt;/h3&gt;


	&lt;p&gt;W&#322;a&#347;ciwie jedynym powodem aby u&#380;ywa&#263; Apache zamiast Lighttpd jest to, &#380;e do Apache napisano znacznie wi&#281;cej r&#243;&#380;nych modu&#322;&#243;w. Ale szczerze m&#243;wi&#261;c, w praktyce to rzadko ma znaczenie. Wi&#281;kszo&#347;&#263; os&#243;b uzywa g&#322;&#243;wnie kilku modu&#322;&#243;w. Za&#347; Lighttpd posiada praktycznie wszystko, co potrzeba: mod_fastcgi, mod_cgi, mod_redirect, mod_access, mod_auth, mod_compress, mod_webdav, mod_ssl, mod_alias, mod_proxy, mod_rewrite, itp. itd.&lt;/p&gt;


	&lt;h2&gt;Lighttpd + FastCGI. To dzia&#322;a!&lt;/h2&gt;


	&lt;p&gt;Na szcz&#281;&#347;cie, dzi&#281;ki standardowi &lt;a href="http://www.python.org/dev/peps/pep-0333/"&gt;&lt;span class="caps"&gt;WSGI&lt;/span&gt;&lt;/a&gt;, u&#380;ytkownicy Pythona nie musz&#261; s&#322;ucha&#263; zalece&#324; developer&#243;w Django. Teraz praktycznie wszystkie frameworki Pythona pozwalaj&#261; dzi&#281;ki &lt;span class="caps"&gt;WSGI&lt;/span&gt; korzysta&#263; z dobrodziejstw FastCGI. Ja r&#243;wnie&#380; na swoim serwerze wyrzuci&#322;em Apache&amp;#8217;a i zastapi&#322;em go Lighttpd. Podaje zar&#243;wno strony statyczne jak i obs&#322;uguje ten blog, a nawet &lt;a href="http://apologetyka.com/biblia"&gt;&lt;span class="caps"&gt;PHP 5&lt;/span&gt;.1&lt;/a&gt;. Nawet &lt;a href="http://plone.org"&gt;Plone&lt;/a&gt; mi uda&#322;o mi si&#281; uruchomi&#263; z Lighttpd &lt;a href="http://creationism.org.pl"&gt;na przodzie&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Mon, 24 Apr 2006 19:40:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:9c3499f2-8be7-48b5-bf23-432e30cabb37</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/04/24/lightpd-fastcgi-vs-apache-mod_php-mod_python</link>
      <category>PHP</category>
      <category>Python</category>
      <category>Django</category>
      <category>apache</category>
      <category>lighttpd</category>
      <category>fastcgi</category>
      <category>mod_python</category>
    </item>
  </channel>
</rss>
