Více domén pro Tomcat za Apachem

martin

Více domén pro Tomcat za Apachem
« kdy: 09. 05. 2014, 20:05:04 »
Ahoj,
na serveru mi bezi Tomcat (localhost:8080) a Apache HTTPD (all:80).
Vsechny aplikace jsou dostupne pres url http://tomcat.example.net/APPNAME. Ja ale pro nektere potrebuju vyhradit valstni domenu. Napr. http://tomcat.example.net/TEST chci mit na http://test.cz.

Zde je muj konfigurak Apache:
Kód: [Vybrat]
<VirtualHost *:80>
    ServerName tomcat.example.net
    DocumentRoot /var/www/tomcat.example.net

    ProxyRequests Off
    ProxyPreserveHost On
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>         
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>   

<VirtualHost *:80>
    ServerName test.cz
    DocumentRoot /var/www/tomcat.example.net

    ProxyRequests Off
    ProxyPreserveHost On
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>   
    ProxyPass / http://127.0.0.1:8080/test.cz/
    ProxyPassReverse / http://127.0.0.1:8080/test.cz/
</VirtualHost>

Pokud nyni k aplikaci pristoupim pres http://tomcat.example.net/TEST funguje to spravne, pokud ale pristoupim pres http://test.cz zobrazi se uvodni stranka, ale vsechny odkazy vedou na http://test.cz/TEST/cil_odkazu (takze se ani nenactou css, protoze maji spatny odkaz).
Proste je za lomitkem vzdy nazev app. V JSP vypisuji adresy pres:
Kód: [Vybrat]
<c:url value="/cil_odkazu" />
Co potrebuju: odkaz (a cela aplikace) http://tomcat.example.net/TEST/info musi byt dostupna na adrese http://test.cz/info a ne na  http://test.cz/TEST/info

Moje reseni z apache virtualhosty asi neni nejlepsi, nebo dostatecne. Pravdepodobne se jeste bude muset nejak nastavit tomcat. Jenom nevim jak.
« Poslední změna: 09. 05. 2014, 22:18:21 od Petr Krčmář »


martin

Re:Více domén pro Tomcat za Apachem
« Odpověď #1 kdy: 10. 05. 2014, 02:33:46 »
Zkusil jsem postupovat podle oficialniho tomcat7 navodu http://tomcat.apache.org/tomcat-7.0-doc/proxy-howto.html

V Apachi mam zapnuto mod_proxy. A takhle vypada muj virtuahlost:
Kód: [Vybrat]
<VirtualHost *:80>
    ServerName neco.nekde.cz
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>   
    ProxyPass /mojeApp http://localhost:8081/mojeApp
    ProxyPassReverse /mojeApp http://localhost:8081/mojeApp
</VirtualHost>

do nastaveni tomcatu /etc/tomcat7/server.xml jsem pridal:
Kód: [Vybrat]
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" URIEncoding="UTF-8"
              proxyName="neco.nekde.cz" proxyPort="80"/>

Kdyz nyni jdu na adresu http://neco.nekde.cz dostanu chybu 404, kterou vraci apache httpd, pokud zadam http://neco.nekde.cz/mojeApp, funguje to.
Ja ale chci mit aplikaci primo na http://neco.nekde.cz.

Pokud v definici virtualhostu uvedu:
Kód: [Vybrat]
    ProxyPass / http://localhost:8081/mojeApp
    ProxyPassReverse / http://localhost:8081/mojeApp

Pri pristupu na adresu http://neco.nekde.cz jsem automaticky presmerovan na http://neco.nekde.cz/mojeApp a dostanu chybu 404, kterou tentokrat vrati tomcat.

Kde delam porad chybu? :-(

Re:Více domén pro Tomcat za Apachem
« Odpověď #2 kdy: 10. 05. 2014, 08:20:50 »
Musíte tu aplikaci na Tomcatu nastavit tak, aby používala contextPath "/" a byla svázaná se zvolenou doménou. Pokud nemáte nějaký vážný důvod, proč před tím Tomcatem máte Apache, použijte samotný Tomcat a konfiguraci Apache pak nemusíte řešit.

Re:Více domén pro Tomcat za Apachem
« Odpověď #3 kdy: 10. 05. 2014, 10:12:29 »
Já to tedy téměř nepoužívám, ale logicky - název virtuálního hosta by neměl být
localhost, ale jméno domény (jak na straně Apache tak Tomcatu).

    ProxyPass / http://neco.nekde.cz:8081/

Jak by jinak ten Tomcat poznal, co má obsloužit za virtuál?

Zkusil jsem postupovat podle oficialniho tomcat7 navodu http://tomcat.apache.org/tomcat-7.0-doc/proxy-howto.html

V Apachi mam zapnuto mod_proxy. A takhle vypada muj virtuahlost:
Kód: [Vybrat]
<VirtualHost *:80>
    ServerName neco.nekde.cz
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>   
    ProxyPass /mojeApp http://localhost:8081/mojeApp
    ProxyPassReverse /mojeApp http://localhost:8081/mojeApp
</VirtualHost>

do nastaveni tomcatu /etc/tomcat7/server.xml jsem pridal:
Kód: [Vybrat]
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" URIEncoding="UTF-8"
              proxyName="neco.nekde.cz" proxyPort="80"/>

Kdyz nyni jdu na adresu http://neco.nekde.cz dostanu chybu 404, kterou vraci apache httpd, pokud zadam http://neco.nekde.cz/mojeApp, funguje to.
Ja ale chci mit aplikaci primo na http://neco.nekde.cz.

Pokud v definici virtualhostu uvedu:
Kód: [Vybrat]
    ProxyPass / http://localhost:8081/mojeApp
    ProxyPassReverse / http://localhost:8081/mojeApp

Pri pristupu na adresu http://neco.nekde.cz jsem automaticky presmerovan na http://neco.nekde.cz/mojeApp a dostanu chybu 404, kterou tentokrat vrati tomcat.

Kde delam porad chybu? :-(
„Řemeslo se naučí každý. Umění nikdo.“
„Jednoduchost je nejvyšší úroveň sofistikovanosti.“
- Leonardo Da Vinci

Re:Více domén pro Tomcat za Apachem
« Odpověď #4 kdy: 10. 05. 2014, 17:05:18 »
Musíte tu aplikaci na Tomcatu nastavit tak, aby používala contextPath "/" a byla svázaná se zvolenou doménou. Pokud nemáte nějaký vážný důvod, proč před tím Tomcatem máte Apache, použijte samotný Tomcat a konfiguraci Apache pak nemusíte řešit.

Apache vyhodit nemuzu, potrebuju na stejnem serveru provozovat nekolik PHP aplikaci a mam jen jednu IP.


Já to tedy téměř nepoužívám, ale logicky - název virtuálního hosta by neměl být
localhost, ale jméno domény (jak na straně Apache tak Tomcatu).
    ProxyPass / http://neco.nekde.cz:8081/
Jak by jinak ten Tomcat poznal, co má obsloužit za virtuál?

v /etc/tomcat7/server.xml mam aktualne (+ vychozi veci co tam byly):
 
Kód: [Vybrat]
   <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               URIEncoding="UTF-8"
               redirectPort="8443" />

<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" URIEncoding="UTF-8"
              proxyName="neco.nekde.cz"
              proxyPort="80"/>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">   
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>

<Host name="neco.nekde.cz" unpackWARs="true" autoDeploy="true" appBase="webapps/MOJEAPP">
<Alias>www.neco.nekde.cz</Alias>
<Context path="/" docBase="MOJEAPP" debug="0" reloadable="false"/>
</Host>

Virtualhost apache vypada nasledovne:
Kód: [Vybrat]
<VirtualHost *:80>
    ServerName neco.nekde.cz
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>   
    ProxyPass / http://localhost:8081/MOJEAPP/     # zkousel jsem i port 8080
    ProxyPassReverse / http://localhost:8081/MOJEAPP/
</VirtualHost>

pokud nyni vlezu na adresu http://neco.nekde.cz vidim uvodni stranku, ale jen cisty text. Ve zdrojaku stranky vidim vsechny odkazy ve tvaru:
Kód: [Vybrat]
<script src="/MOJEAPP/static/js.js"></script>vse vypisuju pres <c:out
Nemel by to resit prave radek <Context path="/" docBase="MOJEAPP" debug="0" reloadable="false"/>?

Nektere navody doporucuji nazvat aplikaci ROOT, jenze tak muze byt jen jedna.

"Kdo v zájmu bezpečí obětuje část své svobody, v konečném důsledku přijde o svobodu i svou bezpečnost."


Re:Více domén pro Tomcat za Apachem
« Odpověď #5 kdy: 10. 05. 2014, 17:40:58 »
Aplikace si občas načítá document root tudíž pokud má být v / tak by tam měla být i v Tomcatu a ne na adrese /MOJEAPP...
Tudíž musí odpovídat na portu 8081 přímo. http://host:8081/ by měl vrátit normálně běžící aplikaci.

<script src="/MOJEAPP/static/js.js"></script> tomu napovídá ne?

Jinak by ta proxy musela měnit i obsah přenášených dat (dá se to, ale je to šílenost).

---
Když tak na to koukám (bože děkuji ti za Nginx) to je fakt naprosto jinej level :) ten Apache a Tomcat je zhůvěřilost.
„Řemeslo se naučí každý. Umění nikdo.“
„Jednoduchost je nejvyšší úroveň sofistikovanosti.“
- Leonardo Da Vinci

Re:Více domén pro Tomcat za Apachem
« Odpověď #6 kdy: 10. 05. 2014, 17:47:39 »
Proč je takový problém vytvořit virtuál pod Tomcatem, na kterém poběží aplikace normálně jak má, jen na portu 8081
a ten se přes proxy (přes tu virtuální doménu) načte do Apache. To je normální řešení...

Prostě http://neco.nekde.cz:8081/ bude normálně fungovat jak má a tu načte Apache, který běží na portu 80

Proč vymýšlet šílené nesmysly a nepřehledné konfigurace?
Aplikace obvykle port neřeší (i když může), cesta už může být v samotné logice aplikace (neměnil bych jí).
„Řemeslo se naučí každý. Umění nikdo.“
„Jednoduchost je nejvyšší úroveň sofistikovanosti.“
- Leonardo Da Vinci

Re:Více domén pro Tomcat za Apachem
« Odpověď #7 kdy: 10. 05. 2014, 18:05:05 »
Když se podíváte do dokumentace k Tomcatu, najdete tam návod, jak pracovat s virtuálními hosty. Je to daleko snazší, než se pokoušet přepisovat contextPath.

Mimochodem, Jetty umí spouštět i FastCGI, takže byste mohl i PHP aplikace provozovat pod tím. Kdybyste místo dvou webových serverů chtěl provozovat jen jeden.