eRIZ's weblog

PHP, webdesign, Linux, Windows i inne, bo nie samym chlebem człowiek żyje

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. :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:


#!/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.

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=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

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.

Warning: Undefined variable $user_ID in /usr/home/er1zpl/domains/eriz.pcinside.pl/public_html/weblog/wp-content/themes/inBlueDiary/comments.php on line 112

Szufladka