2009-11-13 16 views
10

Tomcat oferuje wbudowaną obsługę "Virtual Hosting": Silnik/aplikację internetową można skonfigurować tak, aby odpowiadał za listę domen. Domeny te należy umieścić w plikach server.xml/context.xml za pomocą specjalnej dyrektywy xml.Tomcat: Programowo zmienić hosty wirtualne?

=> Czy istnieje możliwość zmiany programowo konfiguracji serwera Tomcat (ogólnie), a zwłaszcza "hostów wirtualnych" aplikacji sieci Web/silnika?

Na przykład, jeśli nowy użytkownik zarejestruje się, muszę dodać jego domenę do listy "zaakceptowanych wirtualnych hostów/domen". Jedyny sposób, w jaki obecnie myślę, to zmiana plików XML za pomocą skryptu, a następnie ponowne uruchomienie Tomcat.

Czy istnieje sposób, aby dodać programowo środowisko wykonawcze za pomocą niektórych metod Java?

Dziękuję bardzo! Jan

Odpowiedz

6

Tomcat udostępnia interfejsy API do tworzenia nowego hosta wirtualnego. Aby uzyskać dostęp do potrzebnego do tego celu obiektu opakowania, musisz zaimplementować ContainerServlet. Można utworzyć wirtualnego hosta tak,

Context context = (Context) wrapper.getParent(); 
    Host currentHost = (Host) context.getParent(); 
    Engine engine = (Engine) currentHost.getParent(); 

    StandardHost host = new StandardHost(); 
    host.setAppBase(appBase); 
    host.setName(domainName); 

    engine.addChild(host); 

Musisz upewnić katalog appBase istnieć i trzeba znaleźć sposób, aby utrwalić nowe gospodarzem server.xml albo tracisz hosta na restart.

Jednak takie podejście rzadko działa. Jeśli Twoi użytkownicy uruchamiają własne aplikacje, naprawdę chcesz uruchamiać osobne instancje Tomcat, abyś mógł lepiej piaskować aplikacje. na przykład Jedna z uruchomionych aplikacji nie zabija wszystkich innych aplikacji.

Jeśli udostępniasz aplikację, możesz po prostu użyć jednego hosta (defaultHost). Możesz uzyskać nazwę domeny z nagłówka Host i robić wszystkie rzeczy związane z domeną w kodzie.

+1

Witaj ZZ Coder, dzięki za odpowiedź. To ciekawe, nigdy nie słyszałem o tym, to genialne wiedzieć, że istnieją sposoby na dostęp do hosta i silnika w Tomcat. – jan

+0

@Coder, jak zdobyć obiekt 'wrapper'a – Kainix

+0

@Kainix Musisz utworzyć serwlet implementujący ContainerServlet, który ma setter setWrapper(). Tomcat zadzwoni do twojego setera, by ustawić opakowanie. Nie używałem tego od Tomcat 5, więc mechanizm mógł się zmienić. –

1

Proponuję ustawić aplikację jako domyślny host wirtualny w pliku server.xml, aby pojedynczy host wirtualny mógł odpowiadać na żądania kierowane na dowolną nazwę hosta. Tomcat jest dostarczany z aplikacją localhost ustawioną jako domyślny host wirtualny. Możesz więc zobaczyć, jak to zrobić, po prostu sprawdzając plik server.xml instalacji tomcat vanilla. Można programowo określić nazwę hosta, do którego użytkownik wysłał żądanie, korzystając z metody ServletRequest.getServerName().

Tomcat był wysyłany z aplikacją internetową o nazwie "host-manager". Uwaga: jest to coś innego niż aplikacja internetowa "menedżer", która nadal jest dostarczana z Tomcat. Menedżer hosta pozwalał na zmianę konfiguracji lub dodawanie nowych wirtualnych hostów bez konieczności restartowania serwera. Możesz komunikować się z menedżerem hosta przez HTTP (programowo, jeśli chcesz). Miał jednak niefortunną wadę, polegającą na niezapisaniu zmian w pliku server.xml, więc wszystkie zostały utracone po ponownym uruchomieniu serwera WWW. Z jakiegokolwiek powodu, począwszy od wersji 6, Tomcat nie jest już dostarczany z aplikacją host-manager. Więc wydaje się, że nie jest już obsługiwany.

+0

Witam Asafowych bardzo dziękuję za odpowiedź! – jan

3

Nie należy zmieniać programowo środowiska serwera i nie ma w nim niezawodnych i standardowych sposobów. Najlepiej zrobić i zachować wszystko po stronie internetowej. Na początek idealnie nadaje się do tego Filter. Przechowuj nazwy gdzieś w tabeli bazy danych lub plik właściwości, który buforujesz w zakresie aplikacji. Sprawdź HttpServletRequest#getRequestURI() (lub getServerName(), jeśli jest to poddomena zamiast ścieżki informacji) i odpowiednio wykonaj zadanie przekazywania.

Mam nadzieję, że to pomoże.

+0

Witaj BalusC, dziękuję bardzo za odpowiedź! – jan

+0

Myślę, że jest to najlepszy sposób na zrobienie tego. Dlaczego potrzebne jest mapowanie db. Czy nie możemy po prostu zamapować aplikacji internetowej na poddomeny? – Sorter

3

Zastosowanie JMX

ArrayList serverList = MBeanServerFactory.findMBeanServer(null); 
MBeanServer server = (MBeanServer) serverList.get(0); 
Object[] params = { "org.apache.catalina.core.StandardHost", hostName }; 
String[] signature = { "java.lang.String", "java.lang.String" }; 
server.invoke(new ObjectName("Catalina:type=Engine"), "addChild", params, signature); 

razie potrzeby odebrania obiektu hosta i z nim pracować:

ObjectName host = new ObjectName("Catalina:type=Host,host=" + hostName); 
server.setAttribute(host, new Attribute("autoDeploy", false)); 
server.invoke(host, "start", null, null); 
+0

Dzięki za twój post! Proszę nie używać podpisów/sloganów w swoich postach. Twoja skrzynka użytkownika jest Twoim podpisem i możesz użyć swojego profilu, aby opublikować dowolne informacje o sobie. [Najczęściej zadawane pytania na temat podpisów/sloganów] (http://stackoverflow.com/faq#signatures) –