LNMP – Część 5: phpMyAdmin

Co prawda moje poprzednie wpisy wyczerpały już „skrót” zawarty w tytule, bo pojawił się wpis dotyczący serwera www Nginx, następnie konfiguracji interpretatora PHP, a ostatnio również bazy danych MariaDB. Uznałem jednak, że to nie będzie jeszcze wszystko i jeżeli pojawi się coś ciekawego do opisania, podzielę się tym. Zapraszam również was samych, być może zaproponujecie jakiś pomysł, który będę w stanie zrealizować? Dzisiaj natomiast zapraszam do poradnika opisującego, jak naszą działającą już konfigurację wyposażyć w phpMyAdmina – bardzo wygodne narzędzie stworzone w języku PHP, pozwalające na obsługę bazy danych z poziomu przeglądarki internetowej.

Nieco historii no i dlaczego phpMyAdmin

Jak już napisałem, całe narzędzie, a raczej ich zbiór połączony w jedną całość został napisany narzędzi języku PHP i pozwala na administrację, oraz zarządzanie bazą danych MySQL za pomocą przeglądarki internetowej. Sam projekt w 2000 roku został zawieszony, ale na szczęście dosyć szybko powrócono do prac nad nim. Obecnie można go znaleźć w repozytoriach wielu dystrybucji Linuksa, jest również czymś oczywistym w wypadku hostingu wirtualnego – znajdziemy go praktycznie w każdej firmie która oferuje tego typu pakiety, nie zabraknie go również w konfiguracjach stosowanych w wypadku zarządzanych serwerów VPS i serwerów dedykowanych. Dzięki phpMyAdminowi praca z bazą danych została znacznie ułatwiona, nie wymaga już bowiem pracy w interfejsie tekstowym, a wiele operacji takich jak tworzenie, usuwanie i edycję baz danych, tabel czy użytkowników można wykonać bez znajomości języka SQL.

Aplikacja ta oprócz obsługi bazy pozwala m.in. na eksport danych do plików różnego typu (np. CSV, PDF), tworzenie wykresów na podstawie danych z monitora serwera bazodanowego, czy też globalne wyszukiwanie. Dużym krokiem do przodu jest udostępniona w tym roku wersja 4.0, która zerwała z elementami iframe, a także położyła znacznie większy nacisk na użycie języka JavaScript, oraz technologii Ajax. Warto dodać, że jakiś czas temu phpMyAdmin obchodził swoje 15 urodziny. Zdecydowałem się na użycie właśnie tego rozwiązania z bardzo prostych powodów: używam go bardzo często od dłuższego czasu, jest ono dojrzałe, zapewnia wielkie możliwości, a także bardzo popularne i nieustannie rozwijane. Oczywiście każdy może stwierdzić, że można wybrać lepiej… niech wtedy podzieli się informacjami o tym w swoim wpisie, ja stawiam na phpMyAdmina i go polecam.

Użytkownik, oraz wirtualny host dla nginx

Jako że używamy konfiguracji innej niż Apache czy lighttpd, nie będziemy mogli skorzystać z ekspresowej instalacji z repozytoriów. Zyskamy za to większą kontrolę nad tym co się dzieje. Zanim przejdziemy do instalacji samego skryptu, przygotujemy wszystko zgodnie z informacjami zawartymi w poprzednich odcinkach tej serii. Ze względu na inne ustawienia, postaramy się to nieco „odseparować” od reszty. Celowo słowo-klucz stawiłem w cudzysłów, bo prawdziwym odseparowaniem byłby jail, ale tego tutaj robić nie będziemy. Najpierw po prostu tworzymy nowego użytkownika:

adduser phpmyadmin

Po czym oczywiście wybieramy mu hasło. Jako że nie będzie on potrzebował on żadnej powłoki, wyłączamy ją, tak dla pewności i bezpieczeństwa:

usermod phpmyadmin -s /bin/false

Następnie tworzymy katalogi dla skryptu, oraz w celu przechowywania dodatkowych plików:

mkdir -p /home/phpmyadmin/tmp
mkdir -p /home/phpmyadmin/www
mkdir -p /home/phpmyadmin/auth

Teraz możemy przejść do konfiguracji samego vhosta, dodajemy takowy jako plik /etc/nginx/sites-available/phpmyadmin, o następującej treści:

server 
{
    server_name pma.naszadomena.pl;
    listen 80;  

    access_log /var/log/nginx/phpmyadmin.access_log;
    error_log /var/log/nginx/phpmyadmin.error_log;
    root /home/phpmyadmin/www;

    # Ustawienia specyficzne dla phpmyadmin
    fastcgi_connect_timeout 900;
    fastcgi_read_timeout 900;
    fastcgi_send_timeout 900;
    client_body_timeout 900;
    client_header_timeout 900;
    send_timeout 900;
    client_max_body_size 128M;

    location ^~ / 
    {
        auth_basic            "Dostep zabroniony";
        auth_basic_user_file  /home/phpmyadmin/auth/.htpasswd;

        location ~ \.php$ 
        {
            try_files $uri =404;
            include fastcgi_params;
            fastcgi_pass unix:/tmp/php-fpm_phpmyadmin.sock; 
        }
    }
}

Oczywiście nic nie stoi na przeszkodzie, aby zgodnie z tym co pisałem w poprzednim odcinku wydzielić fragment związany z obsługą PHP do oddzielnego pliku i po prostu go załączyć. Równie dobrze możemy także dodać zapisy ustawiające nagłówki expires czy blokujące dostęp do plików ukrytych, o których była mowa w części poświęconej serwerowi www.Nie ma tutaj wielkiej filozofii, ale pojawiły się dwie nowe rzeczy. Pierwsza to specyficzne ustawienia dla nginxa i obsługi fastcgi w celu odpowiedniej obsługi długich żądań. Te mogą wystąpić podczas eksportu/importu bazy, lub też przy wykonywaniu dłuższych operacji. Czas zwiększyłem do 900 sekund, czyli 15 minut. Jeżeli uważacie, że może to być za mało np. na wysłanie bazy (choć przy dostępie do ssh lepiej jest ją załadować z tego właśnie poziomu) to limity zwiększamy. Kolejna opcja to client_max_body_size, a więc maksymalny dopuszczalny rozmiar żądania. Jako że mogą się tam pojawić pliki baz, ustawiłem aż 128 MB. Wybieramy wedle naszych potrzeb.

Druga zmiana to dodana autoryzacja HTTP. Nie mamy zamiaru dawać dostępu do phpMyAdmina nikomu, kto nie tylko nie poda danych do bazy, ale również loginu i hasła zapisanego w specjalnym pliku. Aby dane te zapisać, możemy skorzystać z generatorów dostępnych online, lub też użyć odpowiedniego narzędzia. Najpierw je instalujemy:

aptitude install apache2-utils

Teraz możemy już stworzyć odpowiedni plik:

htpasswd –c /home/phpmyadmin/auth/.htpasswd super_tajny_uzytkownik

Zostaniemy zapytani o hasło, a następnie będziemy musieli je potwierdzić. Nic nie stoi na przeszkodzie, aby stworzyć więcej niż jednego użytkownika (podczas jego dodawania nie używamy już parametru „-c” z podanego wyżej polecenia). Jeżeli nagle zechcemy pozbawić kogoś dostępu, nie będziemy musieli zmieniać swojego hasła, a jedynie usunąć wpis odpowiedzialny za niego. Podstawę od strony nginxa mamy załatwioną, póki co nie uruchamiamy jeszcze vhosta i nie restartujemy usługi, najpierw trzeba bowiem zająć się PHP.

Daemon PHP

Kolejna rzecz to ustawienia procesu PHP dla tego użytkownika, tworzymy go jako plik /etc/php5/fpm/pool.d/phpmyadmin.conf, poniżej przedstawiam konfigurację nie zawierającą oryginalnych komentarzy, a tylko moje zapisy:

# Nazwa ustawienia
[phpmyadmin]

# Nasluchiwanie na sockecie
listen = /tmp/php-fpm_$pool.sock 
listen.owner = $pool 
listen.group = $pool 
listen.mode = 0666 

# Ustawienia uzytkownika
user = $pool
group = $pool

# Ustawienia ilosci serwerow
pm = dynamic 
pm.max_children = 2
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 50 

# Ustawienia dla "izolacji"
php_admin_value[open_basedir] = /home/phpmyadmin/:/tmp/
php_admin_value[upload_tmp_dir] = /home/phpmyadmin/tmp
php_admin_value[session.save_path] = /home/phpmyadmin/tmp

# Ustawienia specyficzne dla phpMyAdmina
request_terminate_timeout = 900
php_admin_value[max_execution_time] = 900
php_admin_value[max_input_time] = 900
php_admin_value[memory_limit] = 512M
php_admin_value[upload_max_filesize] = 128M
php_admin_value[post_max_size] = 128M
php_admin_value[display_errors] = On
php_admin_value[error_log] = /home/phpmyadmin/php_error_log

Jak widać, również i tutaj nieco się zmieniło względem konfiguracji z poprzedniego odcinka. Początek, oraz ustawienia ilości procesów powinny być jasne, przejdźmy więc dalej. Tam znajdziemy konkretne ustawienia PHP – pierwsza trzy linijki pozwalają na częściową separację od innych danych za sprawą ustawienia open_basedir. Nie jest to idealne rozwiązanie, o czym już wspominałem, ale w tym wypadku nam wystarczy.

Dalsza część to zwiększenie limitów opisywanych w odcinku poświęconym PHP. Zakładamy bowiem, że zarówno wysyłane pliki mogą być spore (do 128 MB), a i przez to również czas ich przesyłania może się znacznie wydłużyć (900 sekund). W tym miejscu możemy sobie również pozwolić na wyświetlanie ewentualnych błędów. Skoro ustawienia dla interpretatora są gotowe, możemy w końcu zająć się samym phpMyAdminem.

Instalujemy phpMyAdmina

Samo zainstalowanie skryptu i jego podstawowe ustawienie to rzecz banalna, wystarczy bowiem pobrać odpowiednią paczkę, rozpakować, a także dokonać zmiany w jednym pliku. Zabieramy się więc do tego, najpierw przechodząc oczywiście do odpowiedniego katalogu.

# Zmiana katalogu 
cd /home/phpmyadmin/www

# Pobieramy najnowsze wydanie
wget http://sourceforge.net/projects/phpmyadmin/files/latest/download

# Rozpakowanie
unzip download

# Przenosimy, sprzatamy, zmieniamy nazwe
mv php*/* .
rm –rf phpMy*
mv config.sample.inc.php config.inc.php

Możecie się już domyślać, który plik będziemy edytować, oczywiście config.inc.php. Edytujemy go i odnajdujemy na początku pliku linijkę, która wygląda mniej więcej tak:

$cfg['blowfish_secret'] = 'a8b7c6d';

Następnie zgodnie z zaleceniami zamiast standardowej frazy, wpisujemy tam losowy ciąg znaków. Możemy do tego również wykorzystać generatory blowfish dostępne online. Po tym zabiegu phpMyAdmin będzie gotowy do pracy. Jeżeli zajrzymy w dokumentację, dowiemy się, że możliwa jest również jego nieco bardziej rozbudowana instalacja lub konfiguracja. Służą do tego katalogi examples oraz setup i znajdujące się w nich skrypty. Nie będę tu opisywał całego zadania, bo phpMyAdmin już działa i spełnia swoje zadanie, wspomnę tylko o tym, że będziemy musieli stworzyć dedykowaną bazę i użytkownika, a następnie umieścić odpowiednie zapisy w pliku który przed chwilą edytowaliśmy. Co nam da takie skonfigurowanie narzędzia? Przede wszystkim większą kontrolę, bo kreator oraz zapisy w pliku pozwalają ustawić wiele elementów (np. wyłączyć logowanie dla konta root), oraz zapamiętywanie spersonalizowanych ustawień konkretnych użytkowników.

Skoro wszystko jest już gotowe, możemy przypisać wszystkie pliki dla tego użytkownika, a następnie uruchomić vhosta i zrestartować usługi. Oczywiście nie zapominamy o wykonaniu testu dla nginxa, jeżeli coś będzie nie tak, zostaniemy o tym poinformowani i będziemy mogli dokonać korekty bez unieruchamiania innych witryn:

# Zmieniamy wlasciciela plikow
chown -R phpmyadmin:phpmyadmin /home/phpmyadmin

# Restart php
service php5-fpm restart

# Uruchomienie vhosta nginx
ngxensite phpmyadmin

# Test nginx - jezeli natrafimy na error, przerywamy i korygujemy ustawienia
nginx –t

# Restart uslugi nginx
service nginx restart

Podsumowanie

To już w zasadzie wszystko. Jeżeli macie jakieś pytania, chętnie na nie odpowiem. Jak już wspominałem, jeżeli uważacie, że zamiast phpMyAdmina lepiej byłoby wykorzystać jakieś inne rozwiązanie, to czekam na wasze wpisy je opisujące. Mam nadzieję, że kolejna część tego cyklu pozwoli wam jeszcze lepiej przygotować własne środowisko. Czy będą na następne? Jeszcze jedna na pewno tak, ale to, czego będzie ona dotyczyć póki co zostawmy jako niespodziankę.