środa, 11 lipca 2012

RaspberryPi jako domowy serwer WWW

000 pomysł

Stworzenie serwera domowych zasobów cyfrowych, czyli plików wszelkiej maści (chodzi o niewielką liczbę plików, do których chcemy mieć szybki dostęp; głównie zdjęcia i muzyka, ewentualnie jakieś dokumenty, faktury itp.) to jeden z pomysłów na wykorzystanie platformy RaspberryPi (http://www.raspberrypi.org/, dedykowane WiKi: http://elinux.org/R-Pi_Hub).

001 konfiguracja

Zaczynamy od podstawowej konfiguracji Debiana, dostępnego na stronie projektu w sekcji Downloads - wszystkie niezbędne czynności opisano np. na wskazanej wcześniej stronie WiKi.
Warto włączyć sobie obsługę karty muzycznej (nieprzydatna w serwerze, ale chcemy mieć pewność, że wszystko działa ;)) - najlepiej według opisu na stronie http://j.mp/M6oRuG. Pamiętać musimy, że w celu automatycznego uruchamiania dźwiękówki podczas startu systemu, należy uaktywnić moduł snd_bcm2835 w pliku /etc/modules.
Następny krok nie jest konieczny, ale można spróbować - chodzi o obsługę "kart" WiFi (w postaci dongla USB). Jeśli dysponujemy jednak infrastrukturą LAN, sugeruję z niej skorzystać - nie będziemy zajmować jednego z dwóch jakże cennych gniazd USB naszej maliny, tym bardziej, że karty WiFi USB nie przepadają w przypadku maliny za hubami USB, nawet tymi aktywnymi (z własnym zasilaniem). Instalacja kart WiFi przedstawiona została w artykule dostępnym pod adresem http://j.mp/M6nbl3. W nowszych dystrybucjach zalecanego dla RPi systemu raczej nie trzeba dodawać wspomnianych tam repozytoriów - po prostu sprawdźcie, czy da się pominąć krok pierwszy. Jeśli wszystko się uda, mamy bezprzewodowy dostęp do sieci lokalnej i internetu (o ile mamy oczywiście wyjście na świat). U mnie RPi bardzo sprawnie działa z popularną, szalenie tanią (~15zł) "kartą" Sagem XG-762N. Poniżej zawartość pliku /etc/network/interfaces mojego RPi:


Plik zawiera zakomentowaną część dotyczącą karty bezprzewodowej, ale konfiguracja jest jak najbardziej prawidłowa i sprawdzona. Zmieniłem sieć WiFi na LAN ze względu na słaby zasięg mojej sieci domowej w miejscu, gdzie testuję RPi (stary router ADSL jako switch i udostępnianie połączenia przez komputer stacjonarny za pomocą programu Firestarter). Bardzo ważna uwaga: nie zapominajmy o pliku /etc/resolv.conf - niezależnie od tego, jakiej karty używamy, musimy tam wpisać adresy serwerów DNS, w przeciwnym wypadku nie będziemy mogli posługiwać się nazwami domenowymi...
Oczywiście w przypadku obu kart sieciowych adres IP jest stały - konfiguracja łącza przez DHCP byłaby dla stacji klienckich utrudnieniem, zwłaszcza, że np. mój router, który przy okazji rozrzuca adresy, ma słabe możliwości konfiguracji czasu dzierżawy.

OK, teraz już nasza malina powinna odtwarzać muzykę (doinstalujcie np. mpg321) i - co najważniejsze - mieć swobodny dostęp do sieci. Ktoś może zapytać o firewall - cóż, chwilowo jest to niedostępny luksus, musimy poczekać do aktualizacji systemu.

010 klasyka - apache, mysql, php5, sqlite3

Krótko:
sudo apt-get install sqlite3
sudo apt-get install apache2
sudo apt-get install php5

Szczegóły znajdziemy oczywiście w sieci - ciekawy opis jest np. tutaj: http://www.instructables.com/id/Raspberry-Pi-Web-Server/
Niestety, szybko okazało się, że mimo wielu zabiegów i prób optymalizacji, klasyczna kombinacja LAMP powoduje jeden wielki wyciek pamięci (przypominam, że w malinie mamy do dyspozycji w klasycznej konfiguracji ok. 192MB), paraliżujący maszynkę, w niektórych przypadkach na dobre. Dlatego też, dzięki radom kolegów z G+, zmieniłem apacza na...

011 ekscentryzm - apache schodzi z boiska, za niego, z numerem 2, wchodzi nginx

Projekt Node.js (nodejs.org) przekonał mnie do serwerów działających w oparciu o pętlę zdarzeń. Zamieniłem więc apache na nginx - oczywiście należało odpowiednie pakiety zainstalować i skonfigurować. Niestety, w oficjalnych repozytoriach dla Debiana na RPi nie ma jeszcze pakietu php5-fpm, dlatego też skorzystałem z opisu przedstawionego w artykule pod adresem http://j.mp/NnRnFE. Jedyna różnica u mnie polega na tym, że uruchamiam php5-cgi po "dźwignięciu" interfejsu sieciowego, czyli poprzez umieszczony w katalogu /etc/network/if-up.d skrypt php-fastcgi:


Można oczywiście (ostrożnie) poeksperymentować z liczbą odpalanych procesów php5-cgi.

100 sprzątanie

Jeśli nic strasznego po drodze się nie wydarzyło, to mamy działający serwer WWW za ~170zł ;)
MySQL okazał się chwilowo niepotrzebny, ponieważ użyłem oprogramowania eXtplorer (http://extplorer.sourceforge.net/), nie korzystającego z serwera baz danych. W sumie mając sqlite3 możemy - o ile program, którego będziemy chcieli użyć, na to pozwala - wymusić pracę z  plikowymi bazami danych. Wyłączenie automatycznego uruchamiania MySQL uwolniło trochę RAM-u (ok. 20MB). Oczywiście należy też wyłączyć automatyczny start apacza - polecam program rcconf ;)

W obecnej konfiguracji mój RaspberryPi dysponuje po uruchomieniu ok. 128MB wolnej pamięci i podczas działania usług WWW raczej nie schodzi poniżej 30MB, przy założeniu, że jest to faktycznie domowy serwer (np. góra dwie stacje klienckie w jednym momencie).

101 pytania

Z oczywistych powodów (dublowanie zawartości internetów ;)) mój opis jest dosyć lakoniczny i przypomina raczej sprawozdanie, przeznaczone dla osób, które jednak jakiegoś linuksa debianopodobnego kiedykolwiek używały. Dlatego też zachęcam do zadawania pytań - tutaj, na twitterze i G+.

110 postscriptum

Warto się zastanowić, jakiego urządzenia użyć do przechowywania danych udostępnianych przez nasz serwer. Karta SD 8GB (jak u mnie) to niewiele i nie za szybko... Dysk twardy na USB? Mój nie zadziałał (zapewne kwestia zasilania...)...