問題描述
當(dāng)本地Node.js(Linux + Node.js + npm + yarn)部署上云楼镐,選擇 Azure App Service for Linux 環(huán)境壁却。但是在部署時(shí)女轿,遇見了以下三個(gè)問題:
問題一:使用VS Code進(jìn)行部署纠拔,部署速度非常的慢付鹿,且長時(shí)間無法部署成功
問題二:本地項(xiàng)目文件部署到App Service的WWWROOT目錄下物蝙,但是項(xiàng)目中的node_modules為空炎滞,即App Service沒有完成自動(dòng)化部署
問題三:部署成功后,項(xiàng)目無法訪問诬乞,端口3000沒有被App Service監(jiān)聽
問題解答
問題一:使用VS Code進(jìn)行部署册赛,部署速度非常的慢,且長時(shí)間無法部署成功
因?yàn)镹ode.js 應(yīng)用必須與所有必需的 NPM 依賴項(xiàng)一起部署震嫉。但如果項(xiàng)目根目錄文件中包含了 yarn.lock 或者是在 package.json 中指定了 yarn 作為Package Manager森瘪,則會(huì)使用 yarn 來代替 npm。 且默認(rèn)會(huì)使用最新版的 yarn票堵。這會(huì)導(dǎo)致在部署時(shí)出現(xiàn)未知問題柜砾。如卡頓導(dǎo)致長時(shí)間無響應(yīng)。
解決辦法為换衬,刪除 yarn.lock 文件痰驱。
引用文檔:https://github.com/microsoft/Oryx/blob/main/doc/runtimes/nodejs.md#package-manager
Package manager
The version of npm used to install dependencies and run npm scripts is the one bundled with the specified Node.js version as listed here.
If a
yarn.lock
file is found in your repo root or if you specify "yarn" in theengines
field of package.json, the latest or specified version of yarn will be used instead of npm.Note that installing packages globally is unsupported, whether requested directly by your app or by some pre/post install script of an included package. For example, this will not work in your
package.json
:"preinstall" : "npm install -g somepackage" }
問題二:本地項(xiàng)目文件部署到App Service的WWWROOT目錄下,但是項(xiàng)目中的node_modules為空瞳浦,即App Service沒有完成自動(dòng)化部署
因?yàn)轫?xiàng)目文件已經(jīng)部署到 wwwroot目錄下担映,但是 **node_modules **為空,表示部署時(shí)沒有完成 npm install 自動(dòng)編譯的命令叫潦。所以經(jīng)過查看關(guān)于App Service對部署是否自動(dòng)build的資料發(fā)現(xiàn)蝇完,當(dāng)對App Service進(jìn)行部署的時(shí)候,App Service Kudu會(huì)自動(dòng)執(zhí)行編譯命令。其主要是通過 **SCM_DO_BUILD_DURING_DEPLOYMENT** 參數(shù)進(jìn)行控制短蜕。
當(dāng) **SCM_DO_BUILD_DURING_DEPLOYMENT **設(shè)置為 true 時(shí)氢架,Kudu會(huì)自動(dòng)編譯項(xiàng)目文件,如運(yùn)行 npm install 或 dotnet build / dotnet pulish
當(dāng) **SCM_DO_BUILD_DURING_DEPLOYMENT **設(shè)置為false時(shí)朋魔,則不會(huì)岖研。當(dāng)使用ZIP 包部署時(shí),就不會(huì)觸發(fā)自動(dòng)編譯警检。因?yàn)镵udu認(rèn)為ZIP中的文件已經(jīng)是可執(zhí)行文件孙援,不在需要編譯。
Reference : https://github.com/projectkudu/kudu/wiki/Configurable-settings#enabledisable-build-actions
解決辦法為扇雕,**在App Service的Configuration中添加 SCM_DO_BUILD_DURING_DEPLOYMENT 參數(shù)拓售,并配置值為 true∠夥睿或者是在項(xiàng)目跟目錄中添加 .deployment 文件础淤。并在其中加入 **
[config]
SCM_DO_BUILD_DURING_DEPLOYMENT=true
如圖:
問題三:部署成功后,項(xiàng)目無法訪問哨苛,端口3000沒有被App Service監(jiān)聽
Node.js 應(yīng)用需要偵聽正確的端口才能接收傳入的請求
當(dāng)部署完成值骇,但無法通過瀏覽器訪問App Service 。這時(shí)候移国,就可以直接登錄Kudu 查看 docker 日志吱瘩。在日志中看見 app service默認(rèn)監(jiān)聽的端口為8080。
而 Node.js 項(xiàng)目中迹缀,使用的確是3000使碾,所以需要通過配置App Service的 Application Setting來解決這個(gè)問題。
解決辦法為:通過App Service門戶祝懂,添加 PORT 或者 WEBSITES_PORT
應(yīng)用配置參數(shù)值為3000.
Reference:
當(dāng)在復(fù)雜的環(huán)境中面臨問題票摇,格物之道需:濁而靜之徐清,安以動(dòng)之徐生砚蓬。 云中矢门,恰是如此!
標(biāo)簽: App Service, App Service for Linux, Node.js + yarn.lock +npm, SCM_DO_BUILD_DURING_DEPLOYMENT, PORT +WEBSITE_PORT