<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Xis' blog &#187; nginx</title>
	<atom:link href="http://xis.schowek.net/tag/nginx/feed/" rel="self" type="application/rss+xml" />
	<link>http://xis.schowek.net</link>
	<description>Mój wirtualny schowek</description>
	<lastBuildDate>Thu, 10 Mar 2011 18:41:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>NGINX z Symfony pod Windows</title>
		<link>http://xis.schowek.net/2009/08/24/nginx-z-symfony-pod-windows/</link>
		<comments>http://xis.schowek.net/2009/08/24/nginx-z-symfony-pod-windows/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 17:05:46 +0000</pubDate>
		<dc:creator>xis</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[wamp]]></category>

		<guid isPermaLink="false">http://xis.schowek.net/?p=358</guid>
		<description><![CDATA[NGINX to szybki i lekki serwer HTTP, który mimo faktu, że zajmuje jedynie ok. 2 MB dysku, posiada sporo mozliwości konfiguracyjnych, takich jak virtual-hosts, czy url-rewriting. Dzięki FastCGI pozwala na obsługę skryptów PHP, ale i innych języków. Pod windowsem, w domowej deweloperce króluje zestaw WAMP, w skład którego whodzi Windows, Apache, MySQL i PHP. Postanowiłem [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://nginx.net/">NGINX</a> to szybki i lekki serwer <a href="http://pl.wikipedia.org/wiki/Hypertext_Transfer_Protocol">HTTP</a>, który mimo faktu, że zajmuje jedynie ok. 2 MB dysku, posiada sporo mozliwości konfiguracyjnych, takich jak <em>virtual-hosts</em>, czy <em>url-rewriting</em>. Dzięki <a href="http://pl.wikipedia.org/wiki/FastCGI">FastCGI</a> pozwala na obsługę skryptów <a href="http://php.net">PHP</a>, ale i innych języków.<br />
Pod windowsem, w domowej <em>deweloperce</em> króluje zestaw <a href="http://pl.wikipedia.org/wiki/WAMP">WAMP</a>, w skład którego whodzi Windows, <a href="http://pl.wikipedia.org/wiki/Apache_(serwer)">Apache</a>, <a href="http://pl.wikipedia.org/wiki/MySQL">MySQL</a> i <a href="http://pl.wikipedia.org/wiki/PHP">PHP</a>. Postanowiłem wykonać coś, co możnaby określić <em>WNMP</em>, czyli starego, ciężkiego Apacza zamienić na jego nowszy i lżejszy odpowiednik.<br />
Całość jednak ma mi pozwalać kontynuwać prace nad kilkoma projektami, które tworzę z użyciem frameworka <a href="http://www.symfony-project.org/">Symfony</a>.</p>
<p>Jak uruchomić serwer NGINX ze wsparciem dla projektów Symfony pod Windows?</p>
<p>Ściągamy <a href="http://nginx.net">najnowszą wersję serwera NGINX</a> &#8211; od niedawna istnieje wersja natywna, a nie <a href="http://www.cygwin.com/">cygwinowa</a>, jakie były <a href="http://www.kevinworthington.com/nginx-for-windows/">niedawno popularne</a>. Natywna wersja powinnna być dużo szybsza od poprzedniczki. Serwer instalujemy w np. <strong>c:/dev/tools/nginx</strong>.</p>
<p>Zakładam, że system zarządzania bazą danych MySQL, framework Symfony, oraz sam PHP jest już zainstalowany na Twoim komputerze. Zakładam też, że zarówno MySQL, jak i PHP przygotowane są do współpracy z Symfony. Jeśli nie &#8211; w sieci jest <a href="http://www.poetryofprogramming.com/pl/symfony/install-symfony-framework-xp-vista-wamp/">mnóstwo opisów jak to zrobić</a>.</p>
<p>Aby łatwo było uruchamiać i zatrzymywać serwer NGINX, musimy utworzyć następujące skrypty i zapisać je w katalogu NGINXa:</p>
<p><strong>start-nginx.bat</strong></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">@</span><span style="color: #7a0874; font-weight: bold;">echo</span> off
<span style="color: #000000; font-weight: bold;">set</span> <span style="color: #007800;">NGINX_HOME</span>=c:<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>tools<span style="color: #000000; font-weight: bold;">/</span>nginx
<span style="color: #000000; font-weight: bold;">set</span> <span style="color: #007800;">PHP_HOME</span>=c:<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>tools<span style="color: #000000; font-weight: bold;">/</span>php
<span style="color: #000000; font-weight: bold;">set</span> <span style="color: #007800;">FASTCGI_ADDR</span>=127.0.0.1
<span style="color: #000000; font-weight: bold;">set</span> <span style="color: #007800;">FASTCGI_PORT</span>=<span style="color: #000000;">9000</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Startujemy nginx&quot;</span>
start <span style="color: #000000; font-weight: bold;">%</span>NGINX_HOME<span style="color: #000000; font-weight: bold;">%/</span>nginx.exe
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Startujemy php-cgi&quot;</span>
start <span style="color: #000000; font-weight: bold;">/</span>B <span style="color: #000000; font-weight: bold;">%</span>PHP_HOME<span style="color: #000000; font-weight: bold;">%/</span>php-cgi.exe <span style="color: #660033;">-b</span> <span style="color: #000000; font-weight: bold;">%</span>FASTCGI_ADDR<span style="color: #000000; font-weight: bold;">%</span>:<span style="color: #000000; font-weight: bold;">%</span>FASTCGI_PORT<span style="color: #000000; font-weight: bold;">%</span> <span style="color: #660033;">-c</span> <span style="color: #000000; font-weight: bold;">%</span>PHP_HOME<span style="color: #000000; font-weight: bold;">%/</span>php.ini
<span style="color: #7a0874; font-weight: bold;">exit</span></pre></div></div>

<p><strong>stop-nginx.bat</strong></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">@</span><span style="color: #7a0874; font-weight: bold;">echo</span> off
taskkill <span style="color: #000000; font-weight: bold;">/</span>f <span style="color: #000000; font-weight: bold;">/</span>IM nginx.exe
taskkill <span style="color: #000000; font-weight: bold;">/</span>f <span style="color: #000000; font-weight: bold;">/</span>IM php-cgi.exe
<span style="color: #7a0874; font-weight: bold;">exit</span></pre></div></div>

<p>Teraz wystarczy tylko skonfigurować NGINX tak, by </p>
<ul>
<li>pozwalał na wykonywanie skryptów PHP za pomocą fastCGI</li>
<li>pozwalał na uruchamianie skryptów napisanych we frameworku Symfony</li>
</ul>
<p>Edytujemy skrypt konfiguracyjny NGINXa (<strong>conf/nginx.conf</strong>):</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">worker_processes  <span style="color: #cc66cc;">1</span><span style="color: #00AA00;">;</span>
&nbsp;
events <span style="color: #00AA00;">&#123;</span>
    worker_connections  <span style="color: #cc66cc;">64</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
http <span style="color: #00AA00;">&#123;</span>
    include       mime.types<span style="color: #00AA00;">;</span>
    default_type  application/octet-stream<span style="color: #00AA00;">;</span>
&nbsp;
    client_header_timeout   10m<span style="color: #00AA00;">;</span>
    client_body_timeout     10m<span style="color: #00AA00;">;</span>
    send_timeout            10m<span style="color: #00AA00;">;</span>
&nbsp;
    connection_pool_size            <span style="color: #cc66cc;">256</span><span style="color: #00AA00;">;</span>
    client_header_buffer_size       1k<span style="color: #00AA00;">;</span>
    large_client_header_buffers     <span style="color: #cc66cc;">4</span> 2k<span style="color: #00AA00;">;</span>
    request_pool_size               4k<span style="color: #00AA00;">;</span>
&nbsp;
    gzip on<span style="color: #00AA00;">;</span>
    gzip_min_length <span style="color: #cc66cc;">1100</span><span style="color: #00AA00;">;</span>
    gzip_buffers    <span style="color: #cc66cc;">4</span> 8k<span style="color: #00AA00;">;</span>
    gzip_types      <span style="color: #993333;">text</span>/plain<span style="color: #00AA00;">;</span>
&nbsp;
    output_buffers  <span style="color: #cc66cc;">1</span> 32k<span style="color: #00AA00;">;</span>
    postpone_output <span style="color: #cc66cc;">1460</span><span style="color: #00AA00;">;</span>
&nbsp;
    sendfile        on<span style="color: #00AA00;">;</span>
    tcp_nopush      on<span style="color: #00AA00;">;</span>
    tcp_nodelay     on<span style="color: #00AA00;">;</span>
&nbsp;
    keepalive_timeout       <span style="color: #cc66cc;">75</span> <span style="color: #cc66cc;">20</span><span style="color: #00AA00;">;</span>
    ignore_invalid_headers  on<span style="color: #00AA00;">;</span>
&nbsp;
server <span style="color: #00AA00;">&#123;</span>
    set  $docroot     c<span style="color: #00AA00;">:</span>/dev/php/symfony/myproject<span style="color: #00AA00;">;</span>
    root $docroot/web<span style="color: #00AA00;">;</span>
    index  index.php<span style="color: #00AA00;">;</span>
&nbsp;
    listen       <span style="color: #cc66cc;">80</span><span style="color: #00AA00;">;</span>
    server_name  localhost<span style="color: #00AA00;">;</span>
&nbsp;
    log_format main
                <span style="color: #ff0000;">'$remote_addr - $remote_user [$time_local] '</span>
                <span style="color: #ff0000;">'&quot;$request&quot; $status $bytes_sent '</span>
                <span style="color: #ff0000;">'&quot;$http_referer&quot; &quot;$http_user_agent&quot; '</span>
                <span style="color: #ff0000;">'&quot;$gzip_ratio&quot;'</span><span style="color: #00AA00;">;</span> 
    access_log  $docroot/log/myproject<span style="color: #6666ff;">.access</span><span style="color: #6666ff;">.log</span>  main<span style="color: #00AA00;">;</span>
&nbsp;
    charset utf-<span style="color: #cc66cc;">8</span><span style="color: #00AA00;">;</span>
&nbsp;
    location / <span style="color: #00AA00;">&#123;</span>
        if <span style="color: #00AA00;">&#40;</span>-f $request_filename<span style="color: #00AA00;">&#41;</span> <span style="color: #00AA00;">&#123;</span>
            expires max<span style="color: #00AA00;">;</span>
            break<span style="color: #00AA00;">;</span>
        <span style="color: #00AA00;">&#125;</span>
        rewrite <span style="color: #00AA00;">^</span><span style="color: #00AA00;">&#40;</span>.<span style="color: #00AA00;">*</span><span style="color: #00AA00;">&#41;</span>/index<span style="color: #6666ff;">.php</span> last<span style="color: #00AA00;">;</span>
    <span style="color: #00AA00;">&#125;</span>
&nbsp;
    location /sf/ <span style="color: #00AA00;">&#123;</span>
          root c<span style="color: #00AA00;">:</span>/dev/tools/php/data/symfony-1.2.7/data/web<span style="color: #00AA00;">;</span>
    <span style="color: #00AA00;">&#125;</span>            
&nbsp;
    location ~ \.php<span style="color: #00AA00;">&#40;</span>$|/<span style="color: #00AA00;">&#41;</span> <span style="color: #00AA00;">&#123;</span>
        set $the_uri $uri<span style="color: #00AA00;">;</span>
        if <span style="color: #00AA00;">&#40;</span>$the_uri ~ <span style="color: #ff0000;">&quot;^(.+)/$&quot;</span><span style="color: #00AA00;">&#41;</span> <span style="color: #00AA00;">&#123;</span>
            set $the_uri    $<span style="color: #cc66cc;">1</span><span style="color: #00AA00;">;</span>
        <span style="color: #00AA00;">&#125;</span>
&nbsp;
        set  $script     $the_uri<span style="color: #00AA00;">;</span>
        set  $path_info  <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #00AA00;">;</span>
&nbsp;
        if <span style="color: #00AA00;">&#40;</span>$uri ~ <span style="color: #ff0000;">&quot;^(.+<span style="color: #000099; font-weight: bold;">\.</span>php)(/.+)&quot;</span><span style="color: #00AA00;">&#41;</span> <span style="color: #00AA00;">&#123;</span>
            set  $script     $<span style="color: #cc66cc;">1</span><span style="color: #00AA00;">;</span>
            set  $path_info  $<span style="color: #cc66cc;">2</span><span style="color: #00AA00;">;</span>
        <span style="color: #00AA00;">&#125;</span>
&nbsp;
        fastcgi_index   index.php<span style="color: #00AA00;">;</span>
        fastcgi_pass   127.0.0.1<span style="color: #00AA00;">:</span><span style="color: #cc66cc;">9000</span><span style="color: #00AA00;">;</span>
        include fastcgi_params<span style="color: #00AA00;">;</span>
&nbsp;
        fastcgi_param  SCRIPT_FILENAME  $docroot/web$script<span style="color: #00AA00;">;</span>
        fastcgi_param  SCRIPT_NAME      $script<span style="color: #00AA00;">;</span>
        fastcgi_param  PATH_INFO        $path_info<span style="color: #00AA00;">;</span> 
        fastcgi_param  SERVER_NAME      $host<span style="color: #00AA00;">;</span>
    <span style="color: #00AA00;">&#125;</span>
&nbsp;
    location ~ /\<span style="color: #6666ff;">.ht</span> <span style="color: #00AA00;">&#123;</span>
        deny  all<span style="color: #00AA00;">;</span>
    <span style="color: #00AA00;">&#125;</span>
  <span style="color: #00AA00;">&#125;</span>    
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Pliczek konfiguracyjny NGINX&#8217;a jest dość czytelny i łatwo go zrozumieć (łatwo go też rozbudować i zoptymalizować jeśli np. używamy virtual-hostów). Na uwagę zasługuje jednak fakt, że przed przekazaniem argumentów do FastCGI musimy nieco &#8222;rozpracować&#8221; żądanie i wydobyć z niego zmienne $script i $path_info, ewentualnie usuwając zakańczający je znak slash (zmienna $the_uri). Warto też odnotować, że NGINX wspiera znane z Apacza aliasy &#8211; widoczna tu sekcja <strong>location /sf/</strong>.<br />
Zauważ, że port 9000 wspomniany jest także w skrypcie startującym NGINX &#8211; możesz wybrać dowolny inny większy niż 1024 (niższe wymagają roli administratora i są zarezerwowane dla tzw. <em>well-known-services</em>).</p>
<p>Gotowe, teraz możemy uruchamiać NGINX poleceniem <strong>start-nginx.bat</strong> (z katalogu NGINXa) i zatrzymywać poprzez <strong>stop-nginx.bat</strong>.<br />
Nasz projekt powinien być dostępny pod adresem <a href="http://localhost/">http://localhost/</a> &#8211; czy to zakończonym slashem, czy tez nie.</p>
<p>Oczywiście nie jest to konfiguracja idealna &#8211; wspiera tylko jeden projekt (<strong>myproject</strong>), ale daje dobre podstawy do zbudowania konfiguracji dla wielu projektów i osobnych virtual-hostów dla każdego z nich. Warto wiedzieć, że konfiguracja NGINXa wspiera dyrektywę <strong>include</strong>, dzięki której możliwe jest importowanie konfiguracji z zewnętrznych plików konfiguracyjnych (np. po jednym dla każdego virtual-hosta) np. z sekcjami <strong>server</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://xis.schowek.net/2009/08/24/nginx-z-symfony-pod-windows/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

