{"id":220,"date":"2010-01-01T23:30:56","date_gmt":"2010-01-01T22:30:56","guid":{"rendered":"http:\/\/eriz.pcinside.pl\/weblog\/niezawodny-serwer-freebsd-nginx-php-fastcgi-220.html"},"modified":"2010-01-01T23:30:56","modified_gmt":"2010-01-01T22:30:56","slug":"niezawodny-serwer-freebsd-nginx-php-fastcgi","status":"publish","type":"post","link":"https:\/\/eriz.pcinside.pl\/weblog\/niezawodny-serwer-freebsd-nginx-php-fastcgi-220.html","title":{"rendered":"Niezawodny serwer &#8211; FreeBSD + Nginx + PHP @ FastCGI"},"content":{"rendered":"<p>Ostatnio o Nginksie <a href=\"http:\/\/eriz.pcinside.pl\/weblog\/alternatywa-dla-apachea-nginx-php-fastcgi-w-ubuntu-113.html\">pisa\u0142em<\/a> ju\u017c jaki\u015b czas temu. Pozmienia\u0142o si\u0119 sporo, sam rozw\u00f3j tego demona by\u0142 dla mnie sporym zaskoczeniem. Kiedy\u015b niszowy projekt &#8211; dzisiaj &#8211; zdobywaj\u0105cy popularno\u015b\u0107 w szalonym tempie.<\/p>\n<p>Jednak nie ma co si\u0119 temu dziwi\u0107 &#8211; wydajno\u015b\u0107 jest znacznie wy\u017csza ni\u017c najpopularniejszej koby\u0142y (czyt: Apache). No i fakt, \u017ce jest produkcji rosyjskiej &#8211; ju\u017c kt\u00f3ry\u015b raz z kolei o tym wspominam, a jest to kolejny program potwierdzaj\u0105cy regu\u0142\u0119. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_smile.png\" alt=\":)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p><!--more--><\/p>\n<p>Podczas realizacji jednego projektu nadesz\u0142a konieczno\u015b\u0107 postawienia demona dla do\u015b\u0107 obci\u0105\u017conego serwisu. Wyb\u00f3r pierwotnie pad\u0142 na <a href=\"http:\/\/eriz.pcinside.pl\/weblog\/alternatywa-dla-apache-yaws-php-rewrite-209.html\">YAWS<\/a>, jednak odpad\u0142 on z jednego powodu &#8211; nie zapewnia prawid\u0142owej obs\u0142ugi protoko\u0142u FastCGI. Owszem, pod CGI wszystko dzia\u0142a\u0142o jak najbardziej OK, ale wykorzystanie CGI ma do\u015b\u0107 uci\u0105\u017cliw\u0105 wad\u0119 &#8211; uniemo\u017cliwia skorzystanie z <a href=\"http:\/\/eriz.pcinside.pl\/weblog\/cache-danych-czym-jak-gdzie-i-kiedy-cz-i-teoria-211.html\">akcelerator\u00f3w<\/a>, a to z powodu braku wsp\u00f3\u0142dzielonej pami\u0119ci.<\/p>\n<p>Pozosta\u0142o u\u017cy\u0107 jakiego\u015b innego demona, kt\u00f3ry zapewnia\u0142by wydajno\u015b\u0107 na podobnym poziomie. No i wyb\u00f3r pad\u0142 na <a href=\"http:\/\/nginx.org\/\">Nginx<\/a>.<\/p>\n<p>Ach, przyda\u0142oby si\u0119 jeszcze wspomnie\u0107 o systemie operacyjnym (perfidne, nie? ;)). Oczywi\u015bcie FreeBSD. Jest to chyba system nie do zdarcia; OS z szata\u0144skimi rogami w herbie chyba ani razu mnie nie zawi\u00f3d\u0142, bez problemu znosz\u0105c moje katusze. Podczas obserwacji r\u00f3\u017cnych serwis\u00f3w zajmuj\u0105cych si\u0119 bezpiecze\u0144stwem, bardzo \u0142atwo dostrzec r\u00f3\u017cnic\u0119 w ilo\u015bci dziur wykrytych w <a href=\"http:\/\/secunia.com\/advisories\/product\/2719\/\">Linuksie<\/a> oraz <a href=\"http:\/\/secunia.com\/advisories\/product\/21677\/\">FreeBSD<\/a>.<\/p>\n<h3>FastCGI<\/h3>\n<p>Nie ma co ukrywa\u0107 &#8211; najbrudniejsz\u0105 robot\u0105 jest w tym wszystkim zmuszenie serwera do wsp\u00f3\u0142pracy z PHP poprzez protok\u00f3\u0142 FastCGI. Dlaczego najbrudniejsz\u0105? Ot\u00f3\u017c proces nas\u0142uchuj\u0105cy trzeba najpierw wystartowa\u0107. Kilka lat temu by\u0142o to nieco uci\u0105\u017cliwe, a to za spraw\u0105 braku odpowiednich narz\u0119dzi. Konieczne by\u0142o klepanie skrypt\u00f3w startuj\u0105cych.<\/p>\n<p>Dzisiaj jednak mamy do dyspozycji narz\u0119dzie <a href=\"http:\/\/redmine.lighttpd.net\/projects\/spawn-fcgi\/\">spawn-fcgi<\/a>, kt\u00f3re wykonuje za nas ca\u0142\u0105 czarn\u0105 robot\u0119. Wystarczy wywo\u0142a\u0107 jedno polecenie, a ono bez problemu wystartuje demony w trybie FastCGI, stworzy plik b\u0119d\u0105cy potokiem komunikacyjnym do procesu, czy te\u017c zadba o odpowiednie uprawnienia dla interpretera. Przyznam, \u017ce by\u0142em zaskoczony mo\u017cliwo\u015bciami tego narz\u0119dzia i z czystym sumieniem mog\u0119 stwierdzi\u0107, \u017ce sprawuje si\u0119 ono doskonale. Najciekawsze jest jednak to, \u017ce pochodzi ono&#8230; z konkurencyjnego demona LightTPD. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p>Ostatnio dowiedzia\u0142em si\u0119, \u017ce jest rozwijany alternatywny projekt <a href=\"http:\/\/php-fpm.org\/\">PHP-FPM<\/a>, kt\u00f3ry ma by\u0107 &#8211; w za\u0142o\u017ceniach &#8211; mened\u017cerem proces\u00f3w FastCGI dla PHP. Nie mia\u0142em jednak (jeszcze) okazji go testowa\u0107, ale projekt zapowiada si\u0119 obiecuj\u0105co.<\/p>\n<p>Ach, zapomnia\u0142em &#8211; wszystkie narz\u0119dzia s\u0105 dost\u0119pne z systemu port\u00f3w naszego systemu. Kawka\/herbatka, dost\u0119p do shella i jedziemy. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<h3>instalacja<\/h3>\n<p>Filozofia instalacji oprogramowania z port\u00f3w jest ca\u0142kiem prosta: zazwyczaj w katalogu <em>\/usr\/ports<\/em> jest dost\u0119pne drzewo tzw. port\u00f3w (je\u015bli tam nic nie ma, trzeba je <a href=\"http:\/\/www.freebsd.org\/doc\/en\/books\/handbook\/ports-using.html\">r\u0119cznie pobra\u0107<\/a>). Wyszukiwanie? <em>whereis nazwa<\/em> i si\u0119 dowiemy. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/> Po przej\u015bciu do katalogu z interesuj\u0105cym oprogramowaniem wystarczy <em>make config install clean<\/em>.<\/p>\n<h4>PHP<\/h4>\n<p>Zaczniemy od samego interpretera. Przyznam, \u017ce paczka zosta\u0142a nie\u017ale przygotowana. Wszystko jest w katalogu <em>\/usr\/ports\/lang\/php5<\/em>. <em>make config<\/em> i upewniamy si\u0119, \u017ce obs\u0142uga <em>FastCGI<\/em> jest uaktywniona. I tu musz\u0119 zaznaczy\u0107 jedn\u0105 do\u015b\u0107 istotn\u0105 rzecz: domy\u015blne opcje s\u0105 dobrane pod k\u0105tem bezpiecze\u0144stwa i jest uaktywniony <a href=\"http:\/\/www.hardened-php.net\/suhosin\/\">Suhosin Patch<\/a> oraz wy\u0142\u0105czone <strong>wszystkie<\/strong> rozszerzenia przez prze\u0142\u0105cznik <em>&#8211;disable-all<\/em>. Powoduje to, \u017ce niekt\u00f3re funkcje oznaczone w dokumentacji jako dost\u0119pne domy\u015blne &#8211; zostan\u0105 wy\u0142\u0105czone. Pozostaje wi\u0119c edycja pliku <em>Makefile<\/em> i wyci\u0119cie tego prze\u0142\u0105cznika, albo (co polecam) dopisanie odpowiedniego <em>&#8211;enable-x<\/em> do linii konfiguracyjnej. Dzi\u0119ki temu skompilowane zostanie tylko to, czego naprawd\u0119 potrzebujemy.<\/p>\n<p>Osobi\u015bcie korzystam z takiej zawarto\u015bci zmiennej <em>CONFIGURE_ARGS<\/em>:<\/p>\n<p><code lang=\"shell\">CONFIGURE_ARGS= \\<br \/>\n                --with-layout=GNU \\<br \/>\n                --with-config-file-scan-dir=${PREFIX}\/etc\/php \\<br \/>\n                --disable-all \\<br \/>\n                --enable-libxml \\<br \/>\n                --with-libxml-dir=${LOCALBASE} \\<br \/>\n                --with-mysql \\<br \/>\n                --with-mysqli \\<br \/>\n                --with-curl \\<br \/>\n                --with-zlib \\<br \/>\n                --with-iconv \\<br \/>\n                --with-gd \\<br \/>\n                --with-jpeg-dir=\/usr\/local\/lib \\<br \/>\n                --with-pdo-mysql \\<br \/>\n                --with-pcre-regex \\<br \/>\n                --with-bz2 \\<br \/>\n                --with-mbstring \\<br \/>\n                --enable-simplexml \\<br \/>\n                --enable-xmlreader \\<br \/>\n                --enable-xmlwriter \\<br \/>\n                --enable-xml \\<br \/>\n                --enable-reflection \\<br \/>\n                --enable-session \\<br \/>\n                --enable-pdo=static \\<br \/>\n                --enable-filter \\<br \/>\n                --enable-json \\<br \/>\n                --enable-spl \\<br \/>\n                --with-mcrypt \\<br \/>\n                --program-prefix=\"\"<br \/>\n<\/code><\/p>\n<p>Po zapisaniu wydajemy polecenie <em>make install clean<\/em> i po pobraniu, kompilacji wszystko powinno by\u0107 dost\u0119pne. Sprawd\u017a wykonuj\u0105c <em>php-cgi -v<\/em>. Je\u015bli zostanie wy\u015bwietlony numer wersji &#8211; wszystko jest jak najbardziej OK. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_smile.png\" alt=\":)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/> Teraz wystarczy stworzy\u0107 plik <em>php.ini<\/em> i umie\u015bci\u0107 go w katalogu <em>\/usr\/local\/etc<\/em>.<\/p>\n<h4>spawn-fcgi<\/h4>\n<p>No tu nie ma si\u0119 do czego przyczepi\u0107 &#8211; <em>make install clean<\/em> w katalogu <em>\/usr\/ports\/www\/spawn-fcgi<\/em> i tyle.<\/p>\n<h4>nginx<\/h4>\n<p>Demon znajduje si\u0119 w katalogu <em>\/usr\/ports\/www\/nginx<\/em>. <em>make install<\/em>, zmiana konfiguracji (ekran pokazuje si\u0119 zawsze przy pierwszej pr\u00f3bie instalacji; domy\u015blne opcje b\u0119d\u0105 w 99% wystarczaj\u0105ce), enter. Wszystko. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p>Upewnij si\u0119 tylko, czy w pliku <em>\/etc\/rc.conf<\/em> widnieje wpis <em>nginx_enable=&#8221;YES&#8221;<\/em>. Sprawi on, \u017ce przy ka\u017cdym starcie systemu zostanie uruchomiony r\u00f3wnie\u017c Nginx, na czym nam zale\u017cy.<\/p>\n<p>Wykonanie <em>\/usr\/local\/etc\/rc.d\/nginx start<\/em> i wpisanie do paska adresu przegl\u0105darki adresu IP serwera powinno zaowocowa\u0107 wy\u015bwietleniem strony testowej Nginksa.<\/p>\n<h3>Konfiguracja PHP pod FastCGI<\/h3>\n<p>Nie b\u0119d\u0119 si\u0119 skupia\u0142 na niuansach pliku konfiguracyjnego Nginx, opisz\u0119 tylko to, czego potrzebujemy, aby nak\u0142oni\u0107 demon do wsp\u00f3\u0142pracy z PHP. Najpierw musimy jednak wystartowa\u0107 procesy PHP, kt\u00f3re b\u0119d\u0105 oczekiwa\u0142y na \u017c\u0105dania ze strony serwera WWW.<\/p>\n<p>Demony we FreeBSD zosta\u0142y tak przygotowane, aby da\u0142o si\u0119 nimi centralnie zarz\u0105dza\u0107. Tak samo jest i w przypadku <em>spawn-php<\/em>. Otwieramy plik <em>\/etc\/rc.conf<\/em> w jakim\u015b edytorze (ja korzystam z <em>ee<\/em>) i dopisujemy do niego:<\/p>\n<p><code lang=\"shell\"><br \/>\nspawn_fcgi_enable=\"YES\"<br \/>\n<\/code><\/p>\n<p>Je\u015bli nie potrzebujemy dodatkowych opcji, typu zmiana liczby proces\u00f3w-dzieci interpretera (zbyt niska ilo\u015b\u0107 spowoduje b\u0142\u0119dy 408 i 50x zamiast po\u017c\u0105danej strony), mo\u017cemy na tym sko\u0144czy\u0107. Pe\u0142n\u0105 list\u0119 opcji, kt\u00f3re mo\u017cemy zmieni\u0107, znajdziemy w pliku <em>\/usr\/local\/etc\/rc.d\/spawn-fcgi<\/em>:<\/p>\n<p><code lang=\"shell\">: ${spawn_fcgi_enable=\"NO\"}<br \/>\n: ${spawn_fcgi_app=\"\/usr\/local\/bin\/php-cgi\"}<br \/>\n: ${spawn_fcgi_app_args=\"\"}<br \/>\n: ${spawn_fcgi_pidfile=\"\/var\/run\/spawn-fcgi.pid\"}<br \/>\n: ${spawn_fcgi_username=\"www\"}<br \/>\n: ${spawn_fcgi_groupname=\"www\"}<br \/>\n: ${spawn_fcgi_chroot_dir=\"\"}<br \/>\n: ${spawn_fcgi_bindaddr=\"127.0.0.1\"}<br \/>\n: ${spawn_fcgi_bindport=\"8118\"}<br \/>\n: ${spawn_fcgi_bindsocket=\"\"}<br \/>\n: ${spawn_fcgi_bindsocket_mode=\"0777\"}<br \/>\n: ${spawn_fcgi_children=\"16\"}<br \/>\n: ${spawn_fcgi_max_requests=\"1000\"}<br \/>\n: ${spawn_fcgi_web_server_addrs=\"\"}<br \/>\n: ${spawn_fcgi_allowed_env=\"\"}<br \/>\n: ${spawn_fcgi_path_env=\"\/sbin:\/bin:\/usr\/sbin:\/usr\/bin:\/usr\/games:\/usr\/local\/sbin\"<br \/>\n<\/code><\/p>\n<p>Bardzo \u0142atwo jest si\u0119 domy\u015ble\u0107, \u017ce w celu nadpisania kt\u00f3rej\u015b z domy\u015blnych zmiennych, wystarczy dopisa\u0107 do pliku <em>rc.conf<\/em> now\u0105 warto\u015b\u0107, a zostanie ona uwzgl\u0119dniona, np. <em>spawn_fcgi_bindport=&#8221;8282&#8243;<\/em>.<\/p>\n<p>Teraz wystarczy uruchomi\u0107 nasz skrypt poleceniem <em>\/usr\/local\/etc\/rc.d\/spawn-fcgi start<\/em>. Je\u015bli ujrzymy komunikat:<\/p>\n<p><code lang=\"text\">Starting spawn_fcgi.<br \/>\nspawn-fcgi: child spawned successfully: PID: XXXX<\/code><\/p>\n<p>To oznacza, \u017ce wszystko jest w porz\u0105dku i mo\u017cna przyst\u0105pi\u0107 do w\u0142a\u015bciwej konfiguracji serwera.<\/p>\n<h3>Nginx i jego bebechy<\/h3>\n<p>W domy\u015blnym pliku konfiguracyjnym nie b\u0119dziemy grzeba\u0107 za wiele; potrzebujemy zmieni\u0107 tylko nast\u0119puj\u0105ce linijki:<\/p>\n<p><code lang=\"apache\"> location \/ {<br \/>\n            index index.php;<br \/>\n            root  \/var\/www\/public_html;<br \/>\n        }<\/p>\n<p>        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000<br \/>\n        #<br \/>\n        location ~ \\.php$ {<br \/>\n            include \/usr\/local\/etc\/nginx\/fastcgi_params;<br \/>\n            fastcgi_pass   127.0.0.1:8282;<br \/>\n            fastcgi_index  index.php;<br \/>\n        }<\/code><\/p>\n<p>Za wiele do roboty nie jest. Teraz obja\u015bnienia:<\/p>\n<ol>\n<li>Najpierw zmieniamy domy\u015blny plik, kt\u00f3rego demon poszukuje w przypadku, gdy odwiedzaj\u0105cy otwiera stron\u0119 g\u0142\u00f3wn\u0105.<\/li>\n<li>Katalog na serwis oczywi\u015bcie te\u017c wypada poda\u0107. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/li>\n<li>Nast\u0119pna sekcja odpowiada za komunikacj\u0119 serwera z procesami FastCGI. Podajemy hosta (w 99,99% przypadk\u00f3w <em>127.0.0.1<\/em>) oraz port, kt\u00f3ry wskazali\u015bmy w konfiguracji <em>spawn-fcgi<\/em>, b\u0105d\u017a domy\u015blny (patrz: wcze\u015bniejszy listing).\n<li>Linijka wcze\u015bniej za\u0142\u0105cza plik, w kt\u00f3rym s\u0105 zadeklarowane pewne zmienne niezb\u0119dne w sterowaniu procesem PHP.<\/li>\n<li>No i ponownie domy\u015blny dokument. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/li>\n<\/ol>\n<p>Czy to wszystko? Restart demona (<em>\/usr\/local\/etc\/rc.d\/nginx restart<\/em>). <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<h3>tuning piaskownicy oraz zabawki<\/h3>\n<h4>przepychacz do rur<\/h4>\n<p>Praktycznie nigdzie nie wspomina si\u0119 o jednej sytuacji, z kt\u00f3r\u0105 musia\u0142em si\u0119 zmaga\u0107 &#8211; mianowicie, ze zbyt ma\u0142ym rozmiarem bufora \u017c\u0105dania danych HTTP. Na og\u00f3\u0142 powy\u017csza konfiguracja powinna dzia\u0142a\u0107 bez zarzutu, jednak niekt\u00f3re serwisy b\u0119d\u0105 sypa\u0142y b\u0142\u0119dami. Dotyczy to skrypt\u00f3w, kt\u00f3re wysy\u0142aj\u0105 du\u017c\u0105 ilo\u015b\u0107 ciasteczek, ale przy odes\u0142aniu przez przegl\u0105dark\u0119 nie przechodza one ju\u017c do PHP. Rozwi\u0105zaniem jest edycja pliku <em>fastcgi_params<\/em> oraz dopisanie:<\/p>\n<p><code lang=\"apache\">fastcgi_connect_timeout 60;<br \/>\nfastcgi_send_timeout 180;<br \/>\nfastcgi_read_timeout 180;<br \/>\nfastcgi_buffer_size 128k;<br \/>\nfastcgi_buffers 4 256k;<br \/>\nfastcgi_busy_buffers_size 256k;<br \/>\nfastcgi_temp_file_write_size 256k;<br \/>\nfastcgi_intercept_errors on;<\/code><\/p>\n<p>Po restarcie serwera nie powinno by\u0107 ju\u017c b\u0142\u0119d\u00f3w.<\/p>\n<h4>mod_rewrite<\/h4>\n<p>O ile w przypadku <a href=\"http:\/\/eriz.pcinside.pl\/weblog\/mod_rewrite-pozornie-beznadziejne-problemy-ktore-mozna-rozwiazac-208.html\">mod_rewrite<\/a> w formacie Apache powiedziane zosta\u0142o praktycznie wszystko, to w przypadku alternatywnych demon\u00f3w s\u0105 pewne problemy &#8211; inny format oraz brak obs\u0142ugi plik\u00f3w <em>htaccess<\/em>. Jest to jednocze\u015bnie wad\u0105 i zalet\u0105 &#8211; nie mo\u017cna dynamicznie zmienia\u0107 regu\u0142, ale serwer nie szuka ka\u017cdorazowo nadpisa\u0144 konfiguracji.<\/p>\n<p><p>Przenosz\u0105c pewien serwis trafi\u0142em przypadkiem na <a href=\"http:\/\/blog.piotrsikora.pl\/11\/convert-apache-rewrite-to-nginx\">konwerter regu\u0142ek<\/a>.<\/p>\n<h3>koniec?<\/h3>\n<p>W\u0142a\u015bciwie tak. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/> Wypada\u0142oby poda\u0107 jeszcze ciekawe strony, do kt\u00f3rych warto si\u0119 odnie\u015b\u0107. Do\u015bwiadczeniami z praktyki si\u0119 podzieli\u0142em, teraz troch\u0119 link\u00f3w:<\/p>\n<ul>\n<li><a href=\"http:\/\/pbj.ca\/FNMP-install-laconica.html\">http:\/\/pbj.ca\/FNMP-install-laconica.html<\/a><\/li>\n<li><a href=\"http:\/\/www.hilik.org.ua\/spawn-fcgi-\u0434\u0435\u043b\u0430\u0435\u043c-php-fast-cgi-\u0441\u0435\u0440\u0432\u0435\u0440\/\">http:\/\/www.hilik.org.ua\/spawn-fcgi-\u0434\u0435\u043b\u0430\u0435\u043c-php-fast-cgi-\u0441\u0435\u0440\u0432\u0435\u0440\/<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Ostatnio o Nginksie pisa\u0142em ju\u017c jaki\u015b czas temu. Pozmienia\u0142o si\u0119 sporo, sam rozw\u00f3j tego demona by\u0142 dla mnie sporym zaskoczeniem. Kiedy\u015b niszowy projekt &#8211; dzisiaj &#8211; zdobywaj\u0105cy popularno\u015b\u0107 w szalonym tempie. Jednak nie ma co si\u0119 temu dziwi\u0107 &#8211; wydajno\u015b\u0107 jest znacznie wy\u017csza ni\u017c najpopularniejszej koby\u0142y (czyt: Apache). No i fakt, \u017ce jest produkcji rosyjskiej [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,11,12],"tags":[48,98,32,120,30,112],"_links":{"self":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/posts\/220"}],"collection":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/comments?post=220"}],"version-history":[{"count":0,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/posts\/220\/revisions"}],"wp:attachment":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/media?parent=220"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/categories?post=220"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/tags?post=220"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}