{"id":113,"date":"2007-06-08T11:23:26","date_gmt":"2007-06-08T10:23:26","guid":{"rendered":"http:\/\/eriz.pc-inside.org\/weblog\/alternatywa-dla-apachea-nginx-php-fastcgi-w-ubuntu-113.html"},"modified":"2007-06-08T11:23:47","modified_gmt":"2007-06-08T10:23:47","slug":"alternatywa-dla-apachea-nginx-php-fastcgi-w-ubuntu","status":"publish","type":"post","link":"https:\/\/eriz.pcinside.pl\/weblog\/alternatywa-dla-apachea-nginx-php-fastcgi-w-ubuntu-113.html","title":{"rendered":"Alternatywa dla Apache&#8217;a &#8211; nginx + PHP @ FastCGI w Ubuntu"},"content":{"rendered":"<p>Ostatnio musia\u0142em postawi\u0107 serwerek na dosy\u0107 ubogim w pami\u0119\u0107 sprz\u0119cie. No ok \u2013 Ubuntu, MySQL, Apac&#8230; STOP! Po chorob\u0119 mi Apache?! Przecie\u017c 90% jego funkcjonalno\u015bci w przysz\u0142o\u015bci nie b\u0119dzie u\u017cywana. O tym, \u017ce cz\u0119sto dzia\u0142a to \u015blamazarnie \u2013 nie wspomn\u0119.<\/p>\n<p>Kt\u00f3rego\u015b razu, <a href=\"http:\/\/0x1fff.com\">Sinx<\/a> poleci\u0142 mi co\u015b takiego jak <a href=\"http:\/\/nginx.net\">nginx<\/a>.<\/p>\n<p>Jest to demon autorstwa rosyjskich programist\u00f3w. Ju\u017c sama ta informacja mnie zaciekawi\u0142a. Dlaczego? W ko\u0144cu Rosjanie pisz\u0105 najwydajniejsze aplikacje (przynajmniej, w moim mniemaniu). <a href=\"http:\/\/www.nginx.net\/\">Strona<\/a> nie prezentuje si\u0119 mo\u017ce bardzo efektywnie, ale &#8222;nie szata zdobi cz\u0142owieka&#8221;. Nie mia\u0142em nic do stracenia, przeciwnie \u2013 mog\u0142em wy\u0142\u0105cznie zyska\u0107.<\/p>\n<p>Na dodatek, gdzie\u015b przeczyta\u0142em, \u017ce nginx obs\u0142uguje najbardziej obci\u0105\u017cone serwisy w Rosji. ;]<\/p>\n<p><!--more--><\/p>\n<p>Zabra\u0142em si\u0119 do instalacji. Musz\u0119 przyzna\u0107, \u017ce jest ona nawet prostsza ni\u017c Apache&#8217;a (pomijaj\u0105c paczki).<\/p>\n<p>Opisz\u0119 tutaj najprostsz\u0105, dzia\u0142aj\u0105c\u0105 konfiguracj\u0119. Wi\u0119c&#8230;<\/p>\n<h3>Instalujemy<\/h3>\n<p>Po pierwsze, musimy si\u0119 zaopatrzy\u0107 w <a href=\"http:\/\/nginx.net\">\u017ar\u00f3d\u0142a do skompilowania<\/a>, co raczej problemem nie b\u0119dzie (patrz: drugi link od g\u00f3ry strony projektu). Mo\u017cna jeszcze \u015bci\u0105gn\u0105\u0107 <a href=\"http:\/\/jamiebecker.com\/nginx_0.5.2-1_i386.deb\">binarki dla Debian\u00f3w<\/a> z <a href=\"http:\/\/wiki.codemongers.com\/Nginx\">wiki<\/a>, ale sugerowa\u0142bym r\u0119czne skompilowanie demona. W tej instrukcji skupi\u0119 si\u0119 w\u0142a\u015bnie na samodzielnym budowaniu modu\u0142\u00f3w.<\/p>\n<p>Gdy mamy ju\u017c \u015bci\u0105gni\u0119te pliki \u017ar\u00f3d\u0142owe, musimy je rozpakowa\u0107. <em>tar -xzf nginx-x.x.x.tar.gz<\/em> powinno wystarczy\u0107. ;]<\/p>\n<p>Teraz, musimy si\u0119 zaopatrzy\u0107 w wersj\u0119 developersk\u0105 kilku bibliotek. Mianowicie, PCRE (<em>libpcre3-dev<\/em> &#8211; aby mo\u017cna by\u0142o bawi\u0107 si\u0119 wyra\u017ceniami regularnymi np. w regu\u0142kach ReWrite) i Zlib (kompresja).<\/p>\n<p>Teraz b\u0119dziemy wszystko usadza\u0107. Je\u015bli komu\u015b zale\u017ca\u0142oby na dodatkowych opcjach, to s\u0105 one <a href=\"http:\/\/wiki.codemongers.com\/NginxInstall\">opisane<\/a> w wiki projektu.<\/p>\n<p>Przechodzimy do katalogu ze \u017ar\u00f3d\u0142ami i&#8230;<\/p>\n<p><code>.\/configure && make && make install<\/code><\/p>\n<p>Tyle. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_laugh.png\" alt=\":D\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p>Teraz&#8230;.<\/p>\n<h3>Skonfigurujemy PHP do wsp\u00f3\u0142pracy w trybie FastCGI<\/h3>\n<p>Zak\u0142adam, \u017ce posiadasz poprawnie zainstalowany\/skompilowany interpreter w swoim systemie. Poniewa\u017c nginx nie posiada opcji samodzielnego startowania host\u00f3w dla FastCGI, musimy skorzysta\u0107 z dodatkowego skryptu, kt\u00f3ry to umo\u017cliwi. Gdzie\u015b w Internecie natkn\u0105\u0142em si\u0119 na taki skrypt:<\/p>\n<p><code><br \/>\n#!\/bin\/bash<\/p>\n<p>## ABSOLUTE path to the PHP binary<br \/>\nPHPFCGI=\"\/usr\/local\/bin\/php\"<\/p>\n<p>## tcp-port to bind on<br \/>\nFCGIPORT=\"1234\"<\/p>\n<p>## IP to bind on<br \/>\nFCGIADDR=\"127.0.0.1\"<\/p>\n<p>## number of PHP children to spawn<br \/>\nPHP_FCGI_CHILDREN=5<\/p>\n<p>## number of request before php-process will be restarted<br \/>\nPHP_FCGI_MAX_REQUESTS=1000<\/p>\n<p># allowed environment variables sperated by spaces<br \/>\nALLOWED_ENV=\"ORACLE_HOME PATH USER\"<\/p>\n<p>## if this script is run as root switch to the following user<br \/>\nUSERID=www<\/p>\n<p>################## no config below this line<\/p>\n<p>if test x$PHP_FCGI_CHILDREN = x; then<br \/>\n  PHP_FCGI_CHILDREN=5<br \/>\nfi<\/p>\n<p>ALLOWED_ENV=\"$ALLOWED_ENV PHP_FCGI_CHILDREN\"<br \/>\nALLOWED_ENV=\"$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS\"<br \/>\nALLOWED_ENV=\"$ALLOWED_ENV FCGI_WEB_SERVER_ADDRS\"<\/p>\n<p>if test x$UID = x0; then<br \/>\n  EX=\"\/bin\/su -m -c \\\"$PHPFCGI -q -b $FCGIADDR:$FCGIPORT\\\" $USERID\"<br \/>\nelse<br \/>\n  EX=\"$PHPFCGI -b $FCGIADDR:$FCGIPORT\"<br \/>\nfi<\/p>\n<p>echo $EX<\/p>\n<p># copy the allowed environment variables<br \/>\nE=<\/p>\n<p>for i in $ALLOWED_ENV; do<br \/>\n  E=\"$E $i=${!i}\"<br \/>\ndone<\/p>\n<p># clean environment and set up a new one<br \/>\nnohup env - $E sh -c \"$EX\" &> \/dev\/null &<br \/>\n<\/code><\/p>\n<p>Kluczowe dla nas linie, to:<\/p>\n<ul>\n<li><strong>PHPFCGI=&#8221;\/usr\/local\/bin\/php&#8221;<\/strong>\n<p>Jest to <strong>bezwzgl\u0119dna<\/strong> \u015bcie\u017cka do interpretera.<\/p>\n<\/li>\n<li><strong>FCGIPORT=&#8221;1234&#8243;<\/strong>\n<p>Tutaj definiujemy port, przez kt\u00f3ry serwer b\u0119dzie komunikowa\u0142 si\u0119 z interpreterem. Mo\u017ce to by\u0107 dowolna liczba z zakresu 1024-65535.<br \/>\n\t\t<strong>Uwaga<\/strong>, wa\u017cne jest, aby inna us\u0142uga nie zajmowa\u0142a wybranego portu.<\/p>\n<\/li>\n<li><strong>PHP_FCGI_CHILDREN=5<\/strong>\n<p>Zmienna okre\u015bla, ile interpreter\u00f3w jednocze\u015bnie ma oczekiwa\u0107 na \u017c\u0105dania. Liczb\u0119 ustawiamy w zale\u017cno\u015bci od potrzeb i sprz\u0119tu.<\/p>\n<\/li>\n<li><strong>PHP_FCGI_MAX_REQUESTS=1000<\/strong>\n<p>Liczba \u017c\u0105da\u0144, po kt\u00f3rych proces interpretera zostanie zrestartowany.<\/p>\n<\/li>\n<li><strong>USERID=serwer<\/strong>\n<p>Nazwa konta u\u017cytkownika, z kt\u00f3rego uprawnieniami b\u0119dzie pracowa\u0142 interpreter.<\/p>\n<\/li>\n<\/ul>\n<p>Plik zapisujemy do <em>\/etc\/init.d\/nginx<\/em> i ustawiamy mu prawa do wykonania (<em>chmod ugo+x \/etc\/init.d\/nginx<\/em>).<\/p>\n<p>Nast\u0119pnym krokiem jest&#8230;<\/p>\n<h3>Konfiguracja serwera<\/h3>\n<p>Ka\u017cdy, kto mia\u0142 odrobin\u0119 styczno\u015bci z plikami konfiguracyjnymi w Linuksie sobie poradzi. Je\u015bli nie zmienia\u0142e\u015b(a\u015b) prefiksu przy <em>.\/configure<\/em>, to konfiguracja siedzi w pliku <em>\/usr\/local\/nginx\/conf\/nginx.conf<\/em>. Nie b\u0119d\u0119 opisywa\u0142 wszystkich opcji, bo te s\u0105 om\u00f3wione w wiki, ale om\u00f3wi\u0119 te najwa\u017cniejsze.<\/p>\n<p><code>listen       80;<br \/>\n        server_name  domena.pl;<\/p>\n<p>        location \/ {<br \/>\n            root   \/var\/www\/public_html;<br \/>\n            index  index.html index.htm index.php;<br \/>\n        }<br \/>\n<\/code><\/p>\n<ul>\n<li><strong>listen<\/strong> i <strong>server_name<\/strong>\n<p><em>listen<\/em> okre\u015bla port, na kt\u00f3rym ma nas\u0142uchiwa\u0107 serwer, a <em>server_name<\/em> ustawiamy nazw\u0119 domeny dla naszego serwera. Je\u015bli posiadasz wykupion\u0105 domen\u0119 (nie alias!) to wpisz j\u0105 tutaj, a w rekordach DNS dodaj <em>A<\/em>, kt\u00f3ry wskazuje na adres IP Twojego serwera. Natomiast, gdy serwer stawiasz w celach testowych\/lokalnie, to wpisz tu adres IP.<\/p>\n<\/li>\n<li><strong>location \/<\/strong>\n<p>W tym miejscu okre\u015blamy podstawow\u0105 konfiguracj\u0119 dla strony dost\u0119pnej pod adresem <em>http:\/\/domena.pl\/<\/em>. <em>root<\/em> wskazuje na katalog ze stron\u0105, a <em>index<\/em> &#8211; pliki g\u0142\u00f3wne.<\/p>\n<\/li>\n<\/ul>\n<p><code>location ~ .php$ {<br \/>\n        fastcgi_pass   127.0.0.1:1234;<br \/>\n        fastcgi_index  index.php;<\/p>\n<p>\t    fastcgi_param  SCRIPT_FILENAME  \/var\/www\/public_html$fastcgi_script_name;<br \/>\n\t    fastcgi_param  QUERY_STRING\t$query_string;<br \/>\n\t    fastcgi_param  REQUEST_METHOD $request_method;<br \/>\n\t    fastcgi_param  CONTENT_TYPE $content_type;<br \/>\n\t    fastcgi_param  CONTENT_LENGTH $content_length;<br \/>\n\t    fastcgi_param  REMOTE_ADDR $remote_addr;<br \/>\n\t    fastcgi_param  SERVER_SOFTWARE Klaster v.0.1;<br \/>\n}<\/code><\/p>\n<p><strong>Sk\u0105d tu tyle zmiennych?<\/strong> W\u0142a\u015bciwie, to wystarcz\u0105 trzy pierwsze. Po co dalsze? Ano, po nazwach mo\u017cna si\u0119 \u0142atwo domy\u015ble\u0107:<\/p>\n<ul>\n<li><strong>fastcgi_pass<\/strong>\n<p>Okre\u015bla hosta i port z dzia\u0142aj\u0105cym interpreterem FastCGI.<\/p>\n<\/li>\n<li><strong>fastcgi_index<\/strong>\n<p>Domy\u015blny skrypt do wykonania.<\/p>\n<\/li>\n<\/ul>\n<p>Pora na parametry. S\u0105 one widziane jako warto\u015bci w zmiennej <em>$_SERVER<\/em> w skryptach.<\/p>\n<ul>\n<li><strong>SCRIPT_FILENAME<\/strong>\n<p>\u015acie\u017cka do skryptu. Katalog+zmienna <em>$fastcgi_script_name<\/em> trzymaj\u0105ca nazw\u0119 pliku.<\/p>\n<\/li>\n<li><strong>QUERY_STRING<\/strong>\n<p>Przekazuje do skryptu parametry zapytania do serwera, po znaku zapytania typu: <em>http:\/\/domena.pl\/skrypt?<strong>parametr=wartosc<\/strong><\/em>.<\/p>\n<\/li>\n<li><strong>REQUEST_METHOD<\/strong>\n<p>POST\/GET; wykorzystywane przy przetwarzaniu formularzy.<\/p>\n<\/li>\n<li><strong>CONTENT_TYPE<\/strong> i <strong>CONTENT_LENGTH<\/strong>\n<p>Typ MIME i rozmiar danych.<\/p>\n<\/li>\n<li><strong>REMOTE_ADDR<\/strong>\n<p>Adres IP go\u015bcia.<\/p>\n<\/li>\n<li><strong>SERVER_SOFTWARE<\/strong>\n<p>Ci\u0105g znak\u00f3w, kt\u00f3rym identyfikuje si\u0119 serwer.<\/p>\n<\/li>\n<\/ul>\n<p>Je\u015bli chcemy wystartowa\u0107 na pr\u00f3b\u0119 serwer, to wykonujemy nast\u0119puj\u0105ce polecenia&#8230;<\/p>\n<p><code>\/etc\/init.d\/nginx<br \/>\n\/usr\/local\/nginx\/sbin\/nginx<\/code><\/p>\n<p>&#8230;i wpisujemy adres do przegl\u0105darki. Wszystko powinno dzia\u0142a\u0107; je\u015bli nie &#8211; sprawd\u017a konfiguracj\u0119\/prawa dost\u0119pu dla katalog\u00f3w.<\/p>\n<p>Je\u015bli chcesz zamkn\u0105\u0107 serwer:<\/p>\n<p><code>killall php<br \/>\nkillall nginx<\/code><\/p>\n<h3>Przyklejamy demona<\/h3>\n<p><small>Jest to etap opcjonalny. Je\u015bli lubisz odpalanie z konsoli, to mo\u017cesz go spokojnie pomin\u0105\u0107.<\/small><\/p>\n<p>Nie mog\u0142em si\u0119 nigdzie doszuka\u0107 opcji dotycz\u0105cej zmuszania nginksa do pracy w trybie demona, wi\u0119c b\u0119dzie trzeba zrobi\u0107 to samodzielnie. Nie bez powodu skrypt uruchamiaj\u0105cy PHP w FastCGI umie\u015bci\u0142em w <em>\/etc\/init.d<\/em>. Zanim jednak powiemy Ubuntu, \u017ce ma now\u0105 us\u0142ug\u0119, musimy jeszcze dopisa\u0107 jedn\u0105 lini\u0119 na ko\u0144cu <em>\/etc\/init.d\/nginx<\/em>:<\/p>\n<p><code>\/usr\/local\/nginx\/sbin\/nginx<\/code><\/p>\n<p>Po zapisaniu zostaje nam ju\u017c tylko wydanie komendy:<\/p>\n<p><code>update-rc.d nginx defaults 90 2<\/code><\/p>\n<p>Sk\u0142adnia dla <em>update-rc.d<\/em> jest opisana w manualu.<\/p>\n<p>To tyle. ;] U mnie dzia\u0142a. Mog\u0142em co\u015b przeoczy\u0107, wi\u0119c jak co\u015b &#8211; komentarz albo si\u0119 skontaktuj.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ostatnio musia\u0142em postawi\u0107 serwerek na dosy\u0107 ubogim w pami\u0119\u0107 sprz\u0119cie. No ok \u2013 Ubuntu, MySQL, Apac&#8230; STOP! Po chorob\u0119 mi Apache?! Przecie\u017c 90% jego funkcjonalno\u015bci w przysz\u0142o\u015bci nie b\u0119dzie u\u017cywana. O tym, \u017ce cz\u0119sto dzia\u0142a to \u015blamazarnie \u2013 nie wspomn\u0119. Kt\u00f3rego\u015b razu, Sinx poleci\u0142 mi co\u015b takiego jak nginx. Jest to demon autorstwa rosyjskich programist\u00f3w. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[37],"class_list":["post-113","post","type-post","status-publish","format-standard","hentry","category-tworzenie-www","tag-hosting"],"_links":{"self":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/posts\/113","targetHints":{"allow":["GET"]}}],"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=113"}],"version-history":[{"count":0,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/posts\/113\/revisions"}],"wp:attachment":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/media?parent=113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/categories?post=113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/tags?post=113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}