JSPWiki logo
Strona główna
Zbieranina
Serwisy
Porady
Projekty
Humor sektora IT
TODO
Nowości
Ostatnie zmiany
Kontakt

Find pages
Unused pages
Undefined pages
Page Index

Set your name in
UserPreferences

Edit this page


Referenced by
Java Tomcat_cluster_...
Porady




JSPWiki v2.2.33


Apache Tomcat_integracja


Apache/Tomcat - bezbolesna integracja serwerów Apache 2.2 i Tomcat 5.5

W sieci można znaleźć wiele rozpaczliwych pytań w rodzaju jak połączyć Tomcata z Apachem?. A rozwiązanie jest banalnie proste: Apache 2.2 i Tomcat 5.5 mogą być połączone bez żadnego problemu, bez większych problemów mogą być też skonfigurowane do pracy jako klaster serwerów.

Pytanie: po co dokonywać takiej integracji? Tomcat może być sam serwerem www. Może, ale:

  • aby Tomcat był dostępny na porcie 80 musiałby pracować jako root
  • na ogól na serwerze są dostępne także inne serwisy www pracujące już pod kontrolą apacza
  • apacz jest bezpieczny i sprawdzony, lepiej żeby on był "bramką" czy "filtrem", jest dużo softu do analizy logów apacza, itd.
  • na samych Tomcatach ciężko skonfigurować klaster
  • istniejącego Tomcata, bądź wybrane tylko aplikacje można podłączyć pod wirtualnego SSL'owego hosta w Apaczu

Początek

Na początek należy oczywiście pobrać potrzebne aplikacje. Serwer www Apache 2.2.x jest do pobrania ze strony http://httpd.apache.org a kontener serwletów Tomcat 5.5.x ze strony http://tomcat.apache.org. Poniższe przykłady były testowane na następujących wersjach aplikacji: apache 2.2.3 i tomcat 5.5.17.

Początkowa konfiguracja serwera Apache

Instalujemy oprogramowanie. Czy to kompilujemy ze źródeł, czy instalujemy gotowe paczki. Istotne jest to, aby dostępne były moduły mod_rewrite, mod_proxy oraz mod_proxy_ajp, one są kluczowe do integracji.

Zakładam, mamy skonfigurowane wirtualnego hosta, którego chcemy udostępnić dla aplikacji Tomcata. Czyli np. skonfigurowaliśmy apacha aby udostępniał nam vhosta tomcat.example.com. Można to osiągnąć następującą konfiguracją:

<VirtualHost *>
    ServerName tomcat.example.com
</VirtualHost>

Początkowa konfiguracja serwera Tomcat

Tomcat, po instalacji "z pudełka" jest gotów do pracy i czeka na połączenia na porcie 8080. Po domyślnej instalacji jego strona główna jest dostępna pod adresem http://localhost:8080. Warto sprawdzić czy faktycznie działa.

Poniższy fragment pliku conf/server.xml określa Connectora pracującego jako serwer www na porcie 8080. Dzięki niemu do Tomcata można podłączyć się za pomocą przeglądarki www.

    <Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" />
Poniższy wpis uruchamia z kolei Connectora pozwalającego na podłączenie się do Tomcata z poziomu serwera Apache. Nim się będziemy zajmować w dalszej kolejności.
    <Connector port="8009"
               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

Konfiguracja serwera Apache - rozwiązanie dla biednych

Gdy nie zależy nam na niczym szczególnym, nie potrzebujemy klastrów, chcemy tylko szybko udostępnić serwisy Tomcata to możemy posłużyć się dyrektywą ProxyPass. Ustawiamy więc konfigurację wirtualnego hosta w apaczu:

<VirtualHost *>
        ServerName tomcat.example.com
        ProxyPass / http://localhost:8080/
        ProxyPassReverse / http://localhost:8080/
</VirtualHost>
Konfiguracja ta przekierowuje wszystkie żądania przychodzące do danego hosta, na wskazany adres. W tym przypadku na HTTP Connectora skonfigurowanego w Tomcacie. Aby całość dokończyć należy jeszcze powiedzieć Tomcatowi jaka jest jego "zewnętrzna" nazwa hosta - po to, aby poprawnie wykonywał on przekierowania. Należy zmodyfikować konfigurację Connectora w następujący sposób:
    <Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               proxyName="tomcat.example.com" proxyPort="80"
               connectionTimeout="20000" disableUploadTimeout="true" />
Minusem takiego podejścia jest to, że wszystkie odwołania do Tomcata widoczne są jak odwołania z adresu 127.0.0.1, są to wywołania sztucznie wykonywane przez apacza. A dokładniej rzecz biorąc, wywołanie metody HttpServletRequest.getRemoteAddr() będzie zawsze zwracać wartość 127.0.0.1. Nie zawsze jest to pożądane.

Konfiguracja serwera Apache - rozwiązanie właściwe

Aby pozbyć się problemów opisanych powyżej należy skorzystać z funkcjonalności oferowanej przez moduł mod_proxy_ajp. Jego konfiguracja w najprostrzej wersji jest równie trywialna jak ww sposób. Edytujemy wpis wirtualnego hosta w apaczu:

<VirtualHost *>
        ServerName tomcat.example.com
        ProxyPass / ajp://localhost:8009/
        ProxyPassReverse / ajp://localhost:8009/
</VirtualHost>
Używamy tym samym AJP Connectora i jeśli chcemy, to można wyłączyć HTTP Connectora. Tomcat jest teraz dostępny poprzez specjalny, dedykowany protokoł. Automatycznie przenoszona jest informacja o nazwie wirtualnego hosta w apaczu, o adresie użytkownika oraz wszystkie inne często potrzebne dane.

Udostępnienie wybranej aplikacji z Tomcata

Często zachodzi potrzeba udostępnienia jednej bądź kilku aplikacji Tomcata, a dawanie dostępu do niego całego nie jest dopuszczalne. Nie można wtedy zastosować ww rozwiązania, gdyż ono udostępnia całą zawartość Tomcata.

Załómy, że chcemy udostępnić tylko jedną aplikację app. W tym calu konfigurujemy naszego wirtualnego hosta:

<VirtualHost *>
        ServerName tomcat.example.com
        ProxyPass /app ajp://localhost:8009/app
        ProxyPassReverse /app ajp://localhost:8009/app
</VirtualHost>
I tyle. Pozostałe odwołania (nie pasujące do URLa /app) są obsługiwane przez apacha i są przekierowywane np. do plikow HTML, PHP, itd. Gdybyśmy chcieli udostępnić więcej aplikacji to należy odpowiednio powtorzyć dyrektywy ProxyPass.

Udostępnienie wybranej aplikacji z Tomcata pod inną nazwą

Powyższe rozwiązanie ma potencjalną wadę: URI pod którym jest widoczna w apaczu aplikacja jest identyczny z tym, jaki jest w Tomcacie. Nie zawsze jest to pożądane. Poniższy przykład pokazuje jak można udostępnić aplikację /app jako /apps/enterprise.

<VirtualHost *>
        ServerName tomcat.example.com
        ProxyPass /apps/enterprise/ ajp://localhost:8009/app/
        ProxyPassReverse /apps/enterprise/ ajp://localhost:8009/app/
        ProxyPassReverseCookiePath /app /apps/enterprise/
</VirtualHost>
Oczywiście jeśli aplikacja sama generuje bezwzględne adresy do swoich składników (adresy podstron, linki do grafik czy arkuszy styli) to mogą pojawić się problemy. Aplikacja pracująca w Tomcacie "nie wie", że zewnętrzny użytkownik widzi ją dostępną pod inną ścieżką. Można wtedy radzić sobie różnymi kombinacjami modułu mod_rewrite, tylko czy jest sens?

Zakończenie

Wszystkioe ww przykłady zakładają, że zarówno Apache jak i Tomcat pracują na tej samej maszynie. Nic nie stoi na przeszkodzie aby były one na odrębnych maszynach. Należy jednak w takim wypadku użyć dodatkowej dyrektywy ProxyPassReverseCookieDomain aby poprawnie przepisywać ewentualne domeny określone w Cookies.

ProxyPassReverseCookieDomain domena.tomcata tomcat.example.com



Go to top   Edit this page   More info...   Attach file...
This page last changed on 12-Sep-2006 12:10:31 GMT by mikolajr.