Apache 2.0.x

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:

  1. Main Configuration Section
  2. Dynamic Shared Object (DSO) Support
  3. Global Configuration
  4. IP Address/Port and Proxied configuration section
  5. Log configuration Section
  6. Virtual Hosts
  7. 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]#

Dodaj komentarz