Raspberry Pi można relatywnie łatwo zmienić w ekonomiczny (cena Pi, jak i koszt związany z poborem energii) serwer WWW.

Wprawdzie raczej nie sprawdzi się do trzymania tam strony generującej „większy ruch” (w takim przypadku polecam skorzystać z „normalnego” hostingu albo serwera VPS), ale na potrzeby różnych „naszych” projektów, czy do testów będzie jak najbardziej OK.

Apache2 + PHP-MOD

W tym celu skorzystam z:

Opisana metoda/procedura zadziała nie tylko na Raspberry Pi, ale także na innych komputerach/urządzeniach (serwer, VPS) działających pod kontrolą systemu Debian/Ubuntu, a po lekkiej modyfikacji i na innych dystrybucjach.

Wprawdzie są inne możliwości niż Apache2, ale z różnych przyczyn polecam zacząć jednak od Apache2… Przemawia ku temu prosta i szybka instalacja i konfiguracja, a i ewentualne różnice w wydajności jeśli są – nie przy każdym projekcie (stronie) są na tyle odczuwalne by sobie komplikować niepotrzebnie sprawę…

Alternatywne konfiguracje:

Nawet gdy wybierzecie/zdecydujecie się na którąś z alternatywnych konfiguracji to i tak większa część tego poradnika Was dotyczy, choć warto zajrzeć najpierw do opisu „alternatywy”, by wiedzieć które elementy należy wykonać inaczej, a które ew. pominąć…

Instalacja

Zaczniemy od zainstalowania podstawowych składników:

sudo apt-get install apache2 php5 libapache2-mod-php5 php5-curl php5-mcrypt php5-gd -y

 

raspberry-pi_www_01

raspberry-pi_www_02

Wszystko poszło OK…

Konfiguracja

Gdy instalacja przebiegnie pomyślnie musimy jeszcze tylko dokonać małej modyfikacji „domyślnej” konfiguracji.

W tym celu wpisujemy polecenie:

sudo nano /etc/apache2/sites-enabled/000-default

W przypadku – chyba – Apache2.4 może to być:

sudo nano /etc/apache2/sites-enabled/000-default.conf

Szukamy:

Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all

By zmienić na:

Options Indexes FollowSymLinks MultiViews
AllowOverride ALL
Order allow,deny
allow from all

 

raspberry-pi_www_03

 

Wychodzimy zapisując: CTRL+Q i Y.

Restartujemy serwer/Apache:

sudo service apache2 restart

 

raspberry-pi_www_04

WWW

Po tej operacji właściwie już możemy sprawdzić czy wszystko działa OK, wpisując w przeglądarce adres:

  • Z Raspberry Pi: localhost
  • Z Raspberry Pi: 127.0.0.1
  • Z innego urządzenia w sieci LAN: Adres IP Raspberry Pi

Powinna wyświetlić się strona domyślna Apache:

raspberry-pi_www_05

Jeśli chcemy wgrać „na serwer” (Pi) własną stronę, możemy to zrobić np. za pomocą opisywanego niedawno programu WinSCP

Pliki naszej strony wgrywamy do katalogu:

/var/www

Jeśli chcecie mieć dostęp do swojej strony „z Internetu” pamiętajcie by na routerze ustawić przekierowanie odpowiedniego portu „z zewnątrz do Pi” (domyślnie 80)

Oczywiście potrzebujecie też mieć publiczne IP. A jeśli macie zmienne IP przyda się też konfiguracja DDNS.

www-data, czyli uprawnienia…

Może jeszcze być konieczne ustawienie odpowiednich praw dostępu do katalogu ze stroną dla użytkownika „www-data”, pod którym kryje się (w uproszczeniu) Apache.

W tym celu korzystamy z polecenia:

sudo chown -R www-data:www-data /var/www

„ServerName” fix

Wprawdzie dla samego działania serwera nie ma to znaczenia, ale np. „ze względów estetycznych” można pozbyć się komunikatu „błędu” który pojawia się podczas startu Apache w domyślnej konfiguracji:

apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName

waiting apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName

W tym celu otwieramy do edycji plik:

sudo nano /etc/apache2/apache2.conf

I dodajemy (np. na końcu) linijkę:

ServerName localhost

Ukrywamy wersję serwera

Nie jest to konieczne – ale na wszelki wypadek, by nie kusić… losu – ukryjemy również wersję serwera jaka działa na naszej maszynie:

sudo nano /etc/apache2/apache2.conf

I dodajemy (np. na końcu) 2 linijki:

ServerSignature Off
ServerTokens Prod

Domena

Jeśli chodzi o podpięcie do tak skonfigurowanego serwera Apache na Raspberry Pi to jest to również jak najbardziej możliwe…

Choć na pewno nie obejdzie się bez publicznego adresu IP, fajnie też jak będzie stały, choć przy zmiennym można ratować się serwisami typu DDNS.

Pokaże chyba najprostszy (bez zbytniego wdawania się w vHosty) z nich, idealnie pasujący do tego poradnika…

Ponownie edytujemy plik/alias:

sudo nano /etc/apache2/sites-enabled/000-default

Gdy korzystamy z SSL dodatkowo edytujemy:

sudo nano /etc/apache2/sites-enabled/default-ssl

Tak naprawdę jest to alias/link, i edytujemy plik /etc/apache2/site-available/default i /etc/apache2/site-available/default-ssl – wynika to z tego, że w katalogu „site-enabled” umieszczone są pliki konfiguracyjne stron które mają działać – być aktywne, a w „site-available” dostępne, ale niekoniecznie aktywne w danej chwili.

I dodajemy linijkę:

ServerName nasza_domena

 

raspberry-pi_www_apache_domena_01

ServerAdmin webmaster@localhost
DocumentRoot /var/www
ServerName test.rembiejewski.pl

Wychodzimy zapisując CTRL+X i Y, oraz restartujemy serwer Apache:

sudo /etc/init.d/apache2 restart

Musimy jeszcze zrobić 2 rzeczy:

Ustawić rekord A w DNS’ach naszej domeny ze wskazaniem na adres IP (publiczny) pod którym Raspberry Pi jest widoczna w Internecie:

raspberry-pi_www_apache_domena_02

A nazwa_domeny_lub_subdomena publiczny_adres_ip

Oraz na routerze ustawiamy przekierowanie portu (domyślnie 80, ale może być inny) „z Internetu” do Raspberry Pi:

  • Adres: Lokalny adres IP Raspberry Pi
  • Protokół: najlepiej oba, lub TCP
  • Publiczny port: 80
  • Lokalny port: 80

I to wszystko, jak widać – działa:

raspberry-pi_www_apache_domena_03

Tylko mała uwaga: po skonfigurowaniu w DNS’ach nowego rekordu musicie uzbroić się w cierpliwość, bo zmiana może być widoczna w kilka minut, a czasem nawet kilka(naście) godzin.

SSL

Warto tez „na zaś” ustawić obsługę połączenia szyfrowanego do serwera.

Wykorzystamy do tego celu certyfikat który sami sobie wygenerujemy – poza ostrzeżeniem przeglądarki, że nie wydał go „znany urząd certyfikacji” wszystko powinno działać.

Instalacja modułu:

sudo a2ensite default-ssl
sudo a2enmod ssl

 

raspberry-pi_www_apache2-ssl_01

Generujemy certyfikatu:

sudo make-ssl-cert generate-default-snakeoil --force-overwrite

 

raspberry-pi_www_apache2-ssl_02

Restart Apache:

sudo service apache2 restart

I to wszystko… Na „stronę” powinniście już móc wejść poprzez „https” – z czego warto korzystać wszędzie tam, gdzie przesyłacie prywatne dane (hasła, formularze, itp.).

Musicie tylko pamiętać, by dodatkowo na routerze ustawić port 443 „z zewnątrz do Raspberry Pi”.

mod rewrite

Wprawdzie modułów które można dodać (aktywować) do Apache jest całkiem sporo, to jest jeden bez którego nie wyobrażam sobie pracy ;-)

Chodzi o mod rewrite, który możemy aktywować za pomocą polecenia:

sudo a2enmod rewrite

I – standardowo – restart Apache:

sudo service apache2 restart

Domyślne kodowanie znaków

Można też ustawić domyślne kodowanie znaków (chodzi o „ogonki”, czyli np.: ęóąśłżźćń).

W tym celu ponownie edytujemy plik konfiguracyjny:

sudo nano /etc/apache2/apache2.conf

Ew. może to też być:

sudo nano /etc/apache2/conf.d/charset

i dodajemy linijkę:

AddDefaultCharset UTF-8

lub:

AddDefaultCharset ISO-8859-2

Oczywiście zmiana będzie aktywna po restarcie serwera Apache…

PHP.ini

Nie można też zapomnieć o edycji pliku php.ini by troszkę usprawnić działanie naszego serwera…

sudo nano /etc/php5/apache2/php.ini

I warto spojrzeć okien na pozycje:

memory_limit = 64M
post_max_size = 64M
upload_max_filesize = 64M

Apache2 utils

Warto też zainstalować też paczkę „apache2-utils”:

sudo apt-get install apache2-utils

Dzięki czemu dostaniemy dostęp do dodatkowych poleceń/narzędzi:

  • ab – narzędzie testujące Apache’a
  • fcgistarter – uruchamia program FastCGI
  • logresolve – uzyskuje nazwę komputera na podstawie adresów IP w plikach dziennika
  • htpasswd – obsługuje pliki uwierzytelniania typu Basic
  • htdigest – obsługuje pliki uwierzytelniania typu Digest
  • htdbm – obsługuje pliki uwierzytelniania typu Basic w formacie DBM, używając APR
  • htcacheclean – czyści pamięć podręczną dysku
  • rotatelogs – okresowo zatrzymuje zapisywanie do pliku dziennika i otwiera nowy
  • split-logfile – dzieli pojedynczy plik dziennika obejmujący wiele wirtualnych hostów
  • checkgid – sprawdza, kiedy odwiedzający może ustawić setgid dla określonej grupy
  • check_forensic – wydobywa mod_log_forensic z plików dziennika serwera Apache’a
  • httxt2dbm – generuje pliki DBM, używane z RewriteMap

MySQL

Przy bardziej złożonych stronach/projektach zapewne szybko się okaże, że przyda nam się też serwer baz danych…

Instalacja serwera MySQL

sudo apt-get install mysql-server mysql-client php5-mysql libapache2-mod-auth-mysql -y

W przypadku błędu (np. pakietu libapache2-mod-auth-mysql nie ma już w repozytoriach Raspbian Jessie) można spróbować:

sudo aptitude install mysql-server mysql-client php5-mysql -y

 

raspberry-pi_www_05_sql01

Podczas instalacji trzeba podać hasło do konta „root” dla bazy danych (MySQL, nie mylić kontem do systemu):

raspberry-pi_www_05_sql02

Gdy instalacja przebiegnie pomyślnie powinniście zobaczyć mniej więcej coś takiego:

raspberry-pi_www_05_sql03

I to właściwie wszystko jeśli chodzi o sam serwer MySQL, choć warto zainstalować teraz coś, co znacznie uprości nam zarządzanie bazami danych:

phpMyAdmin

Standardowo zaczynamy od instalacji:

sudo apt-get install phpmyadmin -y

 

raspberry-pi_www_06_phpmyadmin01

Gdy pojawi się ekran z wyborem rodzaju serwera WWW wybieramy: Apache2

raspberry-pi_www_06_phpmyadmin02

Na następnym ekranie by nie komplikować wybieramy „Yes”, i korzystamy z automatycznej konfiguracji:

raspberry-pi_www_06_phpmyadmin03

W kolejnym etapie musimy wpisać hasło do konta „root” dla bazy MySQL – te które utworzyliśmy podczas instalacji MySQL:

raspberry-pi_www_06_phpmyadmin04

Przy opcji:

MySQL aplication password for phpmyadmin:

możemy skorzystać z wygenerowania losowego hasła, w tym celu naciskamy tylko [enter]

raspberry-pi_www_06_phpmyadmin05

Jeśli wszystko poszło OK, to zapewne na koniec zobaczycie ekran podobny do tego:

raspberry-pi_www_06_phpmyadmin06

By sprawdzić czy wszystko działa ponownie wpisujemy w oknie przeglądarki adres Raspberry Pi (naszego serwera WWW), z tym że za adresem dodajemy:

/phpmyadmin

Czyli:

http://adres_ip_raspberry_pi/phpmyadmin
  • Login: root
  • Hasło: podane podczas instalacji (wyżej)

raspberry-pi_www_06_phpmyadmin07

Połączenie dla użytkownika kontrolnego zdefiniowanego w pliku konfiguracyjnym nie powiodło się.

Gdy w phpMyAdmin pojawi się Wam taki komunikat:

połączenie dla użytkownika kontrolnego zdefiniowanego w pliku konfiguracyjnym nie powiodło się

oznacza to, że coś poszło nie tak – i trzeba ręcznie skorygować „dane dostępowe”.

W tym celu należy przejść do edycji pliku:

sudo nano /etc/phpmyadmin/config-db.php

i sprawdzić m.in. te linijki:

$dbuser='phpmyadmin';
$dbpass='hasło';

Hasło które znajduje się w zmiennej $dbpass jest hasłem za pomocą którego phpMyAdmin próbuje się połączyć z bazą danych dla swoich celów – zmieniamy na prawidłowe…

Ew. jeśli nie znacie – a jest to możliwe, zwłaszcza gdy wybraliście losowe podczas instalacji – należy zalogować się do phpMyAdmin (użytkownik „root”) i ustawić hasło dla użytkownika „phpmyadmin” takie jak w tym pliku.

„Ręczna” instalacja phpMyAdmin

Jeśli ktoś chciałby ręcznie zainstalować phpMyAdmin (bo np. chce inną wersję) również nie jest to trudne, i sprowadza się do kilku prostych kroków. I muszę przyznać, że od jakiegoś czasu jest to sposób z którego coraz częściej korzystam…

Pobrania najnowszą paczkę ze strony projektu, rozpakowujemy pliki i wrzucamy je np. do katalogu „phpmyadmin” webserwera, np.:

/var/www/public_html/phpmyadmin

Do tego warto doinstalować jeszcze kilka paczek PHP – jakby ich nie było:

sudo apt-get install php5-mcrypt php-mbstring php5-mbstring php-gettext

sudo phpenmod mcrypt
sudo phpenmod mbstring
sudo systemctl restart php5-fpm

Po zalogowaniu do phpMyAdmin może pojawić się błąd/komunikat:

Plik konfiguracyjny wymaga teraz tajnej frazy kodującej (blowfish_secret).

By rozwiązać problem wystarczy utworzyć plik konfiguracyjny – można skorzystać z przykładowego:

sudo cp /var/www/public_html/phpmyadmin/config.sample.inc.php /var/www/public_html/phpmyadmin/config.inc.php

Otwieramy go:

sudo nano /var/www/public_html/phpmyadmin/config.inc.php

I zmienić w nim linijkę:

$cfg['blowfish_secret'] = ''; 

Np. na:

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

Zamiast „01234567890123456789012345678901” należy wstawić jakieś 32-znakowe (!) hasło.

Kolejny dość popularny błąd:

Program phpMyAdmin nie ma w pełni skonfigurowanej przestrzeni do przechowywania danych, niektóre rozszerzone funkcje zostały wyłączone. Aby dowiedzieć się dlaczego kliknij tutaj. Lub, alternatywnie, przejdź do zakładki 'Operacje’, w dowolnej bazie danych, aby tam to skonfigurować.

Wystarczy przez phpMyAdmin zaimportować plik:

/var/www/public_html/phpmyadmin/sql/create_tables.sql

Jeśli pojawi się błąd podczas tej operacji, to z poziomu konsoli:

mysql -u root -p

mysql> DROP DATABASE phpmyadmin;
mysql> CREATE DATABASE phpmyadmin;
mysql> exit

mysql -u root -p phpmyadmin < /var/www/public_html/phpmyadmin/sql/create_tables.sql

Po tej operacji i ponownym zalogowaniu do phpMyAdmin wszystko powinno być już OK (pamiętajcie tylko, że użytkownik „root” do MySQL to nie to samo co „root” do systemu).

phpMyAdmin: użytkownicy i bazy

Sama baza to jedno, ale warto jeszcze wiedzieć, jak dodać użytkownika i bazę danych…

Logujemy się do phpMyAdmin:

http://raspberrypi/phpmyadmin/

Nowy użytkownik:

W menu głównym phpMyAdmin wybieramy:

  • Uprawnienia > Dodaj nowego użytkownika

raspberry-pi_www_06_phpmyadmin08_db01

  • Nazwa użytkownika: jak sama nazwa wskazuje, nazwa nowego użytkownika bazy, np. patryk
  • Host: W większości przypadków możemy wybrać „Host lokalny” (localhost)
  • Hasło: Również chyba wiadomo, co tu trzeba wpisać :-)

raspberry-pi_www_06_phpmyadmin08_db02

Warto jeszcze zaznaczyć opcję:

  • Baza danych dla użytkownika:
    Przyznaj wszystkie uprawienia do baz danych o nazwach pasujących do maski (nazwaużytkownika_%)

lub:

  • Utwórz bazę danych z taką samą nazwą i przyznaj wszystkie uprawnienia

Wtedy wystarczy stworzyć bazę danych wg wzoru:

  • nazwaużytkownika_nazwabazy (wariant 1)
  • nazwaużytkownika (wariant 2)

by użytkownik miał do niej automatycznie odpowiednie uprawnienia…

Tworzenie baza danych

W menu głównym phpMyAdmin wybieramy „Bazy danych” i tam tworzymy nową bazę danych:

raspberry-pi_www_06_phpmyadmin08_db03

Zobacz jak dodatkowo zabezpieczyć dostęp do phpMyAdmin za pomocą pliku .htaccess

Podsumowanie

Oczywiście możecie skorzystać z innych serwerów niż Apache, z innej bazy niż MySQL – ale wybrałem akurat taki „pakiet”, bo chyba najczęściej się go używa, a zarazem chyba najmniej problemów sprawia przy obsłudze i konfiguracji…

Zobacz wszystkie artykuły z serii „Raspberry Pi”

(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Patryk