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…
- ./configure && make && make install
Tyle.
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:
- #!/bin/bash
- ## ABSOLUTE path to the PHP binary
- PHPFCGI="/usr/local/bin/php"
- ## tcp-port to bind on
- FCGIPORT="1234"
- ## IP to bind on
- FCGIADDR="127.0.0.1"
- ## number of PHP children to spawn
- PHP_FCGI_CHILDREN=5
- ## number of request before php-process will be restarted
- PHP_FCGI_MAX_REQUESTS=1000
- # allowed environment variables sperated by spaces
- ALLOWED_ENV="ORACLE_HOME PATH USER"
- ## if this script is run as root switch to the following user
- USERID=www
- ################## no config below this line
- if test x$PHP_FCGI_CHILDREN = x; then
- PHP_FCGI_CHILDREN=5
- fi
- ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_CHILDREN"
- ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS"
- ALLOWED_ENV="$ALLOWED_ENV FCGI_WEB_SERVER_ADDRS"
- if test x$UID = x0; then
- EX="/bin/su -m -c \"$PHPFCGI -q -b $FCGIADDR:$FCGIPORT\" $USERID"
- else
- EX="$PHPFCGI -b $FCGIADDR:$FCGIPORT"
- fi
- echo $EX
- # copy the allowed environment variables
- E=
- for i in $ALLOWED_ENV; do
- E="$E $i=${!i}"
- done
- # clean environment and set up a new one
- 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.
- listen 80;
- server_name domena.pl;
- location / {
- root /var/www/public_html;
- index index.html index.htm index.php;
- }
- 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.
- location ~ .php$ {
- fastcgi_pass 127.0.0.1:1234;
- fastcgi_index index.php;
- fastcgi_param SCRIPT_FILENAME /var/www/public_html$fastcgi_script_name;
- 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 REMOTE_ADDR $remote_addr;
- fastcgi_param SERVER_SOFTWARE Klaster v.0.1;
- }
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…
- /etc/init.d/nginx
- /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:
- killall php
- 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:
- /usr/local/nginx/sbin/nginx
Po zapisaniu zostaje nam już tylko wydanie komendy:
- 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.
RSS


Dzięki, fajny artykuł. Prawie wszystko zadziałało za 1. razem.
Jeszcze tu jest opisane jak skonfigurowac prosty rewrite na czyms takim.