[Debian] LEMP – Instalacja Nginx, PHP, MySQL i phpMyAdmin oraz konfiguracja hostów wirtualnych

W tych wpisach:

opisałem, w jaki sposób zainstalować serwer WWW Apache, wraz z obsługą języka PHP, serwer baz danych MySQL oraz panel phpMyAdmin, służący do administracji bazami danych. Taki zestaw serwerów nazywa się LAMP – Linux, Apache, MySQL i PHP. W tym wpisie chciałbym przedstawić coś podobnego, a mianowicie LEMP. LEMP, czyli Linux, Nginx, MySQL, PHP, to bardzo podobny zestaw serwerów, z tą różnicą, że zamiast Apache, występuje tutaj nginx. E w nazwie oznacza Engine X, bo właśnie tak, po angielsku czyta się nazwę serwera Nginx.

Nginx jest alternatywą dla najpopularniejszego obecnie serwera – Apache. W przypadku serwowania treści statycznych, czyli plików HTML, obrazków itp. jest on szybszy i wydajniejszy. Nginx jest bardzo często wykorzystywany jako server-side proxy, do udostępniania klientom treści statycznych i przekierowywania ruchu dotyczącego treści dynamicznych, takich jak strony PHP do serwera Apache, nasłuchującego na innym porcie. Konfiguracja z tego wpisu przewiduje wykorzystanie w charakterze serwera WWW jedynie Nginx, bez Apache. Nginx, nie posiada wbudowanej, w postaci modułu (jak Apache), obsługi języka PHP, dlatego wykorzystamy FastCGI.

Instalacja i konfiguracja serwerów

1. Logujemy się na serwer przez SSH, na konto użytkownika root.

2. Odświeżamy pamięć cache repozytoriów managera pakietów APT i usuwamy domyślnie zainstalowany na VPS-ie w Nazwa.pl serwer HTTP – Apache, wraz ze wszystkimi składnikami. Następnie, instalujemy serwer HTTP – Nginx, parser języka PHP5, FastCGI, serwer MySQL oraz panel phpMyAdmin.

apt-get update
apt-get remove apache2*
apt-get install nginx php5-cli php5-cgi spawn-fcgi mysql-server phpmyadmin

3. Podczas instalacji pakietów, instalator poprosi o kilka informacji:

  • hasło użytkownika root, serwera baz danych MySQL – hasło to powinno być inne niż hasło systemowego root-a.
  • powtórzenie ww. hasła
  • wybranie serwera HTTP do przekonfigurowania dla phpMyAdmin – nie wybieramy żadnego – klikamy tabulator, a następnie enter
  • decydujemy, czy chcemy, aby instalator stworzył za nas bazę danych dla phpMyAdmin (jest ona konieczna do jego poprawnego funkcjonowania)
  • ponownie podajemy hasło root-a MySQL
  • wybieramy nowe hasło dla bazy danych phpMyAdmin
  • powtarzamy ww. hasło

4. Jeśli nie mamy zainstalowanego na serwerze edytora nano, to instalujemy go poleceniem:

apt-get install nano

5. Tworzymy i edytujemy plik /usr/bin/php-fastcgi. Będzie on służył do uruchamiania „lokalnego” serwera FastCGI.

a) Uruchamiamy edytor nano

nano /usr/bin/php-fastcgi

b) Zaznaczamy poniższy tekst i kopiujemy go do schowka klikając kombinację klawiszy Ctrl+C.

#!/bin/bash

FASTCGI_USER=www-data
FASTCGI_GROUP=www-data
ADDRESS=127.0.0.1
PORT=9000
PIDFILE=/var/run/php-fastcgi/php-fastcgi.pid
CHILDREN=6
PHP5=/usr/bin/php5-cgi

/usr/bin/spawn-fcgi -a $ADDRESS -p $PORT -P $PIDFILE -C $CHILDREN -u $FASTCGI_USER -g $FASTCGI_GROUP -f $PHP5

c) Przechodzimy do okienka PuTTY i klikamy prawym przyciskiem myszy na jego środek. Spowoduje to wklejenie tekstu ze schowka.

6. Nadajemy nowo-utworzonemu plikowi atrybut wykonywalny. Umożliwi to uruchomienie go jako programu. Fragment „#!/bin/bash„, oznacza że zawartość skryptu będzie podczas wykonywania przesyłana na wejście do programu /bin/bash, a wynikiem działania skryptu, będzie wyjście tego programu.

chmod +x /usr/bin/php-fastcgi

7. Podobnie jak poprzednio, tworzymy i edytujemy kolejny plik. Tym razem będzie to skrypt startowy uruchamiający, restartujący i zamykający proces FastCGI podczas uruchamiania i zamykania systemu na VPS.

nano /etc/init.d/php-fastcgi
#!/bin/bash

PHP_SCRIPT=/usr/bin/php-fastcgi
FASTCGI_USER=www-data
FASTCGI_GROUP=www-data
PID_DIR=/var/run/php-fastcgi
PID_FILE=/var/run/php-fastcgi/php-fastcgi.pid
RET_VAL=0

case "$1" in
    start)
      if [[ ! -d $PID_DIR ]]
      then
        mkdir $PID_DIR
        chown $FASTCGI_USER:$FASTCGI_GROUP $PID_DIR
        chmod 0770 $PID_DIR
      fi
      if [[ -r $PID_FILE ]]
      then
        echo "php-fastcgi already running with PID `cat $PID_FILE`"
        RET_VAL=1
      else
        $PHP_SCRIPT
        RET_VAL=$?
      fi
  ;;
    stop)
      if [[ -r $PID_FILE ]]
      then
        kill `cat $PID_FILE`
        rm $PID_FILE
        RET_VAL=$?
      else
        echo "Could not find PID file $PID_FILE"
        RET_VAL=1
      fi
  ;;
    restart)
      if [[ -r $PID_FILE ]]
      then
        kill `cat $PID_FILE`
        rm $PID_FILE
        RET_VAL=$?
      else
        echo "Could not find PID file $PID_FILE"
      fi
      $PHP_SCRIPT
      RET_VAL=$?
  ;;
    status)
      if [[ -r $PID_FILE ]]
      then
        echo "php-fastcgi running with PID `cat $PID_FILE`"
        RET_VAL=$?
      else
        echo "Could not find PID file $PID_FILE, php-fastcgi does not appear to be running"
      fi
  ;;
    *)
      echo "Usage: php-fastcgi {start|stop|restart|status}"
      RET_VAL=1
  ;;
esac
exit $RET_VAL

8. Nadajemy mu atrybut umożliwiający uruchamianie i inicjujemy go jako systemowy skrypt startowy.

chmod +x /etc/init.d/php-fastcgi
update-rc.d php-fastcgi defaults

9. Edytujemy plik konfiguracyjny domyślnego vhosta. Więcej na temat vhostów opisałem w tym wpisie.

nano /etc/nginx/sites-available/default

a) Odnajdujemy poniższy fragment:

    location / {
        root    /var/www;
        index   index.html index.htm;
    }

i zamieniamy na:

    location / {
        root /var/www;
        index index.php index.html index.htm;
    }

Spowoduje to, przetwarzanie jako strony startowe, plików index.php, index.html oraz index.html, zamiast tylko index.html i index.htm.

b) Odnajdujemy:

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
        #fastcgi_pass	127.0.0.1:9000;
        #fastcgi_index  index.php;
        #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #includefastcgi_params;
    #}

i zamieniamy na:

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
    }

Wymusi to przekazywanie wszystkich żądań dotyczących plików PHP, najpierw do serwera FastCGI, a dopiero później, wysyłanie wyniku działania parsera PHP (czyli strony w HTML) do użytkownika.

10. Usuwamy domyślną stronę WWW, jeśli pozostała po Apache i tworzymy własną, wyświetlającą informacje nt. konfiguracji Apache (phpinfo).

rm /var/www/index.html
echo "" > /var/www/index.php

11. Tworzymy dowiązanie symboliczne dla phpMyAdmin, tak żeby był on dostępny jako podstrona domyślnego vhosta, pod adresem http://{ADRES_IP_SERWERA}/phpmyadmin.

ln -s /usr/share/phpmyadmin /var/www/phpmyadmin

12. Uruchamiamy usługi – FastCGI i Nginx.

/etc/init.d/php-fastcgi start
/etc/init.d/nginx start

Domyślna strona WWW, z katalogu /var/www, powinna być od teraz dostępna pod wszystkimi adresami IP, oraz wszystkimi domenami, które rekordem A wskazują na nasz serwer. Więcej na temat konfiguracji DNS w tym wpisie. phpMyAdmin powinien być dostępny, również pod wszystkimi adresami IP oraz domenami, w podkatalogu phpmyadmin, np. http://e00.eu/phpmyadmin.

Hosty wirtualne aka vhosty

Dzięki hostom wirtualnym możliwy jest hosting wielu stron WWW pod różnymi adresami (domenami DNS) na jednym serwerze z jednym adresem IP. Np. e00.eu, vps-admin.eu, olo-web.eu itp. Każda z domen musi być oczywiście odpowiednio skonfigurowana, tak aby wskazywała rekordem A na adres IP naszego serwera. Więcej nt. działania systemu DNS, opisałem tutaj, a na temat samych vhostów, tutaj, przy okazji ich konfiguracji w serwerze WWW Apache.

1. Tworzymy nowego użytkownika i ustawiamy mu hasło. Oczywiście, zamiast vps-admin.eu podajemy nazwę swojej domeny.

useradd -m vps-admin.eu
passwd vps-admin.eu

2. Tworzymy podfoldery w katalogu nowego użytkownika. W htdocs będą znajdowały się pliki strony WWW, a w logs, logi (access i error log).

mkdir /home/vps-admin.eu/htdocs
mkdir /home/vps-admin.eu/logs

3. Zmieniamy właściciela utworzonych w poprzednim punkcie folderów na nowego użytkownika.

chown vps-admin.eu:vps-admin.eu /home/vps-admin.eu/htdocs
chown vps-admin.eu:vps-admin.eu /home/vps-admin.eu/logs

4. Piszemy prosty plik index.html i zmieniamy jego właściciela na nowego użytkownika.

echo "test vhosta vps-admin.eu" > /home/vps-admin.eu/htdocs/index.html
chown vps-admin.eu:vps-admin.eu /home/vps-admin.eu/htdocs/index.html

5. Tworzymy plik konfiguracyjny nowego vhosta, otwierając go w edytorze, kopiując poniższy fragment tekstu i zapisując plik.

nano /etc/nginx/sites-available/vps-admin.eu
server {
    server_name vps-admin.eu www.vps-admin.eu;
    access_log /home/vps-admin.eu/logs/access.log;
    error_log /home/vps-admin.eu/logs/error.log;
    root /home/vps-admin.eu/htdocs;

    location / {
        index index.php index.html index.htm;
    }

    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /home/vps-admin.eu/htdocs$fastcgi_script_name;
    }
}

6. Zmieniamy nazwę pliku konfiguracyjnego domyślnego vhosta z default na 001-default, tak aby był zawsze przetwarzany jako pierwszy. Tą czynność wykonujemy tylko raz.

mv /etc/nginx/sites-enabled/default /etc/nginx/sites-enabled/000-default

7. „Włączamy” plik konfiguracyjny vhosta. Podczas dodawania kolejnych vhostów, zamiast 001, podajemy kolejne numery.

ln -s /etc/nginx/sites-available/vps-admin.eu /etc/nginx/sites-enabled/001-vps-admin.eu

8. Restartujemy serwer Nginx.

/etc/init.d/nginx restart

Autor: Aleksander Kurczyk
Skrypty, uruchamiający i startowy, zostały skopiowane ze strony http://library.linode.com/web-servers/nginx/php-fastcgi/debian-6-squeeze.