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.
Dzięki, fajny artykuł. Prawie wszystko zadziałało za 1. razem.
Jeszcze tu jest opisane jak skonfigurowac prosty rewrite na czyms takim.