Serwer WWW Abashe Przemysław Sowa Wydział Inżynierii Mechanicznej i Informatyki Kierunek Informatyka, Rok II przemyslaw_sowa@o2.pl Streszczenie Abashe to serwer WWW napisany w języku powłoki Bash. Charakteryzuje się on prostotą instalacji oraz użytkowania. Nie stawia żadnych specjalnych wymagań co do środowiska uruchomieniowego, a ponadto jest uniwersalny oraz łatwy w rozbudowie. Dzięki obsłudze interfejsu CGI/1.1 może serwować dynamiczne strony internetowe: posiada wbudowane wsparcie dla języków PHP oraz Active Bash Pages. 1 Wstęp W dzisiejszych czasach nikt z nas nie wyobraża sobie życia bez Internetu. Stał on się czymś tak oczywistym jak telefon czy telewizja. Natomiast najpopularniejszą usługą internetową jest bez wątpienia World Wide Web [1]. Każdy z nas rozpoczynał poznawanie światowej pajęczyny od przeglądania stron WWW. Witryny internetowe są proste w obsłudze a każdy współczesny system operacyjny posiada oprogramowanie pozwalające na ich eksplorację. Oznacza to, że World Wide Web jest najprostszą i najbardziej intuicyjną metodą publikowania informacji. Dzięki uniwersalnemu językowi opisu stron - HyperText Markup Language[2], udostępniane przez nas zasoby mogą być z powodzeniem użytkowane przez wiele osób, bez względu na wykorzystywane przez nie systemy czy urządzenia informatyczne. Coraz więcej osób podłączonych jest do małych sieci domowych lub osiedlowych. Charakterystyczną dla użytkowników takich sieci cechą jest chęć dzielenia się posiadanymi zasobami. Należy jednak zwrócić uwagę na fakt, iż osoby te, to zwykli użytkownicy, nie koniecznie zaznajomieni z technologiami sieciowymi. Nie muszą znać sieciowych systemów plików, a już na pewno nie mają ochoty na skomplikowaną instalację i konfigurację serwerowego oprogramowania. W takich przypadkach interesującą alternatywą może być wykorzystanie protokołu HTTP [3] do wymiany danych. Jego uniwersalność oraz prostota użytkowania stwarzają szanse na szerokie zastosowanie go przez mniej doświadczonych użytkowników. Poważnym problemem okazuje się jednak brak łatwych w obsłudze serwerów World Wide Web. Istniejące na rynku oprogramowanie [4] stworzone jest do zastosowań profesjonalnych, wymaga doświadczenia przy konfigurowaniu oraz zajmuje sporo przestrzeni dyskowej. Niszę spowodowaną brakiem małych i prostych w obsłudze serwerów WWW stara się wypełnić przedstawiony w poniższej pracy program Abashe. Zaprojektowano go tak, aby jego użytkowanie było maksymalnie uproszczone, a instalacja i konfiguracja nie 1
nastręczały problemów. Jego wielką zaletą jest to, że działa "out of box", co oznacza, że nie ma potrzeby instalowania i konfigurowania megabajtów zbędnych bibliotek oraz oprogramowania towarzyszącego. Praca zorganizowana jest w następujący sposób: w Rozdziale 2 przedstawiono projekt serwera, jego założenia oraz genezę powstania. Kolejny rozdział poświęcony jest architekturze systemu Abashe, zaś w Rozdziale 4 omówiono jego możliwości. Pracę zamyka prezentacja potencjalnych zastosowań serwera wraz z krótkim podsumowaniem. 2 Projekt serwera Abashe Język programowania powłoki Bash [5] został zaprojektowany jako narzędzie do tworzenia skryptów ułatwiających i automatyzujących codzienne zadania wykonywane w systemach uniksowych. W zamyśle twórców nie miała to być platforma do tworzenia aplikacji i wielu ludzi nie wyobraża sobie takiego wykorzystania tej popularnej powłoki. Z tego powodu pomysł użycia Basha do napisania w pełni funkcjonalnego serwera WWW stanowił interesujące wyzwanie. Początkowo Abashe miał być jedynie dowodem na uniwersalność i potęgę najpopularniejszej linuksowej powłoki. Z czasem zaskoczył on jednak swoimi możliwościami nawet autora i przekształcił się w pełnoprawny projekt programistyczny. Już na samym początku obok koncepcji stworzenia serwera World Wide Web istniała idea opracowania języka do opisu dynamicznych stron WWW o zastosowaniu podobnym do PHP. Pomysł ten został z powodzeniem zrealizowany, a nowy język nazwano Active Bash Pages, w skrócie ABP. Zostanie on bliżej przedstawiony w dalszej części pracy jako że stanowi integralną część serwera. 3 Architektura serwera Przy projektowaniu i implementowaniu serwera należało przede wszystkim uwzględnić ograniczenia wynikające z użytej platformy. Skrypty powłoki mają dużo mniejsze możliwości niż te pisane w takich językach jak Perl [6] lub Python [7] i różnią się znacząco od programów pisanych w językach C/C++. Największym problemem okazał się brak obsługi gniazd sieciowych. Bash pozwala co prawda na otwieranie połączeń sieciowych TCP i UDP oraz łączenie z nimi deskryptorów gniazd, jednak nie ma możliwości utworzenia gniazda nasłuchującego, co jest absolutnie wymagane w każdym serwerze TCP. Dla większości czytelników może być to wielkim zaskoczeniem, w końcu jak można bez tego napisać serwer WWW? Odpowiedź brzmi: nie można. Problem ten rozwiązano poprzez wykorzystanie programu netcat [8], który jest standardowo dostępny w większości dystrybucji Linuksa oraz w Uniksach. netcat nie jest bardzo wydajnym rozwiązaniem, dlatego alternatywnie można użyć programu hpnc rozprowadzanego wraz z serwerem. Serwer posiada budowę modułową, co ułatwia jego rozszerzanie oraz pozwala wyodrębnić logiczne fragmenty, które mogą być rozwijane niezależnie. Elementy te zostały schematycznie zaprezentowane na Rysunku 1. Rdzeń aplikacji składa się z dwóch skryptów: abashe.sh oraz obsluga_zadania.sh. Pierwszy z nich inicjuje serwer, drugi natomiast zajmuje się obsługa każdego napływają- 2
Rys. 1: Modularna budowa serwera. cego żądania HTTP. Pokrótce odbywa się to w następujący sposób: proces uruchamiania Abashe a kończy się wywołaniem programu netcat, który to rozpoczyna nasłuchiwanie na gnieździe TCP. W momencie, kiedy klient łączy się z serwerem, program netcat akceptuje połączenie, duplikuje deskryptor gniazda sieciowego przypisując go do standardowego wejścia oraz wyjścia, a następnie zastępuje swój proces skryptem obsługi żądania. Skrypt ten ponownie uruchamia aplikację netcat, aby umożliwić przyjmowanie następnych połączeń, a sam zajmuje się obsługą bieżącego żądania operując jedynie na deskryptorach standardowego wejścia/wyjścia. Dzięki temu komunikacja sieciowa jest zaimplementowana w sposób zupełnie przezroczysty. Dodatkowym plusem tego rozwiązania jest otrzymanie serwera wieloprocesowego, który może obsługiwać równocześnie kilku klientów. Zostało to zilustrowane na Rysunku 2. Powyższe rozwiązanie jest wymuszone przez zasadę działania programu netcat. Nie jest ono jednak optymalne, ponieważ przez krótką chwilę czasu, pomiędzy uruchomieniem skryptu obsługi żądania i ponownym startem procesu netcat, serwer nie może przyjąć nowych połączeń. Z tego powodu wraz z serwerem Abashe rozpowszechniany jest niewielki program hpnc, który działa analogicznie jak netcat jednak nie zastępuje swojego procesu uruchamianym skryptem, tylko dokonuje tak zwanego rozwidlenia. Dzięki temu ciągłość pracy serwera zostaje zachowana. Przetwarzanie poszczególnych połączeń sprowadza się do wysłania żądanego pliku lub do przygotowania środowiska i uruchomienia jednego ze standardowo wspieranych interpreterów stron dynamicznych: ABP lub PHP, a następnie zwrócenia wyników. 3
4 Możliwości serwera Rys. 2: Wieloprocesowa obsługa połączeń. To co stanowi o sile serwera Abashe jest elastyczność i prostota. Nie wymaga on instalacji ani konfiguracji (nie oznacza to jednak, że nie jest konfigurowalny). Wykorzystuje jedynie standardowe uniksowe programy, dzięki czemu jest w stanie działać w każdym systemie operacyjnym zaraz po skopiowaniu na dysk. Serwer obsługuje protokół HTTP w wersji 1.0. Jego wielką zaletą jest wsparcie dla standardu CGI/1.1 [9], dzięki czemu może współpracować z wszelkiego rodzaju aplikacjami internetowymi i serwować dynamiczne strony WWW. Wiele osób ucieszy fakt, że Abashe standardowo rozpoznaje strony napisane w PHP [10] i wykonuje je, o ile tylko w systemie znajduje się interpreter tego języka. W rezultacie omawiany program jest wyjątkowo przydatny dla webmasterów, ponieważ mogą oni testować wyniki swojej pracy w rzeczywistym środowisku, a jednocześnie nie muszą posiadać uprawnień, aby zainstalować i administrować pełnym serwerem World Wide Web. Jeszcze bardziej interesująca jest obsługa Active Bash Pages - języka zasługującego na bliższe omówienie. Jak już wcześniej wspomniano, Active Bash Pages to język do tworzenia dynamicznych stron internetowych, rozwijany wraz z projektem Abashe. Jest on zgodny ze specyfikacją CGI/1.1, co czyni go uniwersalnym i niezależnym od użytego serwera WWW. Moduł jego obsługi jest dołączony do programu Abashe. Cechą charakterystyczną dla tego języka jest fakt, że tak naprawdę jego interpreterem jest powłoka Bash. Oznacza to, że składnia jest taka sama jak składnia shella. Stanowi to bardzo dużą zaletę, ponieważ każdy, kto zna standardową powłokę Linuksa, może od razu pisać strony w ABP. Przed stronami Active Bash Pages nie są stawiane żadne wymagania, nie muszą one posiadać nagłówka charakterystycznego dla skryptów ani atrybutu wykonywalnego. Język ten daje pełen dostęp do informacji o środowisku w jakim dana strona ABP jest wykonywana. Ponadto automatycznie dekoduje dane z formularzy HTML oraz tworzy zmienne o odpowiednich nazwach i wartościach, co czyni używanie tego narzędzia wyjątkowo łatwym i szybkim. 4
Należy wspomnieć, że język ten opcjonalnie współpracuje z prostym systemem bazodanowym BashQL. System ten również napisany jest w Bashu i zachowuje zgodność z SQL [11]. 5 Rozwój serwera Projekt pomimo wczesnego stadium rozwoju jest już w pełni funkcjonalny. W przyszłości rozważa się rozbudowę jego możliwości poprzez np. zaimplementowanie protokołu HTTP w wersji 1.1. Kolejnym wymogiem jest poprawa wydajności, jednak ze względu na oparcie serwera na powłoce Bash nigdy nie zbliży się on w tej kwestii do profesjonalnego oprogramowania. Należy jednak zwrócić uwagę, że wydajność nie była nigdy głównym celem tego projektu. Całość kodu udostępniana jest na licencji GPL [12], a projekt został niedawno umieszczony w portalu Sourceforge.net pod adresem: http://abashe.sourceforge.net. Autor liczy na odzew ze strony społeczności Open Source, co na pewno zaprocentuje dużą liczbą nowych pomysłów i dynamiczniejszym rozwojem projektu. Serwer Abashe stara się dopasować do wymogów zwykłych użytkowników i znaleźć zastosowanie głównie w małych sieciach intranetowych. Ciekawą perspektywą byłoby wykorzystanie go przez administratorów systemów uniksowych. Znają oni doskonale powłokę Bash, dlatego mogliby swobodnie tworzyć strony ABP, a przeniesienie skryptów administracyjnych z surowych okien terminali do przeglądarek internetowych otwiera nowe możliwości automatyzowania zadań związanych z zarządzaniem sieciami komputerowymi. 6 Zakończenie Przedstawiony projekt serwera jest nietypowy z kilku powodów: został zaimplementowany w języku powłoki i jest praktycznie bezobsługowy. Nietypowe jest również jego przeznaczenie, ponieważ nie stara się konkurować z poważnymi, rozbudowanymi programami tego typu. Zamiast tego adresowany jest do odbiorców używających serwera na prywatny użytek do serwowania niewielkich ilości danych. Autor starał się zniwelować jego słabe strony oraz rozwinąć zalety. Z pomysłu, który był wielkim eksperymentem wyrosło narzędzie, które ma szanse znaleźć swoje miejsce wśród typowych narzędzi uniksowych. To jednak zależy od tego, czy Abashe spotka się z zainteresowaniem ze strony użytkowników i czy znajdą się osoby chętne do jego rozwoju. Bez względu na to, omawiany projekt jest z całą pewnością jednym z ciekawszych skryptów powłoki systemu Linux, niepozbawionym wielu walorów edukacyjnych. Literatura [1] The World Wide Web Consortium - http://www.w3.org [2] HTML 4.01 Specification - http://www.w3.org/tr/html4/ [3] Hypertext Transfer Protocol - RFC 2616 5
[4] The Apache HTTP Server Project - http://httpd.apache.org [5] Bash - http://www.gnu.org/software/bash/ [6] Perl Programming Language - http://www.perl.com [7] Python Programming Language - http://www.python.org [8] Netcat - http://netcat.sourceforge.net [9] The Common Gateway Interface (CGI) Version 1.1 - RFC 3875 [10] PHP: Hypertext Preprocessor - http://www.php.net [11] The SQL Language - ISO/IEC 9075-1:2003 [12] GNU General Public License - http://www.gnu.org/copyleft/gpl.html 6