Migrowanie aplikacji serwera Tomcat do serwera Tomcat w usłudze Azure App Service
W tym przewodniku opisano, na co należy zwrócić uwagę, aby przeprowadzić migrację istniejącej aplikacji serwera Tomcat w celu uruchomienia jej w usłudze Azure App Service przy użyciu serwera Tomcat 9.0.
Przed migracją
Aby zapewnić pomyślną migrację, przed rozpoczęciem wykonaj kroki oceny i spisu opisane w poniższych sekcjach.
Jeśli nie możesz spełnić żadnego z tych wymagań przed migracją, zapoznaj się z następującymi przewodnikami po migracji towarzyszącej:
- Migrowanie aplikacji serwera Tomcat do kontenerów w usłudze Azure Kubernetes Service
- Migrowanie aplikacji serwera Tomcat do usługi Azure Virtual Machines (zaplanowane wskazówki)
Przełączanie na obsługiwaną platformę
Usługa App Service oferuje określone wersje serwera Tomcat w określonych wersjach języka Java. Aby zapewnić zgodność, przed kontynuowaniem pozostałych kroków przeprowadź migrację aplikacji do jednej z obsługiwanych wersji oprogramowania Tomcat i języka Java w bieżącym środowisku. Pamiętaj, aby w pełni przetestować konfigurację wynikową. W tych testach użyj najnowszej stabilnej wersji dystrybucji systemu Linux.
Uwaga
Ta weryfikacja jest szczególnie ważna, jeśli bieżący serwer działa na nieobsługiwanym zestawie JDK (na przykład Oracle JDK lub IBM OpenJ9).
Aby uzyskać informacje na temat bieżącej wersji języka Java, zaloguj się na serwerze produkcyjnym i uruchom następujące polecenie:
java -version
W usłudze aplikacja systemu Azure pliki binarne dla środowiska Java 8 są dostarczane z poziomu środowiska Eclipse Temurin. W przypadku języka Java 11, 17 i wszystkich przyszłych wersji LTS języka Java usługa App Service udostępnia zestaw Microsoft Build zestawu OpenJDK. Te pliki binarne są dostępne do bezpłatnego pobrania w następujących witrynach:
Aby uzyskać informacje na temat bieżącej wersji serwera Tomcat, zaloguj się na serwerze produkcyjnym i uruchom następujące polecenie:
${CATALINA_HOME}/bin/version.sh
Aby uzyskać informacje na temat bieżącej wersji używanej przez usługę Azure App Service, pobierz oprogramowanie Tomcat 9, w zależności od wersji, która ma być używana w usłudze Azure App Service.
Utworzenie spisu zasobów zewnętrznych
Zasoby zewnętrzne, takie jak źródła danych, brokery komunikatów JMS i inne, są wstrzykiwane za pośrednictwem interfejsu Java Naming and Directory Interface (JNDI). Niektóre takie zasoby mogą wymagać migracji lub ponownej konfiguracji.
W aplikacji
Sprawdź plik META-INF/context.xml. Poszukaj elementów <Resource>
wewnątrz elementu <Context>
.
Na serwerach aplikacji
Sprawdź pliki $CATALINA_BASE/conf/context.xml i $CATALINA_BASE/conf/server.xml oraz pliki .xml w katalogach $CATALINA_BASE/conf/[nazwa-aparatu]/[nazwa-hosta].
W plikach context.xml zasoby JNDI będą opisywane przez elementy <Resource>
w elemencie <Context>
najwyższego poziomu.
W plikach server.xml zasoby JNDI będą opisywane przez elementy <Resource>
w elemencie <GlobalNamingResources>
.
Źródła danych
Źródła danych to zasoby JNDI z atrybutem type
ustawionym na javax.sql.DataSource
. Dla każdego źródła danych należy udokumentować następujące informacje:
- Jaka jest nazwa źródła danych?
- Jaka jest konfiguracja puli połączeń?
- Gdzie mogę znaleźć plik JAR sterownika JDBC?
Aby uzyskać więcej informacji, zobacz przewodnik JNDI Datasource How-To (Źródło danych JNDI — porady) w dokumentacji serwera Tomcat.
Wszystkie inne zasoby zewnętrzne
Nie jest możliwe udokumentowanie każdej możliwej zależności zewnętrznej w tym przewodniku. Twój zespół odpowiada za sprawdzenie, czy każda zależność zewnętrzna aplikacji może być spełniona po migracji.
Utworzenie spisu wpisów tajnych
Hasła i bezpieczne ciągi
Sprawdź wszystkie pliki właściwości i konfiguracji na serwerach produkcyjnych pod kątem wszelkich ciągów wpisów tajnych i haseł. Sprawdź pliki server.xml i context.xml w katalogu $CATALINA_BASE/conf. Możesz również znaleźć pliki konfiguracji zawierające hasła lub poświadczenia wewnątrz aplikacji. Mogą one obejmować plik META-INF/context.xml oraz, w przypadku aplikacji Spring Boot, pliki application.properties lub application.yml.
Certyfikaty spisu
Udokumentuj wszystkie certyfikaty używane w przypadku publicznych punktów końcowych protokołu SSL lub komunikacji z bazami danych zaplecza i innymi systemami. Wszystkie certyfikaty na serwerach produkcyjnych można wyświetlić, uruchamiając następujące polecenie:
keytool -list -v -keystore <path to keystore>
Określanie, czy i jak jest używany system plików
Każde użycie systemu plików na serwerze aplikacji będzie wymagało ponownej konfiguracji lub, w rzadkich przypadkach, zmiany architektury. Można zidentyfikować niektóre lub wszystkie z następujących scenariuszy.
Zawartość statyczna tylko do odczytu
Jeśli aplikacja aktualnie obsługuje zawartość statyczną, potrzebna jest dodatkowa lokalizacja. Warto rozważyć przeniesienie zawartości statycznej do usługi Azure Blob Storage i dodanie usługi Azure CDN, aby zapewnić błyskawiczne pobieranie na całym świecie. Aby uzyskać więcej informacji, zobacz Hostowanie statycznej witryny internetowej w usłudze Azure Storage i Szybki start: integrowanie konta usługi Azure Storage z usługą Azure CDN.
Dynamicznie publikowana zawartość statyczna
Jeśli aplikacja zezwala na zawartość statyczną, która została przekazana/utworzona przez aplikację, ale pozostaje niezmienna po jej utworzeniu, możesz użyć usług Azure Blob Storage i Azure CDN, jak opisano powyżej, oraz usługi Azure Function do obsługiwania przekazywania i odświeżania usługi CDN. Udostępniliśmy przykładową implementację do użycia w temacie Przekazywanie zawartości statycznej i jej wstępne ładowanie w usłudze CDN za pomocą usługi Azure Functions.
Zawartość dynamiczna lub wewnętrzna
Na potrzeby plików często zapisywanych i odczytywanych przez aplikację (na przykład plików danych tymczasowych) lub plików statycznych, które są widoczne tylko dla aplikacji, możesz zainstalować usługę Azure Storage w systemie plików usługi App Service. Aby uzyskać więcej informacji, zobacz Instalowanie usługi Azure Storage jako udziału lokalnego w usłudze App Service.
Określanie mechanizmu trwałości sesji
Aby zidentyfikować używanego menedżera trwałości sesji, sprawdź pliki context.xml w aplikacji i konfiguracji serwera Tomcat. Poszukaj elementu <Manager>
, a następnie zanotuj wartość atrybutu className
.
Wbudowane na serwerze Tomcat implementacje aplikacji PersistentManager, na przykład StandardManager czy FileStore, nie są przeznaczone do użycia z rozproszoną, skalowaną platformą, taką jak usługa App Service. Ponieważ usługa App Service może równoważyć obciążenie między kilkoma wystąpieniami i w dowolnym momencie w niewidoczny sposób uruchomić ponownie dowolne wystąpienie, nie zaleca się utrwalania modyfikowalnego stanu w systemie plików.
Jeśli wymagana jest trwałość sesji, należy użyć alternatywnej PersistentManager
implementacji, która będzie zapisywać w zewnętrznym magazynie danych, takim jak VMware Tanzu Session Manager z pamięcią podręczną Redis Cache. Aby uzyskać więcej informacji, zobacz Korzystanie z usługi Redis jako pamięci podręcznej sesji na serwerze Tomcat.
Identyfikacja wszystkich procesów i demonów zewnętrznych działających na serwerach produkcyjnych
Jeśli masz jakiekolwiek procesy działające poza serwerem aplikacji, takie jak demony monitorowania, musisz wyeliminować je lub zmigrować do innego miejsca.
Przypadki szczególne
Niektóre scenariusze produkcyjne mogą wymagać dodatkowych zmian lub wprowadzać dodatkowe ograniczenia. Chociaż takie scenariusze mogą być rzadkie, ważne jest, aby upewnić się, że są one niestosowalne do aplikacji lub poprawnie rozwiązane.
Określanie, czy aplikacja korzysta z zaplanowanych zadań
Z usługą App Service nie można używać zaplanowanych zadań, takich jak zadania Quartz Scheduler lub cron. Usługa App Service nie uniemożliwi wdrażania aplikacji zawierającej zaplanowane zadania wewnętrznie. Jeśli jednak aplikacja jest skalowana w poziomie, to samo zaplanowane zadanie może zostać uruchomione więcej niż raz w zaplanowanym okresie. Ta sytuacja może prowadzić do niezamierzonych konsekwencji.
Utwórz spis wszystkich zaplanowanych zadań, wewnątrz lub na zewnątrz serwera aplikacji.
Określanie, czy aplikacja zawiera kod właściwy dla systemu operacyjnego
Jeśli aplikacja zawiera jakikolwiek kod z zależnościami systemu operacyjnego hosta, należy go refaktoryzować, aby usunąć te zależności. Na przykład może być konieczne zastąpienie dowolnego użycia ścieżki /
systemu plików lub \
w ścieżkach File.Separator
systemu plików lub Paths.get
jeśli aplikacja jest uruchomiona w systemie Windows.
Określanie, czy jest używane klastrowanie serwera Tomcat
Usługa Azure App Service nie obsługuje klastrowania serwera Tomcat. W zamian można skonfigurować skalowanie i równoważenie obciążenia oraz zarządzać nimi za pośrednictwem usługi Azure App Service bez funkcji specyficznych dla serwera Tomcat. Stan sesji można utrwalić w innej lokalizacji, aby udostępnić ją w replikach. Aby uzyskać więcej informacji, zobacz Określanie mechanizmu trwałości sesji.
Aby ustalić, czy aplikacja używa klastrowania, poszukaj elementu <Cluster>
wewnątrz elementów <Host>
lub <Engine>
w pliku server.xml.
Określanie, czy są używane łączniki inne niż HTTP
Usługa App Service obsługuje tylko pojedynczy łącznik HTTP. Jeśli aplikacja wymaga dodatkowych łączników, na przykład łącznika AJP, nie używaj usługi App Service.
Aby zidentyfikować łączniki HTTP używane przez aplikację, poszukaj elementów <Connector>
wewnątrz pliku server.xml w konfiguracji serwera Tomcat.
Określanie, czy jest używana klasa MemoryRealm
Klasa MemoryRealm wymaga utrwalonego pliku XML. W aplikacja systemu Azure Service należy przekazać ten plik do katalogu /home lub jednego z jego podkatalogów lub do zainstalowanego magazynu. Następnie należy odpowiednio zmodyfikować pathName
parametr.
Aby ustalić, czy klasa MemoryRealm
jest aktualnie używana, sprawdź, czy w plikach server.xml i context.xml znajdują się elementy <Realm>
, których atrybut className
jest ustawiony na org.apache.catalina.realm.MemoryRealm
.
Określanie, czy jest używane śledzenie sesji SSL
Usługa App Service wykonuje odciążanie sesji poza środowiskiem uruchomieniowym serwera Tomcat, więc nie można używać śledzenia sesji SSL. W zamian użyj innego trybu śledzenia sesji (COOKIE
lub URL
). Jeśli potrzebujesz śledzenia sesji SSL, nie używaj usługi App Service.
Określanie, czy jest używana klasa AccessLogValve
Jeśli używasz metody AccessLogValve, należy ustawić directory
parametr na /home/LogFiles
lub jeden z jego podkatalogów.
Migracja
Parametryzacja konfiguracji
W krokach przed migracją prawdopodobnie zidentyfikowano niektóre wpisy tajne i zależności zewnętrzne, takie jak źródła danych, w plikach server.xml i context.xml . Dla każdego zidentyfikowanego elementu zastąp dowolną nazwę użytkownika, hasło, parametry połączenia lub adres URL zmienną środowiskową.
Uwaga
Firma Microsoft zaleca korzystanie z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Przepływ uwierzytelniania opisany w tej procedurze, taki jak bazy danych, pamięci podręczne, komunikaty lub usługi sztucznej inteligencji, wymaga bardzo wysokiego stopnia zaufania w aplikacji i niesie ze sobą ryzyko, które nie występują w innych przepływach. Użyj tego przepływu tylko wtedy, gdy bardziej bezpieczne opcje, takie jak tożsamości zarządzane dla połączeń bez hasła lub bez kluczy, nie są opłacalne. W przypadku operacji maszyny lokalnej preferuj tożsamości użytkowników dla połączeń bez hasła lub bez klucza.
Na przykład załóżmy, że plik context.xml zawiera następujący element:
<Resource
name="jdbc/dbconnection"
type="javax.sql.DataSource"
url="jdbc:postgresql://postgresdb.contoso.com/wickedsecret?ssl=true"
driverClassName="org.postgresql.Driver"
username="postgres"
password="{password}"
/>
W takim przypadku można go zmienić w sposób pokazany w następującym przykładzie:
<Resource
name="jdbc/dbconnection"
type="javax.sql.DataSource"
url="${postgresdb.connectionString}"
driverClassName="org.postgresql.Driver"
username="${postgresdb.username}"
password="${postgresdb.password}"
/>
Aby upewnić się, że podstawianie parametrów występuje dla dowolnego pliku context.xml w folderze META-INF wewnątrz wdrożonego pliku war, pamiętaj, aby ustawić zmienną CATALINA_OPTS
środowiskową, jak pokazano w poniższym przykładzie:
export CATALINA_OPTS="-Dorg.apache.tomcat.util.digester.PROPERTY_SOURCE=org.apache.tomcat.util.digester.EnvironmentPropertySource"
Aprowizacja planu usługi App Service
Z listy dostępnych planów usług na stronie App Service — cennik wybierz plan, którego specyfikacje spełniają lub przekraczają specyfikacje obecnego sprzętu produkcyjnego.
Uwaga
Jeśli planujesz uruchamianie wdrożeń przejściowych/kanarkowych lub korzystanie z miejsc wdrożenia, plan usługi App Service musi uwzględniać dodatkową pojemność. W przypadku aplikacji języka Java zalecamy korzystanie z planów Premium lub wyższych. Aby uzyskać więcej informacji, zobacz Konfigurowanie środowisk przejściowych w usłudze Azure App Service.
Następnie utwórz plan usługi App Service. Aby uzyskać więcej informacji, zobacz Zarządzanie planem usługi App Service na platformie Azure.
Tworzenie i wdrażanie aplikacji internetowych
Dla każdego pliku WAR wdrożonego na serwerze Tomcat musisz utworzyć aplikację internetową w ramach planu usługi App Service (wybierając wersję serwera Tomcat jako stos środowiska uruchomieniowego).
Uwaga
Chociaż istnieje możliwość wdrożenia wielu plików WAR w pojedynczej aplikacji internetowej, jest to wysoce niepożądane. Wdrożenie wielu plików WAR w pojedynczej aplikacji internetowej uniemożliwia skalowanie poszczególnych aplikacji zgodnie z ich wymaganiami dotyczącymi użycia. Zwiększa również złożoność kolejnych potoków wdrażania. Jeśli pod pojedynczym adresem URL musi być dostępnych wiele aplikacji, rozważ użycie rozwiązania routingu, takiego jak Azure Application Gateway.
Aplikacje Maven
Jeśli aplikacja została skompilowana z pliku POM narzędzia Maven, użyj wtyczki Webapp dla narzędzia Maven, aby utworzyć aplikację internetową i wdrożyć aplikację.
Aplikacje inne niż Maven
Jeśli nie możesz użyć wtyczki Maven, musisz zaaprowizować aplikację internetową za pomocą innych mechanizmów, takich jak:
Po utworzeniu aplikacji internetowej użyj jednego z dostępnych mechanizmów wdrażania, aby wdrożyć aplikację.
Migracja opcji środowiska uruchomieniowego JVM
Jeśli aplikacja wymaga określonych opcji środowiska uruchomieniowego, użyj najbardziej odpowiedniego mechanizmu, aby je określić.
Wypełnianie wpisów tajnych
Do przechowywania wszelkich wpisów tajnych specyficznych dla aplikacji użyj ustawień aplikacji. Jeśli zamierzasz używać tych samych wpisów tajnych w wielu aplikacjach lub potrzebujesz szczegółowych zasad dostępu i funkcji inspekcji, zamiast tego skorzystaj z usługi Azure Key Vault.
Konfigurowanie domeny niestandardowej oraz protokołu SSL
Jeśli aplikacja będzie widoczna w domenie niestandardowej, należy na nią zamapować aplikację internetową. Aby uzyskać więcej informacji, zobacz Samouczek: mapowania istniejącej niestandardowej nazwy DNS na usługę aplikacja systemu Azure Service.
Następnie należy powiązać certyfikat SSL dla tej domeny z aplikacją internetową usługi App Service. Aby uzyskać więcej informacji, zobacz Zabezpieczanie niestandardowej nazwy DNS przy użyciu powiązania SSL w usłudze Azure App Service.
Importowanie certyfikatów zaplecza
Wszystkie certyfikaty do komunikacji z systemami zaplecza, takimi jak bazy danych, muszą zostać udostępnione w usłudze App Service. Aby uzyskać więcej informacji, zobacz Dodawanie certyfikatu SSL w usłudze App Service.
Migracja źródeł danych, bibliotek i zasobów JNDI
Aby poznać kroki konfiguracji źródła danych, zapoznaj się z sekcją Źródła danych artykułu Konfigurowanie aplikacji Java systemu Linux dla usługi Azure App Service.
Aby uzyskać dodatkowe instrukcje dotyczące źródła danych, zapoznaj się z następującymi sekcjami przewodnika JNDI Datasource How-To (Źródło danych JNDI — porady) w dokumentacji serwera Tomcat:
Przeprowadź migrację wszelkich dodatkowych zależności ścieżki klasy na poziomie serwera, wykonując te same czynności co w przypadku plików JAR źródła danych.
Przeprowadź migrację wszelkich dodatkowych udostępnionych zasobów JDNI na poziomie serwera.
Uwaga
Jeśli korzystasz z zalecanej architektury obejmującej jeden plik WAR na każdą aplikację internetową, rozważ przeprowadzenie migracji bibliotek ścieżki klasy i zasobów JNDI na poziomie serwera do swojej aplikacji. Znacznie uprości to nadzór nad składnikami i zarządzanie zmianami.
Migracja pozostałej konfiguracji
Po ukończeniu poprzedniej sekcji w katalogu /home/tomcat/conf powinna znajdować się dostosowywalna konfiguracja serwera.
Przeprowadź migrację, kopiując wszelkie dodatkowe konfiguracje (na przykład obszary i JASPIC)
Migrowanie zaplanowanych zadań
Aby wykonać zaplanowane zadania na platformie Azure, warto użyć wyzwalacza czasomierza dla usługi Azure Functions. Nie musisz migrować kodu zadania do funkcji. Aby wyzwolić zadanie, funkcja może po prostu wywoływać adres URL w aplikacji. Jeśli wykonywane zadania muszą być wywoływane dynamicznie i/lub śledzone centralnie, warto użyć harmonogramu Spring Batch.
Można też utworzyć aplikację logiki z wyzwalaczem cyklicznym, aby wywoływać adres URL bez pisania kodu poza aplikacją. Aby uzyskać więcej informacji, zobacz Co to jest usługa Azure Logic Apps — omówienie i Tworzenie, planowanie i uruchamianie cyklicznych zadań oraz przepływów pracy za pomocą wyzwalacza cyklicznego w usłudze Azure Logic Apps.
Uwaga
Aby zapobiec złośliwemu użyciu, prawdopodobnie trzeba będzie wprowadzić wymaganie podania poświadczeń w punkcie końcowym wywoływania zadania. W takim przypadku poświadczenia muszą zostać podane przez funkcję wyzwalacza.
Ponowne uruchamianie i test dymny
Na koniec musisz ponownie uruchomić aplikację internetową, aby zastosować wszystkie zmiany konfiguracji. Po zakończeniu ponownego uruchamiania sprawdź, czy aplikacja działa prawidłowo.
Po migracji
Po przeprowadzeniu migracji aplikacji do usługi Azure App Service sprawdź, czy działa ona zgodnie z oczekiwaniami. Po wykonaniu tych czynności skorzystaj z naszych zaleceń, dzięki którym Twoja aplikacja będzie bardziej natywna dla chmury.
Zalecenia
Jeśli przechowujesz pliki w katalogu /home, rozważ zastąpienie go usługą Azure Storage.
Jeśli masz konfigurację w katalogu /home zawierającym parametry połączenia, klucze SSL i inne informacje tajne, rozważ użycie kombinacji usługi Azure Key Vault i/lub iniekcji parametrów z ustawieniami aplikacji, jeśli to możliwe.
Uwaga
Firma Microsoft zaleca korzystanie z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Przepływ uwierzytelniania opisany w tej procedurze, taki jak bazy danych, pamięci podręczne, komunikaty lub usługi sztucznej inteligencji, wymaga bardzo wysokiego stopnia zaufania w aplikacji i niesie ze sobą ryzyko, które nie występują w innych przepływach. Użyj tego przepływu tylko wtedy, gdy bardziej bezpieczne opcje, takie jak tożsamości zarządzane dla połączeń bez hasła lub bez kluczy, nie są opłacalne. W przypadku operacji maszyny lokalnej preferuj tożsamości użytkowników dla połączeń bez hasła lub bez klucza.
Rozważ użycie miejsc wdrożenia, aby uzyskać niezawodne wdrożenia bez przestojów.
Zaprojektuj i zaimplementuj strategię DevOps. Aby zachować niezawodność przy jednoczesnym zwiększaniu szybkości tworzenia rozwiązań, rozważ automatyzację wdrożeń i testowania przy użyciu usługi Azure Pipelines. W przypadku korzystania z miejsc wdrożenia można zautomatyzować wdrażanie w miejscu , po którym następuje zamiana miejsca.
Zaprojektuj i zaimplementuj strategię ciągłości działania i odzyskiwania po awarii. W przypadku aplikacji o krytycznym znaczeniu rozważ zastosowanie architektury wdrażania w wielu regionach.