Apache a mod_proxy pro více domén na jedné veřejné IP

Apache a mod_proxy pro více domén na jedné veřejné IP

O co se v dnešním návodu pokusím? Vyřešit zdánlivě jednoduchý problém :). Mám více domén a rád bych je provozoval na vlastních serverech, ideálně na jedné veřejné IP. Jak na to? Chvilku mi to trvalo a oním magickým termínem je mod_proxy ve webovém serveru Apache. Tak, jdeme na to. Předem bych ale rád uvedl že je to můj první návod, když píši tyto řádky – nemám nic otestované. Takže během psání článku se učím a možná můj postup nebude nejideálnější a nejbezpečnější 🙂 proto VŠE budu testovat neveřejně a pomocí virtuálních strojů. Jediné co mám k dispozici je výkonný workstation, virtual box a přístup do nastavení DNS serveru. Tak ale teď už jdeme na to.

Jako první si utvoříme vlastní síť. K tomu použiji Oracle VM VirtualBox (v.4.2.12).

vPC1:

Název: Mainframe
OS: Windows XP x86 SP3 (volím XP protože mám volnou virtuální licenci, nasazení Windows Server 2008/2003/2012 bude podobné, nebudeme modifikovat systém ale Apache)
RAM: 512MB
HDD: VHD(kvůli univerzálnosti) 20GB, dynamický
IP: 192.168.1.200
Režim síťové karty: Síťový most (Bridge s promiskuitou – vše)
DNS: mainframe.acme.lan (zde můžete uvést veřejné DNS jméno, konfigurace bude stejná)

vPC2:

Název: Server1
OS: Ubuntu Linux
RAM: 512MB
HDD: VHD 10GB, dynamicky
IP: 192.168.1.201
Režim síťové karty: Síťový most (Bridge s promiskuitou – vše)
DNS: server1.acme.lan (zde můžete uvést veřejné DNS jméno, konfigurace bude stejná)

vPC3: (klon vPC2)

Název: Server2
OS: Ubuntu Linux
RAM: 512MB
HDD: VHD 10GB, dynamicky
IP: 192.168.1.202
Režim síťové karty: Síťový most (Bridge s promiskuitou – vše)
DNS: server2.acme.lan (zde můžete uvést veřejné DNS jméno, konfigurace bude stejná)

Proč jsem volil tyto parametry?
Síť je bez podpory IPv6, nebudu tedy nic ohledně IPv6 nastavovat ani řešit.
VHD disk jsem volil pro jeho univerzálnost, jde bez větších potíží přenášet na jiné virtualizační platformy.
Velikost RAM jsem volil kvůli limitované RAM na mém workstation.
Proč DNS názvy firmy ACME? Vysvětlení je jednoduché a najdete ho zde: http://en.wikipedia.org/wiki/Acme_Corporation 🙂
Vše poběží na Intel Core i5 2400S (tedy 2,5GHz s 4 možnými thready), 8GB RAM DDRIII na Windows 7 x64 Professional

Co po vytvoření virtuálních strojů?

Spustil jsem instalaci vPC1 a vPC2. nainstaloval jsem OS, vše v základní konfiguraci a dle průvodce. Paradoxně nejvíce problémů bylo s instalací Linuxu, nakonec jsem pro něj dělal úplně novou virtuální mašinu (nevím proč to zlobilo).

Během instalace OS a klonování vPC2 jsem nastavil lokální DHCP na přidělování statických adres a do lokálního DNS serveru jsem zanesl záznamy o strojích. Překlady:

A : mainframe.acme.lan -> 192.168.1.200
A : server1.acme.lan -> 192.168.1.200
A : server2.acme.lan -> 192.168.1.200

Pro testovací účely funguje 192.168.1.200 jako veřejná IP, 201 a 202 jsou za „NAT“em.

Po instalaci vPC1 a 2 jsem začal stahovat do počítačů software. Rozhodl jsem se pro komplexní balíček XAMPP (u mne s jednalo o verzi 1.8.1 pro Windows, instalační balíček) který je k dispozici zdarma pro Windows i Linux, obsahuje Apache, PHP a MySQL (+ něco navíc).

Instalace pro Windows (zkráceně, na internetu je spousta návodů jak na to):

  1. Stáhnout správnou verzi
  2. Spustit instalátor (jako admin)
  3. Dle doporučení instalovat Visal C++ 08 Redist. (dle OS)
  4. Nainstalovat XAMPP, ideálně jen součásti které potřebujete (u mě to bylo Apache,MySQL,PHP,phpMyAdmin,Webalizer a Fake Sendmail)
  5. Instaluji do c:\xampp\
  6. Odmítám instalaci jakéhosi doplňku pro CMS
  7. Po instalaci zapínám CP a spouštím Apache a MySQL

Instalace je hotova. Nyní by jste měli vidět na url http://192.168.1.200 logo XAMPP.

Instalace pro Ubuntu Linux (opět, návody jsou na netu tak jen zkráceně):

  1. Stáhnout balíček
  2. Zapnout konzoli/terminál
  3. napsat „sudo tar xvfz xampp-linux-1.8.1.tar.gz -C /opt“ pro instalaci (Díky Lawkovi za radu se sudo)
  4. Instalace proběhne během několika minut

Instalace je hotova. Nyní by jste měli vidět na url http://192.168.1.201 logo XAMPP.

Nyní vypínám a klonuji stroj s Linuxem, nastavím jej jako Server2.

Po klonování a nastavení by mělo být vidět na http://192.168.1.202 logo XAMPP.

Server na obou strojích spouštím v terminálu příkazem „sudo /opt/lampp/lampp start“.

Shrnutí:

Na adresách 192.168.1.200, 201 202 se nám zobrazuje logo XAMPP (pokud jste provedli úpravy tak se zobrazí úpravy 🙂 )

Všechny stroje běží a jsou OK. server1 a server2 již v tomto stavu nechám a budu se věnovat jen a jen mainframe.acme.lan.

DNS:

Nyní nastavte router/firewall aby veškerou komunikaci z venčí na port 80 směroval na 192.168.1.200. U poskytovatele DNS pro domény si nasměrujte domény a subdomény na vaši veřejnou IP. Já to provedl pouze v rámci lokální sítě již výše. Pro přehlednost by ale záznamy měli vypadat takto:

A: subdomena.domena.cz -> 123.123.123.123 (vaše veřejná IP)
A: subdomena.domena2.cz -> 123.123.123.123 (vaše veřejná IP)
A: subdomena2.domena.cz -> 123.123.123.123 (vaše veřejná IP)

Po tomto kroku při vstupu na adresy se zobrazí pouze mainframe server (ten bude dělat naši proxy).

Nastavení proxy:

Na vPC1 / 192.168.1.200 / mainframe.acme.lan jděte do složky se serverem (c:\xampp\), dále složka „apache\conf\“ a otevřete soubor „httpd.conf“ v nějakém textovém editoru (klidně poznámkový blok).

Najděte řádek: LoadModule proxy_module modules/mod_proxy.so a zkontrolujte zda před řádkem není #. Pokud je, smažte ho.
Najděte řádek: LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so a zkontrolujte zda před řádkem není #. Pokud je, smažte ho.

Na konec souboru přidejte (své, upravené) údaje o směrování proxy.

Pokud si vystačíte s virtuální složkou tak příklad vypadá takto:

# Proxy – nastaveni
ProxyPass /server1 http://192.168.1.201
ProxyPassReverse /server1 http://192.168.1.201
ProxyPass /server2 http://192.168.1.202
ProxyPassReverse /server2 http://192.168.1.202

Po restartu Apache funguje:

http://192.168.1.200/server1/ -> zobrazí web z 192.168.1.201
http://192.168.1.200/server2/ -> zobrazí web z 192.168.1.202
http://123.123.123.123/server1/ -> zobrazí web z 192.168.1.201
http://123.123.123.123/server2/ -> zobrazí web z 192.168.1.202

Kompletní proxy baypass:

Opět v httpd.conf, nakonec souboru.

# Proxy – nastaveni
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://192.168.1.201
ProxyPassReverse / http://192.168.1.201
ServerName server1.acme.lan
ErrorLog logs/server1.acme.lan.log
CustomLog logs/server1.acme.lan.log common
</VirtualHost>

Po restartu Apache funguje:

http://server1.acme.lan -> zobrazí web z 192.168.1.201

Pokud to chcete mít veřejně, MUSÍTE mít nastavený DNS název u poskytovatele – ne lokálně jako já. Tedy asi takto:

# Proxy – nastaveni
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://192.168.1.201
ProxyPassReverse / http://192.168.1.201
ServerName subdomena.domena.cz
ErrorLog logs/subdomena.domena.cz.log
CustomLog logs/subdomena.domena.cz.log common
</VirtualHost>

Tak doufám že se Vám vše podařilo stejně jako mě. Pokud máte připomínky (doplnění článku) nebo otázky, pište do komentářů – budu se snažit vše vyřídit :).

POZOR:

Při zadání veřejné IP adresy se vždy dostanete na server který zprostředkovává proxy, proto jeho nastavení a zabezpečení věnujte také pozornost!

Doplnění:

Stejným způsobem můžete přidávat i aplikace které běží na jiných portech! Například aplikace která běží na Tomcat serveru (na jiném stroji) na portu 8080 se přidává takto:

# Proxy – nastaveni
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://192.168.1.1:8080/aplikace/
ProxyPassReverse / http://192.168.1.1:8080/aplikace/
ServerName aplikace.domena.cz
ErrorLog logs/aplikace.log
CustomLog logs/aplikace.log common
</VirtualHost>

One Response to Apache a mod_proxy pro více domén na jedné veřejné IP