eRIZ’s weblog

PHP, webdesign, Linux, Windows i inne, bo nie samym chlebem człowiek żyje
Serdecznie zapraszam do udziału w ANKIECIE

Alternatywa dla Apache’a - nginx + PHP @ FastCGI w Ubuntu

Ostatnio musiałem postawić serwerek na dosyć ubogim w pamięć sprzęcie. No ok – Ubuntu, MySQL, Apac… STOP! Po chorobę mi Apache?! Przecież 90% jego funkcjonalności w przyszłości nie będzie używana. O tym, że często działa to ślamazarnie – nie wspomnę.

Któregoś razu, Sinx polecił mi coś takiego jak nginx.

Jest to demon autorstwa rosyjskich programistów. Już sama ta informacja mnie zaciekawiła. Dlaczego? W końcu Rosjanie piszą najwydajniejsze aplikacje (przynajmniej, w moim mniemaniu). Strona nie prezentuje się może bardzo efektywnie, ale “nie szata zdobi człowieka”. Nie miałem nic do stracenia, przeciwnie – mogłem wyłącznie zyskać.

Na dodatek, gdzieś przeczytałem, że nginx obsługuje najbardziej obciążone serwisy w Rosji. ;]

Zabrałem się do instalacji. Muszę przyznać, że jest ona nawet prostsza niż Apache’a (pomijając paczki).

Opiszę tutaj najprostszą, działającą konfigurację. Więc…

Instalujemy

Po pierwsze, musimy się zaopatrzyć w źródła do skompilowania, co raczej problemem nie będzie (patrz: drugi link od góry strony projektu). Można jeszcze ściągnąć binarki dla Debianów z wiki, ale sugerowałbym ręczne skompilowanie demona. W tej instrukcji skupię się właśnie na samodzielnym budowaniu modułów.

Gdy mamy już ściągnięte pliki źródłowe, musimy je rozpakować. tar -xzf nginx-x.x.x.tar.gz powinno wystarczyć. ;]

Teraz, musimy się zaopatrzyć w wersję developerską kilku bibliotek. Mianowicie, PCRE (libpcre3-dev - aby można było bawić się wyrażeniami regularnymi np. w regułkach ReWrite) i Zlib (kompresja).

Teraz będziemy wszystko usadzać. Jeśli komuś zależałoby na dodatkowych opcjach, to są one opisane w wiki projektu.

Przechodzimy do katalogu ze źródłami i…

  1. ./configure && make && make install

Tyle. :D

Teraz….

Skonfigurujemy PHP do współpracy w trybie FastCGI

Zakładam, że posiadasz poprawnie zainstalowany/skompilowany interpreter w swoim systemie. Ponieważ nginx nie posiada opcji samodzielnego startowania hostów dla FastCGI, musimy skorzystać z dodatkowego skryptu, który to umożliwi. Gdzieś w Internecie natknąłem się na taki skrypt:

  1. #!/bin/bash
  2.  
  3. ## ABSOLUTE path to the PHP binary
  4. PHPFCGI="/usr/local/bin/php"
  5.  
  6. ## tcp-port to bind on
  7. FCGIPORT="1234"
  8.  
  9. ## IP to bind on
  10. FCGIADDR="127.0.0.1"
  11.  
  12. ## number of PHP children to spawn
  13. PHP_FCGI_CHILDREN=5
  14.  
  15. ## number of request before php-process will be restarted
  16. PHP_FCGI_MAX_REQUESTS=1000
  17.  
  18. # allowed environment variables sperated by spaces
  19. ALLOWED_ENV="ORACLE_HOME PATH USER"
  20.  
  21. ## if this script is run as root switch to the following user
  22. USERID=www
  23.  
  24. ################## no config below this line
  25.  
  26. if test x$PHP_FCGI_CHILDREN = x; then
  27.   PHP_FCGI_CHILDREN=5
  28. fi
  29.  
  30. ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_CHILDREN"
  31. ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS"
  32. ALLOWED_ENV="$ALLOWED_ENV FCGI_WEB_SERVER_ADDRS"
  33.  
  34. if test x$UID = x0; then
  35.   EX="/bin/su -m -c \"$PHPFCGI -q -b $FCGIADDR:$FCGIPORT\" $USERID"
  36. else
  37.   EX="$PHPFCGI -b $FCGIADDR:$FCGIPORT"
  38. fi
  39.  
  40. echo $EX
  41.  
  42. # copy the allowed environment variables
  43. E=
  44.  
  45. for i in $ALLOWED_ENV; do
  46.   E="$E $i=${!i}"
  47. done
  48.  
  49. # clean environment and set up a new one
  50. nohup env - $E sh -c "$EX" &> /dev/null &

Kluczowe dla nas linie, to:

  • PHPFCGI=”/usr/local/bin/php”

    Jest to bezwzględna ścieżka do interpretera.

  • FCGIPORT=”1234″

    Tutaj definiujemy port, przez który serwer będzie komunikował się z interpreterem. Może to być dowolna liczba z zakresu 1024-65535.
    Uwaga, ważne jest, aby inna usługa nie zajmowała wybranego portu.

  • PHP_FCGI_CHILDREN=5

    Zmienna określa, ile interpreterów jednocześnie ma oczekiwać na żądania. Liczbę ustawiamy w zależności od potrzeb i sprzętu.

  • PHP_FCGI_MAX_REQUESTS=1000

    Liczba żądań, po których proces interpretera zostanie zrestartowany.

  • USERID=serwer

    Nazwa konta użytkownika, z którego uprawnieniami będzie pracował interpreter.

Plik zapisujemy do /etc/init.d/nginx i ustawiamy mu prawa do wykonania (chmod ugo+x /etc/init.d/nginx).

Następnym krokiem jest…

Konfiguracja serwera

Każdy, kto miał odrobinę styczności z plikami konfiguracyjnymi w Linuksie sobie poradzi. Jeśli nie zmieniałeś(aś) prefiksu przy ./configure, to konfiguracja siedzi w pliku /usr/local/nginx/conf/nginx.conf. Nie będę opisywał wszystkich opcji, bo te są omówione w wiki, ale omówię te najważniejsze.

  1. listen       80;
  2.         server_name  domena.pl;
  3.  
  4.         location / {
  5.             root   /var/www/public_html;
  6.             index  index.html index.htm index.php;
  7.         }

  • listen i server_name

    listen określa port, na którym ma nasłuchiwać serwer, a server_name ustawiamy nazwę domeny dla naszego serwera. Jeśli posiadasz wykupioną domenę (nie alias!) to wpisz ją tutaj, a w rekordach DNS dodaj A, który wskazuje na adres IP Twojego serwera. Natomiast, gdy serwer stawiasz w celach testowych/lokalnie, to wpisz tu adres IP.

  • location /

    W tym miejscu określamy podstawową konfigurację dla strony dostępnej pod adresem http://domena.pl/. root wskazuje na katalog ze stroną, a index - pliki główne.

  1. location ~ .php$ {
  2.         fastcgi_pass   127.0.0.1:1234;
  3.         fastcgi_index  index.php;
  4.            
  5.             fastcgi_param  SCRIPT_FILENAME  /var/www/public_html$fastcgi_script_name;
  6.             fastcgi_param  QUERY_STRING $query_string;
  7.             fastcgi_param  REQUEST_METHOD $request_method;     
  8.             fastcgi_param  CONTENT_TYPE $content_type;
  9.             fastcgi_param  CONTENT_LENGTH $content_length;
  10.             fastcgi_param  REMOTE_ADDR $remote_addr;
  11.             fastcgi_param  SERVER_SOFTWARE Klaster v.0.1;
  12. }

Skąd tu tyle zmiennych? Właściwie, to wystarczą trzy pierwsze. Po co dalsze? Ano, po nazwach można się łatwo domyśleć:

  • fastcgi_pass

    Określa hosta i port z działającym interpreterem FastCGI.

  • fastcgi_index

    Domyślny skrypt do wykonania.

Pora na parametry. Są one widziane jako wartości w zmiennej $_SERVER w skryptach.

  • SCRIPT_FILENAME

    Ścieżka do skryptu. Katalog+zmienna $fastcgi_script_name trzymająca nazwę pliku.

  • QUERY_STRING

    Przekazuje do skryptu parametry zapytania do serwera, po znaku zapytania typu: http://domena.pl/skrypt?parametr=wartosc.

  • REQUEST_METHOD

    POST/GET; wykorzystywane przy przetwarzaniu formularzy.

  • CONTENT_TYPE i CONTENT_LENGTH

    Typ MIME i rozmiar danych.

  • REMOTE_ADDR

    Adres IP gościa.

  • SERVER_SOFTWARE

    Ciąg znaków, którym identyfikuje się serwer.

Jeśli chcemy wystartować na próbę serwer, to wykonujemy następujące polecenia…

  1. /etc/init.d/nginx
  2. /usr/local/nginx/sbin/nginx

…i wpisujemy adres do przeglądarki. Wszystko powinno działać; jeśli nie - sprawdź konfigurację/prawa dostępu dla katalogów.

Jeśli chcesz zamknąć serwer:

  1. killall php
  2. killall nginx

Przyklejamy demona

Jest to etap opcjonalny. Jeśli lubisz odpalanie z konsoli, to możesz go spokojnie pominąć.

Nie mogłem się nigdzie doszukać opcji dotyczącej zmuszania nginksa do pracy w trybie demona, więc będzie trzeba zrobić to samodzielnie. Nie bez powodu skrypt uruchamiający PHP w FastCGI umieściłem w /etc/init.d. Zanim jednak powiemy Ubuntu, że ma nową usługę, musimy jeszcze dopisać jedną linię na końcu /etc/init.d/nginx:

  1. /usr/local/nginx/sbin/nginx

Po zapisaniu zostaje nam już tylko wydanie komendy:

  1. update-rc.d nginx defaults 90 2

Składnia dla update-rc.d jest opisana w manualu.

To tyle. ;] U mnie działa. Mogłem coś przeoczyć, więc jak coś - komentarz albo się skontaktuj.

6 komentarzy

dopisz swój :: trackback :: RSS z komentarzami

RSS z komentarzami :: trackback

Skomentuj

Możesz używać znaczników XHTML. Dozwolone są następujące tagi: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

Wszystkie komentarze przechodzą przez moderację oraz filtry antyspamowe. Nie zostanie opublikowany komentarz, jeśli:

  • Jego treść obraża kogokolwiek.
  • W treści znajdują się wulgaryzmy i słownictwo ogólnie uznane za nieprzyzwoite.
  • Mam wątpliwości co do autora wpisu (Wszelkie anonimy są kasowane - niezależnie od zawartości - wpisz prawdziwy e-mail. Jeśli usunąłem, Twoim zdaniem, komentarz niesłusznie - daj znać). Zdarza się, iż sprawdzam kim jest komentujący.
  • Zawiera jakąkolwiek formę reklamy.

Szufladka