前幾天在嘗試將一個 Spring Boot 3 專案部署到 Azure Web App (Linux) 時,一直遇到了 HTTP 404 無法回應的問題,經過了兩三天的嘗試,終於找到解決方法,這篇文章就來記錄一下這個過程。
建立專案與部署 Azure Web App (Azure App Service on Linux)
以下我就介紹完整的建立專案與部署的過程:
-
使用 Spring Initializr 建立 Spring Boot 3.2.1 專案
我建立專案的完整參數可以從這個網址看見!
-
加入一個 REST API Controller
package com.example.demo.controllers;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "Hello World";
}
}
-
部署網站到 Azure Web App (Azure App Service on Linux)
如果此時將整個網站部署到 Azure Web App (Azure App Service on Linux) 的話,網站是無法運作的,所有 API 都會回應 HTTP 404 的結果,剛遇到這個狀況的時候,真的完全沒概念,也不清楚問題發生的原因!
若要立即進行部署,可參考 Quickstart: Create a Java app on Azure App Service 文件,透過 Maven 自動部署網站到 Azure App Service!
你必須先透過 Azure CLI 登入並選取要部署的訂用帳戶,然後再透過以下 Plugin 自動設定所有 Azure 部署需要的參數:
mvn com.microsoft.azure:azure-webapp-maven-plugin:2.12.0:config
然後就可以透過 azure-webapp:deploy
這個 Goal 來自動部署網站!
mvn package azure-webapp:deploy
部署的過程會自動建立所有必要的 Azure 資源,而且發行時將會把 target/*.war
部署到 Azure Web App 並將檔名修改成 app.war
,放在 App Service 的 /home/site/wwwroot
目錄下。
解決 HTTP 404 的問題
這個步驟是本文的重點,因為 Azure App Service on Linux 會自動替 Java Spring Boot 的應用程式注入一個 microsoft/ApplicationInsights-Java 代理程式 (auto injected agent),這個元件會自動監控應用程式的運作狀態,但不知道是什麼原因,只要用 Java 17 + WAR + Tomcat 10 就會導致網站完全無法運作,永遠回傳 HTTP 404 的結果,所以我們必須要加入一些程式碼才能讓網站與 Application Insights 正常運作!
首先,我參考 Using Azure Monitor Application Insights with Spring Boot 設定 Application Insights!
-
先在 pom.xml
加入以下相依套件:
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>applicationinsights-runtime-attach</artifactId>
<version>3.4.19</version>
</dependency>
-
請在 DemoApplication.java
加入 ApplicationInsights.attach();
程式碼 (關鍵步驟)
@SpringBootApplication
public class SpringBootApp {
public static void main(String[] args) {
// 這是最重要的一步,請務必加上!
ApplicationInsights.attach();
SpringApplication.run(SpringBootApp.class, args);
}
}
-
重新部署網站到 Azure Web App
mvn package azure-webapp:deploy
部署成功後,透過網址 https://<your-app-name>.azurewebsites.net/hello
就可以發現 API 正常運作了! 👍
相關連結