Nastavení serveru Apache na MacOS

Apache je open-source webový/HTTP server, který je distribuovaný zdarma a pomocí kterého můžeme spouštět naše webové stránky a aplikace. Základní instalaci Apache, PHP a MySQL jsem popsal v článku: Instalace PHP na Mac OS X (Mountain Lion).

Tento článek se bude věnovat pokročilé konfiguraci serveru Apache, konkrétně umístení konfiguračních souborů, ovládání serveru přes terminál a nastavení VirtualHosts.

Základní ovládání serveru

Server ovládáme z terminálu pomocí příkazu apachectl. Některé příkazy je potřeba spouštět s root právy (např. sudo apachectl restart). Základní příkazy:

apachectl -v // vypíše verzi serveru (stejně tak httpd -v)
apachectl -V // vypíše verzi včetně nastavení kompilace
apachectl -L // seznam dostupných konfiguračních direktiv které pak používáme v konfiguračním souboru
apachectl start // spustí server
apachectl stop // zastaví server
apachectl restart // restart serveru
apachectl -D DUMP_VHOSTS // vypíše nastavení virtuální servery
apachectl -S // spustí kontrolu syntaxe konfiguračního souboru a vypíše nastavení VirtualHosts

Hlavně přepínače -D a -S se nám budou hodit pro následovnou konfiguraci virtuálních serverů.

Konfigurační soubory serveru

Konfigurační soubor serveru zjistíme příkazem:

apachectl -V | grep SERVER_CONFIG_FILE

Většinou je ale umístěn v souboru:

/etc/apache2/httpd.conf

Aby se nám správně směřovali požadavky na lokální server, je dobré také znát soubor:

/private/etc/hosts

Kde je potřeba mít nastavené alias pro localhost na lokální adresu:

127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost
fe80::1%lo0     localhost

V konfiguračním souboru httpd.conf je kompletní nastavení serveru včetně všech modulů kterým rozšiřujeme funkce serveru např PHP, SSL, MemCache atd.

Konfigurace VirtualHosts

Virtuální servery se nám hodí pro oddělený běh naší webové aplikace, tak aby odpovídal co nejvíce produkčnímu prostředí, včetně samostatných nastavení parametrů serveru pro daný projekt. Také nemusíme z URL odstraňovat vnořený adresář /localhost/Nase-stranky/, jako při běhu bez VirtualHosts. VirtualHosts se konfigurují v základním konfiguračním souboru httpd.conf většinou úplně na konci souboru.

Základem je uvedení direktivy, která koresponduje s řádkem Listen 80 (číslo portu, na kterém server bude poslouchat)

NameVirtualHost *:80

Dále pak konfigurujeme konkrétní virtuální servery:

<VirtualHost *:80>
    ServerName www.nase-stranky.cz.local
    DocumentRoot "/Users/VojtaSvoboda/Www/nase-stranky.cz/www/"
    LimitInternalRecursion 100
    <directory "/Users/VojtaSvoboda/Www">
        AllowOverride all
        Order Deny,Allow
        Deny from all
        Allow from localhost
    </directory>
</VirtualHost>

Pojmenování je pak čistě na vás. Já to mám nastavené tak, že do prohlížeče zadávám adresu www.nase-stranky.cz.local (což koresponduje s produkční adresou www.nase-stranky.cz). Tato lokální adresa pak směřuje přímo do adresáře Www/nase-stranky.cz/www/ na mém disku. Je to vhodné především když máte více verzí projektu - www, beta, dev atd. Stejně tak lze nastavit VirtualHost pro beta.nase-stranky.cz.local směřující do adresáře beta.

Pro konkrétní VirtualHost pak můžeme i nastavit oddělený error log pomocí příkazů které umístíme hned pod ServerName:

ErrorLog "/private/var/log/apache2/nase-stranky.local-error_log"
CustomLog "/private/var/log/apache2/nase-stranky.local-access_log" common

V souboru hosts pak musíme nastavit směřování tohoto požadavku na lokální server:

127.0.0.1 www.nase-stranky.cz.local

Pokud se nám nechce nastavovat VirtualHosts pro každý projekt a dodržujeme pořád stejnou strukturu, můžeme si nastavit VirtualHost obecně:

<VirtualHost _default_:80>
    ServerName symfony
    VirtualDocumentRoot "/Users/VojtaSvoboda/Www/%-3.0.%-2/%-4.0/web"
    LimitInternalRecursion 20
</VirtualHost>

Server se pak snaží najít na disku složku dle daného vzoru a pokud najde, tak na daný adresář nasměruje požadavek z prohlížeče.

Pro http://www.nase-stranky.cz.local/cokoli tak bude hledat adresář /User/VojtaSvoboda/nase-stranky.cz/www/web (s tím, že ‘/web’ je veřejný adresář vašeho projektu - může to být klidně /document_root (pro Nette), /web (pro Symfony), www, nebo nic).

Pro každou změnu konfiguračního souboru je potřeba restartovat server pomocí

apachectl restart

Řešení problémů s konfigurací

Pokud se něco nedaří, nejdříve se podíváme do souboru httpd.conf na řádek začínající ErrorLog, kde je cesta k chybovému logu:

/private/var/log/apache2/error_log

Zde se můžeme podívat na konec souboru a pokusit se odhalit nějakou chybu.

Dále nám může pomoct příkaz

apachectl -S

Který spustí kontrolu syntaxe konfiguračního souboru a rovněž vypíše nastavení VirtualHosts.

Také je dobré v httpd.conf mrknout na řádky které začínají Include - můžou se nám načítat nějaké externí soubory, které nám třeba aktuální konfigurací rozbíjejí.

Pokud by mohl být problém ve směrování, je dobré vymazat DNS cache pomocí:

dscacheutil -flushcache