Správa linuxového serveru: Úvod do konfigurace Apache

V tomto dílu bude probrán základ konfigurace Apache v prostředí Debianu, který má ke konfiguraci Apache specifický přístup. V druhé části článku budou probrány virtuální weby (virtual hosts), tedy možnosti provozu více různých webových prezentací na jednom webovém serveru.

Úvod

Jelikož konfigurace Apache má bohaté možnosti a je velmi komplexní, mají různé distribuce různý přístup k jeho konfiguraci. V Debianu je konfigurace Apache rozdělena do modulární struktury, která se nachází v/etc/apache2. Výhodou takto rozdělené konfigurace je relativně jednoduchá obsluha i velmi komplikovaného nastavení, neb místo hledání v jednom sáhodlouhém konfiguračním souboru sáhnete po mnohem menším, který obsahuje nastavení relevantní pro konkrétní „virtual host“ nebo modul.

Hlavním konfiguračním souborem je apache2.conf. Pokud budete potřebovat upravit nastavení uložená v tomto souboru, popřípadě budete chtít nastavení webového serveru něčím doplnit, je lepší za tímto účelem použít httpd.conf, který je k tomu určený. Jednak tím získáte přehled o změnách, které jste provedli vůči distribuční konfiguraci, a jednak se vyhnete problémům při aktualizaci, kdy se může distribuční konfigurace změnit, a vy pak budete muset rozdíly v distribuční konfiguraci zpracovat a zahrnout ručně.

Ke konfiguraci sítě, respektive IP adres a portů, kde bude Apache naslouchat, je určen soubor ports.conf(podrobnější popis viz níže). Následuje několik adresářů s řadou konfiguračních souborů a symbolických odkazů:

conf.d

Tento adresář je určen k umístění dodatečných konfiguračních souborů. Typicky zde naleznete různá doplňující nastavení, tématicky rozložená do jednotlivých souborů. Pokud máte nainstalovaný phpmyadmin z distribučních repozitářů, naleznete zde symbolický odkaz phpmyadmin.conf ukazující na konfigurační soubor, který upraví nastavení Apache tak, abyste mohli k webové aplikaci phpmyadmin přistupovat prostřednictvím aliasu /phpmyadmin. Repozitáře Debianu obsahují řadu webových aplikací, z nichž mnohé jsou konfigurovány pro Apache tímto způsobem. Pokud byste si nainstalovali třeba Drupal (balíček drupal6 v Debianu Lenny), naleznete tu také příslušný symbolický odkaz vedoucí ke konfiguračnímu souboru s nastavením Apache pro Drupal.

mods-available a mods-enabled

Pomocí modulů můžete měnit funkčnost webového serveru, respektive přidávat a odebírat různé vlastnosti. Součástí distribuce Apache je sada základních, nejčastěji používaných modulů. V repozitářích Debianu, ale i mnoha jiných distribucí, naleznete řadu doplňkových modulů. Pokud jste se drželi návodu na instalaci LAMPo dva díly zpět, nainstalovali jste jeden z doplňkových modulů v balíčku libapache2-mod-php5, který zprostředkovává použití PHP interpretu ve webových stránkách.

Moduly je třeba zavést, popřípadě ještě nastavit. Konfigurační soubory pro dostupné moduly naleznete v adresáři mods-available (hledejte příslušný soubor s příponou .conf). Soubory s příponou .load zajišťují pouze natažení modulu.

To, co je v adresáři mods-available, však Apache při svém spuštění ignoruje - bere v úvahu pouze to, co je k dispozici v adresáři mods-enabled. Tento adresář obsahuje obvykle pouze symbolické odkazy vedoucí ke konfiguračním souborům modulů v mods-available, které se mají zavést. Díky tomuto mechanismu se natáhnou pouze ty moduly, které chcete. Abyste nemuseli příslušné symbolické odkazy vytvářet ručně, má Debian k dispozici dva nástroje na práci s moduly - a2enmod („zapíná“ moduly) a a2dismod („vypíná“ moduly). Oba nástroje lze použít jak v příkazovém režimu, kde parametr tvoří jméno modulu, který má být aktivován či deaktivován, tak v interaktivním režimu (k tomu postačí daný nástroj spustit bez parametru).

sites-available a sites-enabled

Podobný princip konfigurace a správy připravili správci Debianu i pro práci s virtuálními weby (virtual host). Jejich konfigurační soubory jsou umístěny v sites-available, přičemž Apache tento adresář v úvahu nebere, naopak bere v úvahu vše, co je v adresáři sites-enabled. Jednotlivé virtuální weby lze tedy snadno „vypínat“ a „zapínat“, podobně jako moduly, a to buď ručním vytvořením příslušného symbolického odkazu, nebo použitím nástrojů a2ensite a a2dissite. S těmito nástroji se pracuje úplně stejně jako s těmi určenými pro práci s moduly.

Základy konfigurace Apache

Po nainstalování Apache jsou aktivní některé základní moduly a jeden virtuální web (sites-available/default). Co je vlastně virtuální web (virtual host)? Virtuální web je koncept, který slouží k provozu více webů (či domén) na jednom webovém serveru. Je možné provozovat různé weby na různých IP adresách či mnoho domén na jedné nebo více IP adresách (popř. ještě i různých portech), a to vše v rámci jednoho běžícího webového serveru. Jednotlivé weby či domény je však třeba od sebe oddělit, aby Apache poznal, který HTTP požadavek má směrovat na který virtuální web. A právě k tomu slouží v případě Apache direktiva VirtualHost (více viz níže).

Konfigurace sítě

Základem práce webového serveru je práce se sítí. Naslouchání na určité IP adrese a portu se nastavuje prostřednictvím volby Listen v souboru ports.conf, tedy např:

Listen 80

Tato volba zapříčiní, že Apache bude poslouchat na portu 80 všech IP adres, které má server k dispozici. Pokud chcete omezit Apache na jednotlivé IP adresy či porty, můžete to provést takto:

Listen 1.2.3.4:80
Listen [2001:db8:a1:b2:c3:d4:e5:f6]:80

Z příkladu výše je patrné jednak to, že direktiv Listen je možno použít více, a jednak to, že IPv6 adresy je třeba oddělit hranatými závorkami.

Pár slov o virtuálních webech a HTTPS

Virtuální weby mohou být od sebe odděleny dvěma způsoby, buď na základě jména (name-based), nebo na základě IP adresy (IP-based). Můžete tedy mít více různých webů na různých IP adresách, nebo jednu či více domén směřující na jednu nebo více IP adres. Problém nastane v případě protokolu HTTPS, kde jmenné rozlišování z principu nefunguje. Je tomu tak proto, že se nejprve vytváří SSL spojení, a teprve pak se v rámci již vytvořeného SSL spojení přenáší HTTP požadavek obsahující doménové jméno. To znamená, že webový server nemůže zjistit příslušnost k virtuálnímu webu podle jména. Díky tomu je na jedné IP adrese možné provozovat pouze jediný HTTPS virtuální web. Na jednom HTTPS virtuálním webu sice je možné jistým způsobem provozovat více domén (během dalších dílů bude osvětleno), ale SSL certifikát lze použít pouze jediný.

Aby Apache mohl rozlišovat virtuální weby podle jména, musí vědět, na kterých IP adresách a portech má podle jména vyhledávat. K tomu slouží direktiva NameVirtualHost, jejímž parametrem je IP adresa, popřípadě IP adresa doplněná číslem portu (oddělovačem je dvojtečka). Výchozí nastavení v Debianu naleznete v ports.conf v této podobě:

NameVirtualHost *:80

Toto nastavení zapříčiní, že na všech IP adresách dostupných webovému serveru bude aktivováno hledání virtuálních webů podle jména.

Konfigurace virtuálních webů

Definice virtuálního webu se řídí direktivou VirtualHost, která se používá úplně stejně jako HTML tag. Otevírací tag má parametr v podobě IP adresy a portu, kde bude virtuální web k dispozici. IP adres může být více (v takovém případě jdou za sebou, odděleny mezerou). Hvězdička na místě IP adresy značí, že daný virtuální web bude k dispozici na všech IP adresách, na kterých Apache naslouchá. Příkladem definice virtuálního webu může být toto:

<VirtualHost *:80>
ServerName www.domena1.tld
ServerAlias domena1.tld *.domena1.tld
DocumentRoot /var/www/domena1
</VirtualHost>

Uvnitř direktivy VirtualHost je dobré specifikovat příslušné doménové jméno v direktivě ServerName.ServerAlias obsahuje všechna alternativní doménová jména společná pro daný virtuální web. V tomto případě se ke stejnému webu dostanete, i pokud zadáte jen „domena1.tld“ bez „www“, nebo zadáte jinou doménu třetího řádu, např. „test.domena1.tld“.

Umístění kořenu webové prezentace daného virtuálního webu je lze zadat jako parametr direktivyDocumentRoot. Pokud ji nezadáte, použije se výchozí, definovaná mimo všechny VirtualHost direktivy (čili např. v httpd.conf). Tato „dědičnost“ funguje i v případě dalších direktiv. V případě, že není hodnota definovaná nikde, použije se hodnota výchozí.

V Debianu by definice virtuálního webu měla být umístěna do samostatného, vhodně pojmenovaného souboru v /etc/apache2/sites-available. Daný virtuální web pak povolíte nástrojem a2ensite a restartem Apache uvedete do provozu.

Další virtuální web byste pak přidali vytvořením dalšího souboru v sites-available s obdobným obsahem, např. takto:

<VirtualHost *:80>
ServerName www.domena2.tld
ServerAlias domena2.tld *.domena2.tld
DocumentRoot /var/www/domena2
</VirtualHost>

Poté byste použili obdobný postup pro „aktivaci“ daného webu (nástroj a2ensite). Tímto postupem byste získali dva virtuální weby, jeden s doménou domena1.tld a vlastním obsahem webu dostupným ve/var/www/domena1, druhý s doménou domena2.tld a obsahem webu v /var/www/domena2. Oba by mohly běžet v rámci jedné instance Apache třeba na jedné veřejné IP adrese.

Plně kvalifikované doménové jméno

Jeden z nejčastějších problémů řešeným v souvislosti s konfigurací Apache je varování, které říká, že Apache nemohl spolehlivě zjistit plně kvalifikované doménové jméno serveru. Tato hláška může vypadat třeba takto:

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

Aby mohl Apache správně fungovat, potřebuje o každém virtuálním webu znát dvě věci - jméno serveru a alespoň jednu jemu příslušnou IP adresu. Kromě toho ovšem Apache potřebuje znát IP adresu a doménové jméno samotného serveru. Toto hledá v globální definici ServerName (tj. definici mimo všechny direktivyVirtualHost, v Debianu nejspíše v /etc/apache2/httpd.conf). Pokud ji nenajde, pokusí se použít hostnamedaného serveru (v Debianu se hostname nastavuje v /etc/hostname). To se nejspíše povede, ale ne vždy je jako hostname použito plně kvalifikované doménové jméno (FQDN), a to je podstata problému. V řadě případů je jako hostname použito jen obyčejné slovo, popřípadě „localhost“, a to FQDN není. V zásadě - FQDN musí obsahovat alespoň jednu tečku (např. example.org). Nejčastěji se za tímto účelem upravuje/etc/hosts, kde se přidává příslušný záznam, který může vypadat třeba takto:

1.2.3.4 example.org

Pokud ve jmenné části specifikujete více jmen, dejte si pozor, ať je FQDN na prvním místě, tj. následující příklad je špatně:

1.2.3.4 example example.org

Správně by bylo:

1.2.3.4 example.org example

Pár slov na závěr

Virtuální weby umožňují na jednom webovém serveru provozovat více různých webů rozlišených podle jména nebo IP adresy, nejčastěji pak podle doménového jména. Konkrétní postup nastavení a oddělení jednotlivých webových prezentací podle jména byl popsán v článku. Každý z virtuálních webů může mít specifikovány různé volby a možnosti, které jsou zapsané uvnitř direktivy VirtualHost. Některé z těchto voleb a možností, stejně jako některé z modulů webového serveru Apache, budou probrány v příštím díle.