Apache to jeden z podstawowych serwerów WWW dostępnych w Linuksie
Instalacja
Instalację najlepiej wykonać z pakietów dostarczanych przez twórców dystrybucji. W przypadku dystrybucji Mandriva (dawny Mandrake) wydamy polecenie:
urpmi apache2
Natomiast w dystrybucji Debian:
apt-get install apache2
Uruchomienie, restart i zatrzymanie serwera
Serwer WWW uruchamiamy (w trybie konsoli) w dystrybucjach wykorzystujących schemat V System (czyli np. Red Hat, Debian, mandriva (dawny Mandrake) ale nie Slackware) przy pomocy polecenia:
/etc/init.d/httpd2 start
Albo
/etc/init.d/apache2 start
Zależy to od dystrybucji i przyjętych przez jej twórców schematów organizacyjnych.
Serwer restartujemy poleceniem:
/etc/init.d/httpd2 restart
Albo
/etc/init.d/apache2 restart
Zatrzymania serwera dokonamy przy pomocy polecenia:
/etc/init.d/httpd2 stop
Albo
/etc/init.d/apache2 stop
Podstawowa konfiguracja
Plik konfiguracyjny (/etc/httpd/conf/httpd.conf w przypadku Mandrivy (dawny Mandrake)) składa się z kilku części:
- Main Configuration Section
- Dynamic Shared Object (DSO) Support
- Global Configuration
- IP Address/Port and Proxied configuration section
- Log configuration Section
- Virtual Hosts
- Performance settings Section
Podstawowa konfiguracja ogranicza się tylko do kilku czynności: określeniu nazwy serwera www, osoby odpowiedzialnej za serwer, adresu i portu na którym działa,
Określenie portu
Jeżeli Apache 2.x nie funkcjonuje jako serwer proxy (czyli nie pracuje jako pomocniczy realizując skrypty php i cgi a strony statyczne są realizowane przez Apache-SGI lub khttpd, które szybciej dostarczają strony statyczne) to dyrektywa Listen pozwala określić port na którym działa.
<IfDefine !APACHEPROXIED> Listen 80 </IfDefine>
Użytkownik i grupa programu
Program obsługujący użytkownika nie powinien ze względu na bezpieczeństwo działać z uprawnieniami administratora, dlatego Apache wykorzystuje specjalnego użytkownika o minimalnych uprawnieniach. Jego nazwę oraz grupę do której należy definiujemy określając wartości zmiennych User i Group. Jeżeli nie planujemy specjalnych zmian można zostawić ustawienia domyślne:
User apache Group apache
Przekonać się, że tak faktycznie jest, możemy wykorzystując polecenie pstree do określenia zależności między procesami oraz ps aux | grep apache do pobrania bardziej szczegółowych danych.
[root@localhost etc]# pstree init-+-apmd |-atd |-bdflush |-crond |-devfsd |-httpd2-+-advxsplitlogfil | `-6*[httpd2] [root@localhost etc]# ps aux | grep http root 3279 0.0 5.5 12704 7040 ? S 22:28 0:00 httpd2 -f /etc/httpd/conf/httpd2.conf apache 3288 0.0 5.8 14740 7440 ? S 22:28 0:00 [httpd2] apache 3290 0.0 3.2 13204 4124 ? S 22:28 0:00 [httpd2] apache 3291 0.0 6.0 14948 7692 ? S 22:28 0:00 [httpd2] apache 3293 0.0 6.1 14972 7720 ? S 22:28 0:00 [httpd2] apache 3294 0.0 3.3 13216 4184 ? S 22:28 0:00 [httpd2] apache 3327 0.0 6.2 13140 7928 ? S 22:39 0:00 [httpd2]
Określenie użytkownika, który podłącza się do uprzywilejowanego portu a następnie obsługuje go jest szczególnie ważne przy określaniu list dostępu (ACLi) definiowanych na poziomie jądra (np. Selinux, LIDS czy RSBAC).
Administrator serwera WWW
W przypadku potrzeby kontaktu z administratorem (np. gdy wystąpi błąd) serwer wyświetla adres administratora serwisu WWW. Określa go dyrektywa ServerRoot. Należy go ustawić na jakiś rzeczywisty adres.
ServerAdmin root@localhost
Polonizacja serwera
Polonizacja serwera polega na zmianie dwóch parametrów. Pierwszy to domyślna strona kodowa wysyłana do klienta, określana przez dyrektywę AddDefaultCharset.
AddDefaultCharset ISO-8859-2
Druga to wysyłana wersja językowa strony, jeżeli jest ich kilka. Kolejność tą określa dyrektywa LanguagePriority.
<IfModule mod_negotiation.c> LanguagePriority en fr de es it da nl et el ja kr no pl pt pt-br ru ltz ca sv tw </IfModule>
Nazwa domyślnego pliku zawierającego spis treści katalogu
Otwierając nowy katalog wygodnie jest odwiedzającemu witrynę nie podawać nazwy strony której szuka. Powinna być wtedy wyświetlona strona zawierająca opis zawartości tego katalogu. Jego domyślną nazwę określa dyrektywa DirectoryIndex. Jeżeli zamiast jednej nazwy podamy kilka, to pierwszy znaleziony plik w katalogu zostanie zaprezentowany odwiedzającemu.
<IfModule mod_dir.c> DirectoryIndex index.html index.html.var index.php index.php3 index.shtml index.cgi index.pl index.htm Def ault.htm default.htm index.xml </IfModule>
Opcje sekcji <Directory>
W sekcji <Directory> możemy użyć opcji ograniczających pewne czynności serwera lub uprawnienia do generowania treści.
Opcja | Działanie |
---|---|
All | Wszystkie opcje za wyjątkiem MultiViews |
ExecCGI | Zezwala na wykonywanie programów z tego katalogu (opcja przydatna w katalogu /cgi-bin), |
FollowSymLinks | Zezwala na używanie dowiązań symbolicznych, |
Includes | Zezwala na uruchamianie Server Side Include, |
IncludesNoExec | Zezwala na uruchamianie Server Side Include, jednak bez możliwości uruchamiania zewnętrznych programów dyrektywą dyrektywą #exec, |
Indexes | Jeżeli nie ma pliku określającego zawartość katalogu (określonego w dyrektywie DirectoryIndex) serwer utworzy index katalogu z listy plików tego podkatalogu, |
MultiViews | Umożliwia negocjowanie treści (np. wersji językowych plików) między klientem a serwerem WWW |
SymLinksOwnerMatch | działa podobnie jak FollowSymlinks ale wymusza zgodność właściciela dowiązania i docelowego podkatalogu |
Domyślne zasady dostępu do plików i katalogów
<Directory /> Options -All -Multiviews AllowOverride None <IfModule mod_access.c> Order deny,allow Deny from all </IfModule> </Directory>
Katalog WWW użytkowników
Każdy użytkownik ma także możliwość wyświetlenia swojej strony WWW. Dostęp do niej odbywa się przez podanie adresu zakończonego tyldą oraz nazwą użytkownika (np. www.pingwin.wirt.pl/~ziutus). Aby użytkownik mógł to robić należy zdefiniować nazwę katalogu w przestrzeni użytkownika, gdzie on trzyma stronę oraz prawa dostępu do niego.
Nazwę katalogu określa dyrektywa UserDir po której następuje nazwa katalogu. Standardowo jest to public_html.
<IfModule mod_userdir.c> UserDir public_html </IfModule>
Prawa dostępu do katalogu określamy w innej części:
<Directory /home/*/public_html> AllowOverride All Options MultiViews -Indexes Includes FollowSymLinks <IfModule mod_access.c> Order allow,deny Allow from all </IfModule> </Directory>
Zmieniając domyślną nazwę tego katalogu na bardziej przyjazną (np. www) należy zmienić ją w obu miejscach.
Domyślne opcje dla katalogu strony serwera
Katalog, w którym znajduje się strona serwisu definiujemy w zmiennej DocumentRoot. Zwyczajowo jest to /var/www/html:
DocumentRoot /var/www/html
Ze względu na fakt, iż domyślne wszystkie katalogi są zablokowane należy przedefiniować opcje go dotyczące:
<Directory /var/www/html> Options -Indexes FollowSymLinks MultiViews AllowOverride Limit <IfModule mod_access.c> Order allow,deny Allow from all </IfModule> </Directory>
Ograniczenie zasobów systemu
Apache 2.x na architekturze Unix/Linux może pracować w jednym z trzech modeli: procesów (moduł prefork – domyślny), wątków (perchild) oraz pomieszania wątków i procesów (worker – najbardziej wydajny ale i najmniej stabilny).
Dla każdego z tych modeli możemy określić minimalną i maksymalną ilość oczekujących jednocześnie serwerów (odpowiednio MinSpareServer i MaxSpareServer), ilość uruchamianych na starcie serwerów (StartServer) czy ilość jednoczenie obsługiwanych połączeń serwera z klientami (MaxClients). Przykładowe ograniczenia to:
<IfModule prefork.c> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0 </IfModule>
Sprawdzenie iż faktycznie prefork.c jest modułem domyślnym dokonamy przez wylistowanie listy modułów na stałe wkomplilowanych do kodu serwera
[root@localhost ziutus2]#httpd2 -l Compiled in modules: core.c prefork.c http_core.c mod_so.c
Jak widać mamy tutaj moduł prefork.c, pozostałych dwóch modułów brak.
Dalsza konfiguracja
Określenie opcji kompilacji i modułów na stałe wkompilowanych do kodu serwera
Jeżeli używamy serwera skompilowanego przez twórców dystrybucji możemy (a nawet powinniśmy) sprawdzić jakie zostały użyte opcje kompilacji oraz moduły zostały wkompilowane na stałe do kodu serwera. Pierwszej rzeczy dokonamy wydając komendę httpd2 -V.
[root@localhost ziutus2]# httpd2 -V Server version: Apache-AdvancedExtranetServer/2.0.44 Server built: Mar 4 2003 21:21:03 Server's Module Magic Number: 20020903:0 Architecture: 32-bit Server compiled with.... -D APACHE_MPM_DIR="server/mpm/prefork" -D APR_HAS_SENDFILE -D APR_HAS_MMAP -D APR_HAVE_IPV6 -D APR_USE_SYSVSEM_SERIALIZE -D APR_USE_PTHREAD_SERIALIZE -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT -D APR_HAS_OTHER_CHILD -D AP_HAVE_RELIABLE_PIPED_LOGS -D HTTPD_ROOT="/etc/httpd/2.0" -D SUEXEC_BIN="/usr/sbin/apache2-suexec" -D DEFAULT_PIDLOG="/var/run/httpd.pid" -D DEFAULT_SCOREBOARD="logs/apache_runtime_status" -D DEFAULT_LOCKFILE="/var/run/accept.lock" -D DEFAULT_ERRORLOG="logs/error_log" -D AP_TYPES_CONFIG_FILE="conf/mime.types" -D SERVER_CONFIG_FILE="conf/httpd2.conf"
Drugiej dokonamy przez wywołanie komendy httpd2 -l
[root@localhost ziutus2]##httpd2 -l Compiled in modules: core.c prefork.c http_core.c mod_so.c
PHP
PHP, w przypadku dystrybucji Mandriva (dawny Mandrake), jest zawarte w pakiecie apache2-mod_php. Należy go zainstalować aby umożliwić serwerowi interpretację plików PHP. Zawiera on następujące pliki:
1. /etc/httpd/conf.d/70_mod_php.conf 2. /usr/lib/apache2-extramodules-2.0.44/mod_php4.so 3. /usr/share/doc/apache2-mod_php-2.0.44_4.3.1 4. /usr/share/doc/apache2-mod_php-2.0.44_4.3.1/PHP_FAQ.php 5. /var/www/html/addon-modules/apache2-mod_php-2.0.44_4.3.1
Pierwszy plik zawiera opcję ładowania modułu oraz definicję reakcji serwera po napotkaniu pliku o rozszerzeniu php, php3 czy php4. Drugi to plik modułu, pozostałe to dokumentacja modułu.
Są to jedyne pliki potrzebne do obsługi PHP w przypadku serwera Apache.
Sprawdzenie czy php jest uruchomione najłatwiej jest wykonać korzystając z funkcji php informującej o parametrach pracy. Stwórz sobie plik test.php w katalogu głównym serwera o następującej zawartości:
Pamiętaj tylko jeżeli chcesz mieć obsługę baz danych przez PHP (np. mysql czy postgresql) musisz doinstalować odpowiednie moduły.
Ograniczenie dostępu
Domyślnie (ale to zależy od instalacji) w pliku /etc/apache/access.conf dopisujemy dyrektywy określające dostęp do naszego serwera www. Mają one dość schematyczny i łatwy do przewidzenia wygląd. Najpierw określamy katalog którego dotyczą ograniczenia (przez dyrektywę <Directory nazwa_katalogu> </Directory>) a następnie określamy przy pomocy poleceń Order (z parametrami allow oraz deny), Deny from oraz Allow from komputery lub całe sieci, których zasady dotyczą. Polecenie Order określa domyślną politykę (allow lub Deny), natomiast pozostałe polecenia określają kogo tyczy zapis).
Przykładowo mamy:
<Directory /home/httpd/html/katalog> Order allow, deny Deny from 123.456.789.012 Allow from all </Directory>
oznacza iż dopuszczamy wszystkich poza kimś o adresie 123.456.789.012
Linii określających zasady dostępu (czyli z Deny i from) może być wiele. Mogą tyczyć pojedynczego komputera lub całej domeny. Wszystko zależy od Twojej fantazji.
Przykładowy wpis to:
<Directory /home/httpd/html/katalog> Order allow, deny Allow from 000.000.000.000 Allow from *.ziutus.com.pl Deny from 192.168.192.4 Deny from 192.168.192. </Directory>
Strony błędów
Czasem zdarza się iż internauta źle wpisze adres lub odsyłacz prowadzi do nieistniejącej strony. Mogą zdarzyć się także inne problemy: źle podane hasło do strony z ograniczonym dostępem lub próba uruchomienia protokołu nie obsługiwanego przez serwer. W takich przypadkach możemy zdać się na domyślne strony błędów lub stworzyć własne (które będą znacznie lepiej wyglądać).
Komunikaty o błędach, które zdefiniujemy, mogą mieć następującą postać: zwykłego tekstu umieszczanego na stronie, strony na naszym serwerze czy przekierowania na inny serwer.
Komunikat w postaci zwykłego tekstu tworzymy następująco:
ErrorDocument 404 "Błąd 404. Strona nie istnieje..."
Wyświetlenie lokalnej strony uzyskamy następująco:
ErrorDocument 401 /zle_haslo.html
Jeżeli natomiast chcemy zrobić przekierowanie na stronę informującą o błędzie to piszemy:
ErrorDocument 404 http://tcz.dtvk.tpnet.pl/errors/404.htm
Przykładowe konfiguracje to:
ErrorDocument 401 "Blad 401. Podales niepoprawne haslo. ErrorDocument 403 http://tcz.dtvk.tpnet.pl/errors/403.htm ErrorDocument 404 http://tcz.dtvk.tpnet.pl/errors/404.htm ErrorDocument 500 http://tcz.dtvk.tpnet.pl/errors/500.htm
Hasło na WWW
Aby wprowadzić hasła na dostęp do strony należy zrobić dwie rzeczy: poinformować Apache’a że dany katalog jest chroniony hasłem oraz stworzyć plik z hasłami. Tak więc po pierwsze modyfikujemy odpowiednią linie aby wpis przybrał postać: Options Indexes Includes FollowSymLinks oraz kolejną linie w której zapis AllowOverride None, zmieniamy na AllowOverride All i restartujemy serwer. W katalogu, który chcemy zabezpieczyć należy umieścić plik o nazwie .htaccess zawierający następujące polecenia dla serwera WWW:
AuthType basic AuthName "index.htm" AuthUserFile /home/httpd/html/katalog/.htpasswd (lub inny namiar) AuthGroupFile /dev/null require valid-user
Następnie tworzymy plik z użytkownikami i ich hasłami poleceniem: htpasswd -c /home/httpd/html/katalog/.htpasswd username System o hasło dla użytkownika "username" i zapisze go do pliku ".htpasswd". Przy dodawaniu kolejnego użytkownika należy pominąć "-c" przy wywoływaniu htpasswd.
Pamietaj iż serwer nie sprawdza czy kto nie próbuje złamać siłowo hasło, w ogóle nie występuje kontrola pod tym względem, postaraj się więc o silne hasło a przynajmniej aby hasła te nie były hasłami z systemu.
server-status
![]() |
Jeżeli serwer został skompilowany odpowiednio można na stronie lokalnego serwera http://localhost/server_status znaleźć kilka informacji o nim |
server-info
![]() |
Jeżeli natomiast serwer został skompilowany z opcją –with-server-info można na stronie lokalnego serwera http://localhost/server_info znaleźć znacznie więcej informacji o nim. |
perl-status
![]() |
Jeżeli zainstalowaliśmy moduł mod_perl-common i oczywiście mamy serwer z obsługą Perla możemy zobaczyć informacje dotyczące Perla włączonego do Apache-a. Dobrze jest także doinstalować moduł perl-Devel-Symdump, wtedy uzyskamy bardziej dokładne informacje. |
Serwery wirtualne
Uwaga: Pamiętaj iż najpierw musisz mieć skonfigurowany odpowiednio serwer DNS aby móc korzystać z serwerów wirtualnych w Apachu!
Serwery wirtualne mogą być definiowane na podstawie adresu
Przykład konfiguracji:
################# IP-based Virtual Hosts <VirtualHost 192.168.2.100> User jmdault Group jmdault DocumentRoot /home/jmdault/public_html ServerName test2.com Setenv VLOG /home/jmdault/logs ErrorLogs /home/jmdault/test2-error_log RewriteEngine On RewriteOptions inherit </VirtualHost>
Serwery wirtualne mogą być także definiowane po nazwie. Do pliku konfiguracyjnego dodajemy dyrektywę NameVirtualHost nazwa.serwera.pl np: NameVirtualHost www.podrecznik.ziutus.com.pl. Następnie definiujemy adres administratora www (ServerAdmin adres_email), położenie dokumentu na serwerze (DocumentRoot sciezka_dostepu) oraz inne parametry (jak np. ścieżka do dzienników zdarzeń).
Przykład konfiguracji:
################# Named VirtualHosts NameVirtualHost 111.222.33.44 <VirtualHost 111.222.33.44> ServerName www.domain.tld ServerPath /domain DocumentRoot /web/domain </VirtualHost>
Ciekawe moduły
- apache2-mod_auth_pgsql – umożliwia autoryzację z użyciem bazy danych PostgreSQL
- apache2-mod_auth_mysql – umożliwia autoryzację z użyciem bazy danych MySQL
- apache2-mod_auth_radius –
- apache2-mod_auth_remote
- apache2-mod_auth_shadow – umożliwia autoryzację z użyciem systemowej bazy danych
- apache2-mod_dav
- apache2-mod_layout
- apache2-mod_ldap – umożliwia autoryzację z użyciem protokołu ldap
Programy pomocnicze dla Apache’a
Weablizer
Ciekawym programem współpracującym z Apachem jest Webalizer. Generuje on na podstawie logów informacje o odwiedzalności danego serwisu. Podobne programy to analog, lire.
awstats
Program generuje bardzo ładne statystyki, znacznie bardziej czytelne i ciekawsze niż Webalizer.
apachetop
Program apachetop monitoruje logi serwera i na ich podstawie generuje z wykorzystaniem biblioteki curses informacje o pracy serwera WWW w sposób podobny do polecenia top.
Strona projektu http://freshmeat.net/projects/apachetop/
ab – statystyki wydajności serwera
Program ab wchodzący w skład serwera Apache pozwala badać wydajność serwera.
[root@localhost security]# ab -n 100 127.0.0.1:80/ This is ApacheBench, Version 2.0.40-dev <$Revision: 1.121 $> apache-2.0 Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/ Benchmarking 127.0.0.1 (be patient).....done Server Software: Apache-AdvancedExtranetServer/2.0.44 Server Hostname: 127.0.0.1 Server Port: 80 Document Path: / Document Length: 7061 bytes Concurrency Level: 1 Time taken for tests: 1.878469 seconds Complete requests: 100 Failed requests: 0 Write errors: 0 Total transferred: 736700 bytes HTML transferred: 706100 bytes Requests per second: 53.23 [#/sec] (mean) Time per request: 18.785 [ms] (mean) Time per request: 18.785 [ms] (mean, across all concurrent requests) Transfer rate: 382.76 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.3 0 2 Processing: 9 17 46.0 10 463 Waiting: 0 14 41.5 7 415 Total: 9 17 46.2 10 465 Percentage of the requests served within a certain time (ms) 50% 10 66% 10 75% 12 80% 13 90% 16 95% 43 98% 66 99% 465 100% 465 (longest request) [root@localhost security]#