<?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>przełam sieć &#187; nginx</title>
	<atom:link href="http://iworks.pl/tag/nginx/feed/" rel="self" type="application/rss+xml" />
	<link>http://iworks.pl</link>
	<description>Zawodowa wizytówka, portfolio oraz stroną mojej firmy.</description>
	<lastBuildDate>Fri, 30 Jul 2010 11:53:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>403 dla określonych refererów w nginx</title>
		<link>http://iworks.pl/403-dla-okreslonych-refererow-w-nginx/</link>
		<comments>http://iworks.pl/403-dla-okreslonych-refererow-w-nginx/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 17:11:26 +0000</pubDate>
		<dc:creator>Marcin</dc:creator>
				<category><![CDATA[default]]></category>
		<category><![CDATA[403]]></category>
		<category><![CDATA[hotlink]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://iworks.pl/?p=700</guid>
		<description><![CDATA[W serwisie klienta jest dużo plików graficznych, które są hotlinkowane. Generalnie klientowi to nie przeszkadza, bo uważa, że sieć jest od tego żeby się dzielić. Jest jedno ale. Jest parę serwisów które mają na tyle dużą oglądalność, że umieszczone tam grafiki pochłaniają po prostu za dużo pasma i należało by je zablokować. Serwis serwowany jest [...]]]></description>
			<content:encoded><![CDATA[<p>W serwisie klienta jest dużo plików graficznych, które są hotlinkowane. Generalnie klientowi to nie przeszkadza, bo uważa, że sieć jest od tego żeby się dzielić. Jest jedno ale. Jest parę serwisów które mają na tyle dużą oglądalność, że umieszczone tam grafiki pochłaniają po prostu za dużo pasma i należało by je zablokować.</p>
<p>Serwis serwowany jest za pomocą <a href="http://wiki.nginx.org/#referrer=iworks.pl">nginx</a>&#8216;a. Samo blokowanie hotlinków jest bardzo proste i w całej sieci można znaleźć mnóstwo przykładów, różniących się warunkiem w location, które sprowadzają się do następującej konfiguracji:</p>
<p><code>location ~ \.(jpg|png|gif)$ {<br />
    valid_referers server_names blocked none frienddomain.com *.frienddomain.com;<br />
    if ($invalid_referer) {<br />
        return 403;<br />
    }<br />
}</code></p>
<p>W której wpisujemy listę dopuszczonych do hotlinkowania domen, pamiętając o słówku <em>none</em>, które oznacza brak referera.</p>
<p>Ale tak jak pisałem wcześniej, klient chciał zablokować tylko określone domeny, niech to będą foo.ba i bar.fo. Konfiguracja ostatecznie wygląda w taki sposób:</p>
<p><code>location / {<br />
    if ($http_referer ~* "foo.ba|bar.fo" ) {<br />
        rewrite .* /foo/ last;<br />
    }<br />
    [...]<br />
}<br />
location /foo {<br />
    return 403;<br />
}</code></p>
]]></content:encoded>
			<wfw:commentRss>http://iworks.pl/403-dla-okreslonych-refererow-w-nginx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IP użytkownika w tandemie nginx proxy i nginx</title>
		<link>http://iworks.pl/ip-uzytkownika-w-tandemie-nginx-proxy-i-nginx/</link>
		<comments>http://iworks.pl/ip-uzytkownika-w-tandemie-nginx-proxy-i-nginx/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 11:18:56 +0000</pubDate>
		<dc:creator>Marcin</dc:creator>
				<category><![CDATA[default]]></category>
		<category><![CDATA[konfiguracja]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[remote_addr]]></category>

		<guid isPermaLink="false">http://iworks.pl/?p=634</guid>
		<description><![CDATA[Mamy zestaw dwóch serwerów: nginx &#8211; przekazujący ruch do wewnętrznych serwerów (proxy) nginx &#8211; hostujący serwis Konfiguracja na dla domeny iworks.pl na pierwszym z nich wygląda następująco: server { server_name iworks.pl www.iworks.pl; listen 80; access_log /var/log/nginx/iworks.pl.access.log; error_log /var/log/nginx/iworks.pl.error.log; location / { proxy_pass http://127.0.0.1:11097/; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } [...]]]></description>
			<content:encoded><![CDATA[<p>Mamy zestaw dwóch serwerów:</p>
<ol>
<li>nginx &#8211; przekazujący ruch do wewnętrznych serwerów (proxy)</li>
<li>nginx &#8211; hostujący serwis</li>
</ol>
<p>Konfiguracja na dla domeny iworks.pl na pierwszym z nich wygląda następująco:</p>
<p><code>server {<br />
    server_name iworks.pl www.iworks.pl;<br />
    listen 80;<br />
    access_log  /var/log/nginx/iworks.pl.access.log;<br />
    error_log   /var/log/nginx/iworks.pl.error.log;<br />
    location / {<br />
        proxy_pass         http://127.0.0.1:11097/;<br />
        proxy_redirect     off;<br />
        proxy_set_header   Host             $host;<br />
        proxy_set_header   X-Real-IP        $remote_addr;<br />
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;<br />
    }<br />
}</code></p>
<p>Informacja o prawdziwym IP użytkownika jest przekazywana dalej w linijce: <code>proxy_set_header   X-Real-IP        $remote_addr;</code></p>
<p>W celu wykorzystania go na drugim serwerze, tym który hostuje stronę, należy w pliku <code>/etc/nginx/fastcgi_params</code></p>
<p>Zmienić linijkę<br />
<code>fastcgi_param  REMOTE_ADDR        $remote_addr;</code><br />
na<br />
<code>fastcgi_param  REMOTE_ADDR        $http_x_real_ip;</code><br />
dzięki czemu na serwerze hostującym adres użytkownika oglądającego stronę będzie &#8222;prawdziwy&#8221;, zamiast być adresem serwera proxującego.</p>
]]></content:encoded>
			<wfw:commentRss>http://iworks.pl/ip-uzytkownika-w-tandemie-nginx-proxy-i-nginx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wordpress i nginx w jednym miejscu stali</title>
		<link>http://iworks.pl/wordpress-i-nginx-w-jednym-miejscu-stali/</link>
		<comments>http://iworks.pl/wordpress-i-nginx-w-jednym-miejscu-stali/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 21:15:00 +0000</pubDate>
		<dc:creator>Marcin</dc:creator>
				<category><![CDATA[default]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[rewrite]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://iworks.pl/?p=629</guid>
		<description><![CDATA[Przenoszę serwisy z jednego serwera na drugi i na tym drugim z założenia ma nie być apache&#8217;a. na pierwszy ogień poszedł najmniejszy z wordpressów, taki którego można by przenieść nawet ręcznie. Kilka wpisów na krzyż, kilka wtyczek i tworzony wciąż szablon wyglądu. Na pierwszy ogień przeszła przeprowadzka bazy, więc dump z bazy mysql (systemowa baza [...]]]></description>
			<content:encoded><![CDATA[<p>Przenoszę serwisy z jednego serwera na drugi i na tym drugim z założenia ma nie być apache&#8217;a. na pierwszy ogień poszedł najmniejszy z wordpressów, taki którego można by przenieść nawet ręcznie. Kilka wpisów na krzyż, kilka wtyczek i tworzony wciąż szablon wyglądu.</p>
<p>Na pierwszy ogień przeszła przeprowadzka bazy, więc dump z bazy <strong>mysql</strong> (systemowa baza serwera) w celu wyciągnięcia danych z tabel <strong>db</strong> oraz <strong>user</strong> oraz przerzucenie dwóch rekordów do nowej bazy. Potem <code>CREATE DATABASE nazwa;</code> i import dumpa.</p>
<p>Sama konfiguracja wirtuala to moment, choć sposób wykorzystania php w trybie cgi wymaga własnego wpisu, poszła bez kłopotu.</p>
<p>Do typowej konfiguracji musiałem dodać tylko wpisy dotyczące kodowania i zmienić index katalogu na index.php.</p>
<p>Ponieważ odnośniki są ustawione jako <strong>/%postname%/</strong> wymagane jest użycie reguł rewrite&#8217;ów, które dla apache&#8217;a są tworzone z automatu.</p>
<p>Dla nginx&#8217;a wygląda to następująco:</p>
<pre>location / {
    root   /ścieżka_do_document_roota;
    if (-e $request_filename) {
        break;
    }
    rewrite ^(.+)$ /index.php?q=$1 last;
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://iworks.pl/wordpress-i-nginx-w-jednym-miejscu-stali/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>nginx + ssl</title>
		<link>http://iworks.pl/nginx-ssl/</link>
		<comments>http://iworks.pl/nginx-ssl/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 13:15:22 +0000</pubDate>
		<dc:creator>Marcin</dc:creator>
				<category><![CDATA[default]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[wiki]]></category>

		<guid isPermaLink="false">http://iworks.pl/?p=595</guid>
		<description><![CDATA[Jakiś czas temu stawiałem wiki, gdzie kolejnym krokiem po tym jak serwis został zablokowany poprzez htaccess było przestawienie całości do pracy z certyfikatem ssl z wykorzystaniem szyfrowania. Konieczność jeżeli mają tam być przechowywane np. hasła rootów. Certyfikat który podpiąłem jest certyfikatem który sam podpisałem. generowanie klucza prywatnego wykonanie następującego polecenia: openssl genrsa -des3 -out server.key [...]]]></description>
			<content:encoded><![CDATA[<p>Jakiś czas temu stawiałem <a href="http://iworks.pl/wiki-instalacj-mediawiki/">wiki</a>, gdzie kolejnym krokiem po tym jak serwis został zablokowany poprzez htaccess było przestawienie całości do pracy z certyfikatem ssl z wykorzystaniem szyfrowania. Konieczność jeżeli mają tam być przechowywane np. hasła rootów.</p>
<p>Certyfikat który podpiąłem jest certyfikatem który sam podpisałem. </p>
<h2>generowanie klucza prywatnego</h2>
<p>wykonanie następującego polecenia:<br />
<code>openssl genrsa -des3 -out server.key 1024</code><br />
spowoduje wygenerowanie klucza:<br />
<code>Generating RSA private key, 1024 bit long modulus<br />
.........++++++<br />
..............++++++<br />
e is 65537 (0x10001)<br />
Enter pass phrase for server.key:<br />
Verifying - Enter pass phrase for server.key:</code><br />
pierwszą wadą tego klucza jest fakt posiadania przez niego hasła, co by oznaczało, że przy każdym restarcie serwera korzystającego z tego klucza, istniała by potrzeba wpisywania tego hasła.</p>
<h2>generowanie <acronym title="Certificate Signing Request">CSR</acronym></h2>
<p>Pierwszym elementem prowadzącym do wygenerowania certyfikatu jest wygenerowanie pliku który dopiero potem będzie podpisany przez wcześniej wygenerowany klucz prywatny.</p>
<p><code>openssl req -new -key server.key -out server.csr</code></p>
<p>zostaniemy poproszeni o hasło:</p>
<p><code>Enter pass phrase for server.key:</code></p>
<p>By potem wypełnić dane:</p>
<p><code>You are about to be asked to enter information that will be incorporated<br />
into your certificate request.<br />
What you are about to enter is what is called a Distinguished Name or a DN.<br />
There are quite a few fields but you can leave some blank<br />
For some fields there will be a default value,<br />
If you enter '.', the field will be left blank.<br />
-----<br />
Country Name (2 letter code) [AU]:PL<br />
State or Province Name (full name) [Some-State]:mazowieckie<br />
Locality Name (eg, city) []:Warszawa<br />
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Firma<br />
Organizational Unit Name (eg, section) []:<br />
Common Name (eg, YOUR name) []:<br />
Email Address []:<br />
<br />
Please enter the following 'extra' attributes<br />
to be sent with your certificate request<br />
A challenge password []:<br />
An optional company name []:</code></p>
<h2>utworzenie klucza bez hasła</h2>
<p>Aby usunąć &#8222;wadę&#8221; i posiadać klucz bez hasła należy wykonać:<br />
<code>cp server.key server.key.org<br />
openssl rsa -in server.key.org -out server.key</code></p>
<h2>podpisanie CSR&#8217;a</h2>
<p>Na sam koniec generowania klucza ssl, musimy go podpisać np na rok:<br />
<code>openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt</code><br />
Co daje nam efekt:<br />
<code>Signature ok<br />
subject=/C=PL/ST=mazowieckie/L=Warszawa/O=Firma<br />
Getting Private key</code></p>
<h2>instalacja klucza i certyfikatu</h2>
<p>Ponieważ używanym serwerem jest nginx to kopiuję sobie:<br />
<code>cp server.crt /etc/nginx/ssl/cert.pem<br />
cp server.key /etc/nginx/ssl/cert.key</code</p>
<h2>podpinanie do konfiguracji</h2>
<p>do konfiguracji dodałem:<br />
<code>listen               443;<br />
ssl                  on;<br />
ssl_certificate      /usr/local/nginx/conf/cert.pem;<br />
ssl_certificate_key  /usr/local/nginx/conf/cert.key;</code><br />
potem restart i śmiga... prawie.</p>
<p>Okazało się że wiki działa dobrze, ale nie grzeje :D. Całość wiki działa dobrze, oprócz niektórych odnośników. Np. "losowa strona" powoduje przejście na port 80. Kluczem jest zmiana konfiguracji w pliku: <em>LocalSettings.php</em><br />
<code>$wgServer           = "https://serwer...";</code></p>
]]></content:encoded>
			<wfw:commentRss>http://iworks.pl/nginx-ssl/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>wiki potrzebna od zaraz</title>
		<link>http://iworks.pl/wiki-instalacj-mediawiki/</link>
		<comments>http://iworks.pl/wiki-instalacj-mediawiki/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 14:40:24 +0000</pubDate>
		<dc:creator>Marcin</dc:creator>
				<category><![CDATA[default]]></category>
		<category><![CDATA[bsd]]></category>
		<category><![CDATA[mediawiki]]></category>
		<category><![CDATA[mojomojo]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[wikimatrix]]></category>

		<guid isPermaLink="false">http://iworks.pl/?p=578</guid>
		<description><![CDATA[Jak liczba obsługiwanych maszyn zrobi się większa niż jeden (lub dwadzieścia, jak to woli) to warto by było gdzieś zapisać pewne rzeczy związane z działaniem skryptów, konfiguracją usług oraz wielu innych ważnych i mniej ważnych rzeczy. Oczywiście można wszystko trzymać w plikach, a pliki w repozytorium, ale przy osiągnięciu pewnej masy zapisanych informacji zaczynają się [...]]]></description>
			<content:encoded><![CDATA[<p>Jak liczba obsługiwanych maszyn zrobi się większa niż jeden (lub dwadzieścia, jak to woli) to warto by było gdzieś zapisać pewne rzeczy związane z działaniem skryptów, konfiguracją usług oraz wielu innych ważnych i mniej ważnych rzeczy. Oczywiście można wszystko trzymać w plikach, a pliki w repozytorium, ale przy osiągnięciu pewnej masy zapisanych informacji zaczynają się trudności w dostępie do zgromadzonej wiedzy, szczególnie, że serwerów i usług raczej przybywa niż ubywa. Wydaje się, że rozwiązaniem jest postawienie <strong>wiki</strong>. I tak właśnie się stało, choć z przygodami.</p>
<p>Po pierwsze wiki to raczej filozofia budowy strony i trzymania informacji, a nie konkretne rozwiązanie programistyczne, co odkryłem z pewnym zdziwieniem, próbując dobrać taki soft, który spełniałby nasze wymagania. Na początek miało to być perlowe i pracować z postgresem. Korzystając ze strony <a href="http://www.wikimatrix.org/wizard.php#referrer=iworks.pl">Wiki Choice Wizard</a> i wyklikując pracowicie poszczególne wymagania w pewnym momencie osiągnąłem grala: na liście pozostał tylko jeden soft o wdzięcznej nazwie <a href="http://mojomojo.org/#referrer=iworks.pl">mojomojo</a>. Spełniało wszystkie wymagania a dodatkowo najmilsza możliwa licencja: <a href="http://pl.wikipedia.org/wiki/Licencja_BSD#referrer=iworks.pl" class="wiki">BSD</a>.</p>
<p>Instalacja poszła jak z płatka, problemy zaczęły się po chwili i były związane z założeniami. Na serwerze usługi są rozdzielone pomiędzy chrooty. W tej sprawie interesują nas 2 z nich. Pierwszym chrootem jest chroot zwany głównym webowym, w których działa nginx jako serwer proxujący. Założeniem było również to, że ma proxować urla do serwera działającego w innych chroocie na losowym porcie (bezpieczeństwo), czyli serwis pracujący w domena/wiki znajduje się na innym serwerze. Konfiguracja wygląda następująco:<br />
<span id="more-578"></span></p>
<pre class="conf">location /wiki/ {
    proxy_pass         http://127.0.0.1:PORT/wiki/;
    proxy_redirect     off;

    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
}</pre>
<p>Mojomojo zostało zainstalowane we własnych chroocie w którym jako serwer www zainstalowany został nginx i tu właściwie zaczęły się kłopty z mojomojo, które doprowadziły do zakończenia współpracy z tym softem. Nie potrafiłem zmusić mojomojo do pracy w taki sposób, żeby używał w ścieżce prefiksu &#8222;wiki&#8221;. Po prostu nic. Nie dał się. Chroot został skasowany.</p>
<p>Taki obrót sprawy spowodował, że wróciłem do wikimatrix w celu znalezienia kolejnego kandydata. Tym razem kryterium zostało zmienione: nadal wymaganą bazą danych miał być postgresql, ale też możliwość prefiksowania tworzonych odnośników. Nistety dla mnie wynik nie pokazał jedynego kandydata, ale pokazał za to <a href="http://www.mediawiki.org/wiki/MediaWiki#referrer=iworks.pl">mediawiki</a>, którą na początku jak &#8222;zbyt dużą&#8221; skreśliłem.</p>
<p>Ponieważ MediaWiki jest napisana w php to trzeba było zainstalować również ten język, a ponieważ serwerem www jest nginx to php został puszczony w trybie fast_cgi z następującymi parametrami:</p>
<pre>fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;</pre>
<p>Tym razem proces instalacji i uruchomienia przebiegł dość spokojnie. W pewnym momencie brakowało php&#8217;owi pamięci no zagwostką były problemy z proxowaniem objawiające się tym, że serwis redirectował się na lokalne IP, czyli to na którym tak naprawdę pracował, co powodowało brak dostępu. Rozwiązaniem było dodanie do konfiguracje w głównym systemie linijki:<br />
<code>proxy_redirect     off;</code> i wszystko śmiga jak należało.</p>
<p>Następnym krokiem było włączenie autoryzacji basic http w celu ograniczenia dostępu do danych. Ten sposób autoryzacji jest wystarczający, a samo bezpieczeństwo hasła opiera się na tym, że wiki będzie dostępne tylko po ssl&#8217;u. Konfiguracja nginx&#8217;a w chroocie wiki wygląda następująco:</p>
<pre>server {
    listen      PORT;
    server_name localhost;

    access_log  /var/log/nginx/mediawiki.access.log;

    location / {
        root /var/www/nginx;
        index index.php index.html index.htm;
        auth_basic "relam name";
        auth_basic_user_file path.to.htpasswd;
    }

    location ~ \.php$ {
        root /var/www/nginx;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass  127.0.0.1:PORT;
        auth_basic "relam name";
        auth_basic_user_file path.to.htpasswd;
    }
}</pre>
<p>Rzecz o której należy pamiętać to sposób kodowania hasła i o ile do tworzenia używamy apachowego htpasswd to trzeba użyć przełącznika -d w celu włączenia kodowania hasła za pomocą CRYPT &#8211; inne sposoby po prostu nie działają w nginx.</p>
<p>Skoro użytkownik pojawia się już na etapie dostępu do serwisu to należy go jako takiego zalogować i do tego wykorzystałem plugin <a href="http://www.mediawiki.org/wiki/Extension:HttpAuth#referrer=iworks.pl">HttpAuth</a>.</p>
<p>Ostatnią rzeczą było schowanie przycisków logowania metodą dość toporną, ale prostą i skuteczną:<br />
<code>li#pt-anonlogin, li#pt-logout, li#pt-login, li#pt-anonlogout<br />
{<br />
    display: none;<br />
}</code></p>
]]></content:encoded>
			<wfw:commentRss>http://iworks.pl/wiki-instalacj-mediawiki/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
