apache + tomcat + name based virtualhost

Hali,

egy -számomra- eléggé összetett problémába futottam:

a server1.hu-n fut egy apache, megfelelően beállított DocumentRoot-tal, és kiszolgálja a /index.html-t.

Fut rajta egy tomcat is, és az apache-nak meg van mondva JkMount-tal, hogy a http://server1.hu/servlet1-re jövő kéréseket a tomcatnek továbbítsa.
(JkMount /servlet1* worker1)

Eddig OK, servlet lefut, tomcat válaszol.Le van foglalva a server2.hu gépnév is, és ez a név ugyanarra az IP-re mutat, mint a server1.hu.

A feladat, hogy ha a server2.hu-ra jön egy kérés (http://server2.hu/), akkor automatikusan a /servlet1 szolgálja ki, tehát hogy oda továbbítódjon a kérelem. A tomcat-nek.

Addig eljutottam, hogy az apache ki van okítva name based virtualhost-tal, hogy egy másik DocumentRoot-ot használjon a második gépnév esetén, de mégis mit írjak be DocumentRootnak, ha egyszer az egy ilyen tomcat által kiszolgált servlet-izé? Soha nem is létezett olyan DocumentRoot, hogy servlet1, mert ezt mindig is a tomcat kezelte le a JkMount hatására.

Hozzászólások

nem kell documentroot, hiszen a kérés átkerül a Tomcat-hez a 8180 vagy 8080 -as portra!

httpd.conf-ba létrehozod a vhostot +jkmount, ahogy írtad és megcsinálod a tomcatnek is a server.xml-ben a vhostot...

"Addig eljutottam, hogy az apache ki van okítva name based virtualhost-tal, hogy egy másik DocumentRoot-ot használjon a második gépnév esetén, de mégis mit írjak be DocumentRootnak, ha egyszer az egy ilyen tomcat által kiszolgált servlet-izé? Soha nem is létezett olyan DocumentRoot, hogy servlet1, mert ezt mindig is a tomcat kezelte le a JkMount hatására." - ezt legyél szíves fogalmazd át, mert nem bírom kibogozni, hogy mit is akarsz kérdezni!? Az a baj, hogy nem tudod hogy miként kell a tomcatben VHostokat létrehozni, vagy mi az izé?

Bocs az idétlen fogalmazásért.

A kérdésem az, hogy hogyan lehet az apache-ot úgy beállítani, hogy egy *bizonyos* hostnévre (server2.hu) jövő requestet a tomcatnek továbbítson, méghozzá úgy, hogy a tomcat azt is tudja, hogy melyik szervlet kell hogy kiszolgálja a kérést.

Tehát most így működik:

server1.hu => apache válaszol az index.html-lel
server1.hu/servlet1 => tomcat válaszol a megfelelő servlet futtatásával

server2.hu => apache válaszol az index.html-lel
server2.hu/servlet1 => tomcat válaszol a megfelelő servlet futtatásával

Amit szeretnék, hogy történjen:

server1.hu => apache válaszol az index.html-lel
server1.hu/servlet1 => tomcat válaszol a megfelelő servlet futtatásával

server2.hu => tomcat válaszol a server1 futtatásával
server2.hu/servlet1 => erre meg azt csinál, amit akar, felőlem 404 is jöhet.

A jó hír, hogy HTTP-re rememkül működik ez a mod_rewrite.
Viszont ugyanebben a felállásban SSL-lel is kellene hogy működjön (a 8443-as porton kresztül).
És hát úgy már nem és semmit a rewrite-om.

Ezzel a konfigurációval megy a sima http átirányítás:


RewriteEngine   on
RewriteCond    %{HTTP_HOST}    ^.*server2\.hu  [NC]
RewriteCond    %{REQUEST_URI}  !^/servlet1
RewriteRule    ^/(.*)$         /servlet1/                [R]

Viszont ez nem irányítja át, ha https-sel nyitom meg az oldalt. (Talán azért, mert a titkosított HTTP header-be nem lát bele?) Van erre valami workaround? Aggasztóan a neten sem találtam semi használhatót.

<Alias>server2.hu</Alias>

Ez még kelleni fog a Tomcat server.xml-jébe.

Rendben, és a httpd.conf-ban hogyan kell ezt a "name based virtual host" beállítást megejteni?

Azt tudom, hogy hogy kell olyan bejegyzést tenni, amitől egy adott host-nevet elkülönítve kezel. De abba a vhost definícióba mi kerüljön még bele? Mit csináljon az apache, ha illeszkedik a kérésben szereplő host-névre az én vhost definicióm (a server2.hu)? Hogy lehetne pl megmondani, hogy kezelje úgy, mintha server1.hu/servlet1 lett volna az a lekérés?

Lehet, h még nem értem teljesen a problémát, de ha viszont az kell, hogy a server2.hu/servlet1-re passzolja tovább a server1.hu/servlet1-nek kell lefutnia, akkor szintén az a felállás, mint amit előbb írtam, azaz csak a server1-nél vedd fel a JkMount-ot, a server2.hu esetében pedig RedirectPermanent vagy mod_rewrite. A másik lehetőség, amit feljebb írtak, hogy alias-ként a Tomcat konfigjába berakod a server2-t a server1 contexthez.

Szia!

Úgy tudom, hogy a jk_mount nem egy mai valami. Én sosem használtam, viszont itt van egy, a proxy_ajp httpd modullal készült konfiguráció. Itt értelemszerűen a tomcat ugyanazon a szerveren van, mint a httpd.

Ez a

httpd.conf

-ba kell:


#
# Use name-based virtual hosting. - Ez elől a sor elől elvileg csak ki kell
# szedni a komment-jelet.
#
NameVirtualHost *:80

# Ez az abc.com és a www.abc.com kéréseit adja oda a tomcatnek.
# Itt még nem baj, hogy nincs megadva, hogy melyik tomcates
# webalkalmazás kell, hogy kiszolgálja a kérést, mert az az adat a 
# tomcat server.xml-jébe kell, ahogy később is látni fogod.

<VirtualHost *:80>
     ServerName abc.com
     ServerAlias www.abc.com
     ProxyPass / ajp://localhost:8009/
     ProxyPassReverse / ajp://localhost:8009/
</VirtualHost>

# ilyet is lehet csinálni a statikus adatoknak, hogy a .war fájljaidat 
# ne kelljen képekkel/egyebekkel telepakolni

<VirtualHost *:80>
     ServerName data.abc.com
     DocumentRoot /var/www/html/abc.com
</VirtualHost>

# ==============
# Másik host, ugyanilyen a konfigurációval

<VirtualHost *:80>
     ServerName abc2.hu
     ServerAlias www.abc2.hu
     ProxyPass / ajp://localhost:8009/
     ProxyPassReverse / ajp://localhost:8009/
</VirtualHost>

# itt is külön host a statikus adatoknak

<VirtualHost *:80>
     ServerName data.abc2.hu
     DocumentRoot /var/www/html/abc2.hu
</VirtualHost>

# Most jön a durva trükk: ez a konfiguráció a webalkalmazás 
# statikus adatait választja szét a dinamikusaktól, elérési út alapján.
# Így nem kell létrehozni külön aldomaint a statikus adatoknak, mint az
# előbbi példákban: a webalkalmazásból relatív linkekkel lehet hivatkozni
# rájuk.
# Itt konkrétan az img alkönyvtárat a httpd szolgálja ki, minden mást 
# pedig a tomcat.

<VirtualHost *:80>
    ServerName abc3.hu
    ServerAlias www.abc3.hu
    DocumentRoot /var/www/html/abc3.hu
    ProxyPass /img !
    ProxyPass / ajp://localhost:8009/
    ProxyPassReverse / ajp://localhost:8009/
</VirtualHost>

# Ez a szerver az előbbiektől eltérő, IP-alapú "beállítása", ezalapján
# kerülnek a kérések a szerverhez, ha csak IP-címmel hivatkoznak rá.

<VirtualHost *:80>
    ServerName 123.234.312.41
    ProxyPass / ajp://localhost:8009/
    ProxyPassReverse / ajp://localhost:8009/
</VirtualHost>

-------------------------------------------------------------------------

Ezek után a /var/lib/tomcat5 könyvtárba kell csinálnod egy vhost_webapps könyvtárat: ide fognak kerülni a .war fájlok.

Most jönnek a vonatkozó részletek a tomcat server.xml-jéből, amiket az Engine ágba kell tenni:



      <Host
          appBase="vhost_webapps/abc.com"
          name="abc.com">
        <Alias>www.abc.com</Alias>
      </Host>
      <Host
          appBase="vhost_webapps/abc2.hu"
          name="abc2.hu">
        <Alias>www.abc2.hu</Alias>
      </Host>
      <Host
          appBase="vhost_webapps/abc3.hu"
          name="abc3.hu">
        <Alias>www.abc3.hu</Alias>
      </Host>

Ezek után a webalkalmazások feltöltése annyi, hogy a .war fájlokat ROOT.war-rá átnevezve és a vhost_webapps megfelelő alkönyvtárába berakva kiszolgálják az egyes domaineket anélkül, hogy mindenféle abc.com/webalknev formájú url-eket kellene beírni.

Én ezt még annyival fűszereztem meg, hogy a szerveren lévő home könyvtáramban lévő, átnevezetlen .war fájlokra mutatnak a vhost_webapps/abc.com stb. könyvtárakban létrehozott ROOT.xml nevű szimbolikus linkek, így amikor felmegyek SFTP-vel a szerverrel, egy szimpla másolással meg tudom oldani a feltöltést.

Ezzel a megoldással egyébként használható a tomcat adminisztrációs felülete, (/manager/html), hogyha a /etc/tomcat5/Catalina/ egyes domaineknek megfelelő könyvtárába (a konfiguráció elvégzése és a webalkalmazás feltöltése után) a /etc/tomcat5/Catalina/localhost/manager.xml-t bemásolod.

Ezzel az ssh-n feltöltős megoldással az a baj, hogy elvész az összes felhasználói munkamenet. Amire még nem találtam megoldást, hogy hogy lehet a webalkalmazásokat úgy frissíteni/újra feltölteni, hogy ez ne történjen meg. Valaki, ötlet?

Más kérdés: mi az a proxypassreverse? A neten összevadászott példák alapján raktam be, de a doksit már lusta voltam elolvasni hozzá.

Üdv
Chreex

Üdv

szenvedek az apache mode_proxy -val.

apache: http://server:80
tomcat: http://server:8080

ha beütöm a böngészőbe hogy http://server:80
akkor a http://server:8080 porton lévő tomcat jöjjön be, de nem Redirect mindenképpen apache2-n keresztül

ServerAdmin postmaster@server
ServerName server
#ProxyPass / http://localhost:8080
#ProxyRemote http://server/ http://server:8080
ProxyRequests Off
ProxyPass / ajp://localhost:8080
ProxyPassReverse / ajp://localhost:8080

WTF miért nem megy?
Forbidden

You don't have permission to access / on this server.

Ugyanezt próbáltam httpd.conf-ban is
Apache2 + tomcat6
mode_proxy
mode_proxy_ajp
mode_proxy_http
betöltve.

apache2.conf
végére beraktam ezt

ProxyPass / http://server:8080
ProxyPassReverse / http://server:8080
[IfModule mod_proxy.c]
ProxyRequests Off
[Proxy *]
Order allow,deny
Allow from all
[/Proxy]

kacsacsőröket átraktam [] -ra mert nem jeleníti meg.

így müxik, ha esetleg valakinek nem működne, ezzel menni fog. (vagy nem :D)

Azért nem megy, mert feltehetőleg mellőzted az alábbi két - egyébként igen hasznos - dokumentáció releváns fejezeteinek elolvasását.

http://httpd.apache.org/docs/2.2/
http://tomcat.apache.org/tomcat-5.5-doc/index.html

Az a helyzet, hogy akárhogyis nézzük, ezek kötelező olvasmányok. ( Ugyanúgy mint pl. a Rómeó és Júliát is kötelező volt elolvasni középsuliban - amit ha megtettél, akkor tudtad az olyan jellegű dolgozatkérdésekre a választ, hogy pl. hogyan jutott be Rómeó Júlia szobájába - azonkívül hogy nehezen...

ServerName www.DOMAINNAME.hu
ServerAlias DOMAINNAME.hu
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
ServerAdmin error@DOMAINNAME.hu
ErrorLog "/var/log/_log"

Nalam igy mukodik a apache tomcat ;)

Gondoltam nem indítok új szálat, problémám hasonló. Szeretnék apache név alapú virtuális hoszthoz ajp proxy-t beállítani. Az apache-ban a következőket állítottam be:

ProxyPass / ajp://192.168.122.102:8009/
ProxyPassReverse / ajp://192.168.122.102:8009/

Tomcatbe deployoltam az alkalmazást -- webapps/foo
Majd a Tomcat-ben kezelem a DNS-eket (server.xml)


<Host name="foo.hu" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Alias>foo.hu</Alias>
</Host>

Az alkalmazás content.xml-jében pedig a következő szerepel:

<Context path="" docBase="/usr/share/tomcat/webapps/foo"
debug="5" reloadable="true" crossContext="true">

Az a gondom, hogy a ha megnyitom a foo.hu címet, akkor a Tomcat root jön be az alkalmazás root helyett. Mit rontottam el?