先決條件: | 完成之前的所有教程主題,包括 Express教程第6部分:使用表單。 |
---|---|
目的: | 了解在何處以及如何將Express應(yīng)用程序部署到生產(chǎn)環(huán)境。 |
一旦您的網(wǎng)站完成(或"足夠"開始公開測試),您將需要將其托管在比您的個人開發(fā)計算機更公開和可訪問的地方。
到目前為止,您一直在開發(fā)環(huán)境中使用Express / Node作為網(wǎng)絡(luò)服務(wù)器將網(wǎng)站共享到本地瀏覽器/網(wǎng)絡(luò), 運行您的網(wǎng)站與(不安全)開發(fā)設(shè)置,暴露調(diào)試和其他私人信息。 在您可以外部托管網(wǎng)站之前,您首先必須:
本教程為您選擇托管網(wǎng)站的選項提供了一些指導(dǎo),簡要概述了您的Express應(yīng)用程序準備投入生產(chǎn)需要做什么,以及如何將LocalLibrary網(wǎng)站安裝到 ="https://www.heroku.com/"class ="external"> Heroku 云托管服務(wù)。
生產(chǎn)環(huán)境是由服務(wù)器計算機提供的環(huán)境,您將在其中運行您的網(wǎng)站以供外部使用。 環(huán)境包括:
服務(wù)器計算機可以位于您的場所并通過快速鏈接連接到Internet,但是使用托管在"云中"的計算機是更常見的。 這實際上意味著你的代碼在托管公司的數(shù)據(jù)中心的一些遠程計算機(或可能是一個"虛擬"計算機)上運行。 遠程服務(wù)器通常將以某個價格提供一些保證級別的計算資源(例如CPU,RAM,存儲器存儲器等)和互聯(lián)網(wǎng)連接。
這種可遠程訪問的計算/聯(lián)網(wǎng)硬件被稱為基礎(chǔ)設(shè)施即服務(wù)(IaaS)。 許多IaaS供應(yīng)商提供了預(yù)安裝特定操作系統(tǒng)的選項,必須在其上安裝生產(chǎn)環(huán)境的其他組件。 其他供應(yīng)商允許您選擇更多功能齊全的環(huán)境,可能包括完整的節(jié)點設(shè)置。
注意:預(yù)建環(huán)境可以簡化網(wǎng)站設(shè)置,因為它們會減少配置,但可用選項可能會限制您訪問不熟悉的服務(wù)器(或其他組件),并且可能基于舊版本 版本的操作系統(tǒng)。 通常最好自己安裝組件,以便獲得所需的組件,當需要升級系統(tǒng)的某些部分時,您可以從哪里開始!
其他托管提供商將Express作為平臺即服務(wù)( PaaS )產(chǎn)品的一部分提供支持。 當使用這種托管時,您不需要擔心大多數(shù)生產(chǎn)環(huán)境(服務(wù)器,負載平衡器等),因為主機平臺會為您處理這些環(huán)境。 這使得部署很容易,因為您只需要專注于您的Web應(yīng)用程序,而不是任何其他服務(wù)器基礎(chǔ)設(shè)施。
一些開發(fā)人員將選擇IaaS通過PaaS提供的更大的靈活性,而另一些開發(fā)人員將會喜歡減少維護開銷和更輕松地擴展PaaS。 當您開始使用時,在PaaS系統(tǒng)上設(shè)置您的網(wǎng)站要容易得多,因此這是我們將在本教程中做的。
提示:如果您選擇了一個Node / Express-friendly托管服務(wù)提供商,他們應(yīng)該提供有關(guān)如何使用不同配置的網(wǎng)絡(luò)服務(wù)器,應(yīng)用服務(wù)器,逆向代理等設(shè)置快捷網(wǎng)站的說明。例如, 是數(shù)字海洋節(jié)點社區(qū)docs "中的各種配置的許多分步指南 >。
有許多托管服務(wù)提供商已知可以使用 Node (和 Express )來積極支持或工作良好。 這些供應(yīng)商以不同的價格提供不同類型的環(huán)境(IaaS,PaaS)以及不同級別的計算和網(wǎng)絡(luò)資源。
提示:有很多托管解決方案,其服務(wù)和定價可能會隨時間而變化。 雖然我們在下面介紹幾個選項,值得在選擇主機提供商之前執(zhí)行自己的互聯(lián)網(wǎng)搜索。
選擇主機時需要考慮的事項:
當你開始的好消息是,有相當多的網(wǎng)站提供"免費"的計算環(huán)境,盡管有一些條件。 例如, Heroku 提供了一個免費但資源有限的"永久"PaaS 環(huán)境,而 亞馬遜網(wǎng)絡(luò)服務(wù)和 https://azure.microsoft.com/en-us/pricing/details/app-service/"class ="external"> Microsoft Azure 在您首次加入時提供免費贈送金額。 許多提供商還具有提供更有用的計算能力和較少限制的"基本"層。 數(shù)字海洋是一個流行的托管服務(wù)提供商的示例,提供相對便宜的基本計算層(每月5美元 寫入時的下限)。
請注意:請記住,價格不是唯一的選擇條件。 如果你的網(wǎng)站是成功的,可能會證明可擴展性是最重要的考慮。
發(fā)布網(wǎng)站時要考慮的主要因素是網(wǎng)絡(luò)安全和性能。 最低限度,您將希望刪除開發(fā)過程中包含在錯誤頁面上的堆棧跟蹤,清理日志記錄,并設(shè)置適當?shù)臉祟^以避免許多常見的安全威脅。
在以下小節(jié)中,我們概述了您應(yīng)該對應(yīng)用進行的最重要的更改。
提示:Express文檔中還提供了其他有用的提示 - 請參閱 >生產(chǎn)最佳做法:性能和可靠性和生產(chǎn)最佳實踐:安全 / a>。
我們可以通過將 NODE_ENV
環(huán)境變量設(shè)置為生產(chǎn)(默認情況下設(shè)置為" development ")來刪除錯誤頁面中的堆棧跟蹤。 除了生成較少詳細的錯誤消息,將變量設(shè)置為 緩存視圖模板和從CSS擴展生成的CSS文件。 測試表明將 NODE_ENV
設(shè)置為生產(chǎn)可以將應(yīng)用性能提高三倍!
可以通過使用導(dǎo)出或環(huán)境文件或使用OS初始化系統(tǒng)進行此更改。
注意:這實際上是您在環(huán)境設(shè)置中所做的更改,而不是您的應(yīng)用,但重要的是足以在此處注釋! 我們將展示如何為我們的主機示例設(shè)置如下。
記錄呼叫可能會對高流量網(wǎng)站產(chǎn)生影響。 在生產(chǎn)環(huán)境中,您可能需要記錄網(wǎng)站活動(例如跟蹤流量或記錄API調(diào)用),但您應(yīng)該嘗試最小化為調(diào)試目的添加的日志量。
減少生產(chǎn)中"調(diào)試"日志記錄的一種方法是使用類似于調(diào)試的模塊, 通過設(shè)置環(huán)境變量來控制執(zhí)行什么日志記錄。 例如,下面的代碼片段顯示了如何設(shè)置"作者"日志記錄。 調(diào)試變量使用名稱"author"聲明,并且將自動顯示來自此對象的所有日志的前綴"author"。
var debug = require('debug')('author'); // Display Author update form on GET exports.author_update_get = function(req, res, next) { req.sanitize('id').escape().trim(); Author.findById(req.params.id, function(err, author) { if (err) { debug('update error:' + err); return next(err); } //On success res.render('author_form', { title: 'Update Author', author: author }); }); };
然后,您可以通過在 DEBUG
環(huán)境變量中將它們指定為逗號分隔列表來啟用特定的一組日志。 您可以設(shè)置顯示作者和書籍日志的變量,如圖所示(也支持通配符)。
#Windows set DEBUG=author,book #Linux export DEBUG="author,book"?
挑戰(zhàn):調(diào)用 debug
可以替換以前使用 console.log()
或 console.error
/ code>。 使用調(diào)試代碼中的 console.log()
a>模塊。 通過設(shè)置DEBUG變量并在開發(fā)環(huán)境中打開和關(guān)閉日志記錄,并觀察其對日志記錄的影響。
如果您需要記錄網(wǎng)站活動,您可以使用日志庫,如 Winston 或 Bunyan 。 有關(guān)此主題的詳情,請參閱:生產(chǎn)最佳做法:性能和可靠性 。
Web服務(wù)器通??梢詨嚎s發(fā)送回客戶端的HTTP響應(yīng),從而顯著減少客戶端獲取和加載頁面所需的時間。 所使用的壓縮方法將取決于客戶端在請求中支持哪些解壓縮方法(如果不支持壓縮方法,則將以未壓縮的方式發(fā)送響應(yīng))。
您可以使用壓縮中間件將其添加到您的網(wǎng)站。 通過在項目的根目錄運行以下命令將其安裝到您的項目。
npm install compression --save
打開 ./ app.js 并需要如圖所示的壓縮庫。 使用 use()
方法將壓縮庫添加到中間件鏈(這應(yīng)該出現(xiàn)在任何你想要壓縮的路由之前 - 在這種情況下,所有的路由!)
var catalog = require('./routes/catalog'); //Import routes for "catalog" area of site var compression = require('compression'); // Create the Express application object var app = express(); ... app.use(compression()); //Compress all routes app.use(express.static(path.join(__dirname, 'public'))); app.use('/', index); app.use('/users', users); app.use('/catalog', catalog); ?// Add catalog routes to middleware chain. ...
注意:對于正在投放的高流量網(wǎng)站,您不會使用此中間件。 相反,您將使用一個反向代理,如 Nginx 。
頭盔是一個中間件軟件包,可以通過設(shè)置適當?shù)木W(wǎng)址來幫助保護您的應(yīng)用免受某些著名的網(wǎng)絡(luò)漏洞 HTTP標頭(請參閱文檔,了解其設(shè)置的標頭/防護的漏洞的詳細信息)。
通過在項目的根目錄運行以下命令將其安裝到您的項目。
npm install helmet --save
打開 ./ app.js 并需要頭盔庫,如圖所示。 然后使用 use()
方法將模塊添加到中間件鏈。
var compression = require('compression'); var helmet = require('helmet'); // Create the Express application object var app = express(); app.use(helmet()); ...
請注意:上述命令會添加可用標頭的子集,這對大多數(shù)網(wǎng)站都有意義。 您可以按照 npm 上的說明,根據(jù)需要添加/停用特定標題。
本部分提供了如何在 Heroku PaaS云上安裝 LocalLibrary 的實際演示。
Heroku是最長時間運行和流行的基于云的PaaS服務(wù)之一。 它最初僅支持Ruby應(yīng)用程序,但現(xiàn)在可以用于托管來自許多編程環(huán)境的應(yīng)用程序,包括Node(因此Express)!
我們選擇使用Heroku有幾個原因:
雖然Heroku是主辦此演示的完美,它可能不是完美的您的真正的網(wǎng)站。 Heroku使事情容易建立和擴展,以更低的靈活性為代價,并且潛在地,一旦你走出免費層,更昂貴。
Heroku在一個或多個" Dynos "中運行網(wǎng)站,這些網(wǎng)站是孤立的,虛擬化的Unix容器,提供 運行應(yīng)用程序所需的環(huán)境。 動態(tài)鏈接是完全隔離的,并且具有一個臨時的文件系統(tǒng)(一個短暫的文件系統(tǒng),每次重新啟動時被清除/清空)。 dynos在默認情況下唯一共享的是應(yīng)用程序配置變量。 Heroku內(nèi)部使用負載均衡器將網(wǎng)絡(luò)流量分發(fā)到所有"網(wǎng)絡(luò)"動態(tài)。 由于它們之間沒有共享,Heroku可以通過添加更多的dynos來水平擴展應(yīng)用程序(當然,您可能還需要擴展數(shù)據(jù)庫以接受其他連接)。
由于文件系統(tǒng)是臨時的,因此您無法直接安裝應(yīng)用程序所需的服務(wù)(例如數(shù)據(jù)庫,隊列,緩存系統(tǒng),存儲,電子郵件服務(wù)等)。 相反,Heroku Web應(yīng)用程序使用由Heroku或第三方提供的獨立"附加組件"的后勤服務(wù)。 一旦附加到您的Web應(yīng)用程序,附加服務(wù)通過環(huán)境變量在您的Web應(yīng)用程序中訪問。
為了執(zhí)行您的應(yīng)用程序,Heroku需要能夠設(shè)置適當?shù)沫h(huán)境和依賴關(guān)系,并且還了解如何啟動它。 對于Node應(yīng)用程序,需要的所有信息都從 package.json 文件中獲取。
開發(fā)人員使用特殊的客戶端應(yīng)用程序/終端與Heroku交互,這很像Unix bash腳本。 這允許您上傳存儲在git存儲庫中的代碼,檢查正在運行的進程,查看日志,設(shè)置配置變量,以及更多!
為了讓我們的應(yīng)用程序在Heroku上工作,我們需要將Express Web應(yīng)用程序放入git存儲庫,并對package.json進行一些小的更改。 一旦我們完成,我們可以設(shè)置一個Heroku帳戶,獲得Heroku客戶端,并使用它來安裝我們的網(wǎng)站。
這是您開始使用所需的全部概述(請參閱帶有節(jié)點的Heroku入門 .js 以獲得更全面的指南)。
Heroku與 git 源代碼版本控制系統(tǒng)緊密集成,使用它來上傳/同步對實時系統(tǒng)所做的任何更改。 它通過添加一個名為 heroku 的新Heroku"遠程"存儲庫來指向Heroku云上的源代碼庫。 在開發(fā)過程中,您可以使用git將更改存儲在"主"存儲庫中。 當您想部署您的網(wǎng)站時,您將更改同步到Heroku存儲庫。
注意:如果您習(xí)慣于遵循良好的軟件開發(fā)實踐,您可能已經(jīng)在使用git或其他一些SCM系統(tǒng)。 如果你已經(jīng)有一個git存儲庫,那么你可以跳過這一步。
有很多方法可以使用git,但最簡單的方法之一是首先在 GitHub 上設(shè)置帳戶 ,在那里創(chuàng)建存儲庫,然后在本地同步它:
現(xiàn)在創(chuàng)建了存儲庫("repo"),我們將要在我們的本地計算機上克隆它:
git clone https://github.com/<your_git_user_id>/express-local-library.gitThis will create the repository below the current point.
cd express-local-library
最后一步是在應(yīng)用程序中復(fù)制,然后使用git將文件添加到您的repo中:
add
command to add all files to git.git add -A
> git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: ? (use "git reset HEAD <file>..." to unstage) ? ? ? ? new file: ? ...
git commit -m "First version of application moved into github"
git push origin master
當此操作完成后,您應(yīng)該可以返回到Github上您創(chuàng)建repo的頁面,刷新頁面,并看到您的整個應(yīng)用程序現(xiàn)在已上傳。 當文件更改時,您可以使用add / commit / push循環(huán)繼續(xù)更新存儲庫。
提示:這是備份您的"vanilla"項目的好方法,雖然我們將在以下部分進行的一些更改可能有助于在任何平臺上部署 或發(fā)展)其他可能不。
最好的方法是使用 git 來管理您的修訂版本。 使用 git ,你不僅可以回到一個特定的舊版本,但你可以保持在一個單獨的"分支"從生產(chǎn)變化和櫻桃選擇任何變化在生產(chǎn)和開發(fā)分支之間移動。 學(xué)習(xí)Git 是非常值得的努力, 但超出了本主題的范圍。
最簡單的方法是將檔案復(fù)制到其他位置。 使用最好匹配你的git知識的方法!
本部分介紹了您需要對我們的 LocalLibrary 應(yīng)用程序進行的更改,以使其在Heroku上運行。
package.json 包含了解您的應(yīng)用程序依賴關(guān)系以及應(yīng)啟動哪個文件來啟動您的網(wǎng)站所需的一切。 Heroku檢測到此文件的存在,并將使用它來調(diào)配應(yīng)用程序環(huán)境。
在我們當前的 package.json 中缺少的唯一有用的信息是節(jié)點的版本。 我們可以通過輸入命令找到我們用于開發(fā)的節(jié)點的版本:
>node --version v6.9.1
打開 package.json ,并將此信息添加為 engines> 節(jié)點部分(使用系統(tǒng)的版本號)。
{ "name": "express-locallibrary-tutorial", "version": "0.0.0", "engines": { "node": "6.9.1" }, "private": true, ? ...
到目前為止,在本教程中,我們使用了一個硬編碼到 app.js 中的單個數(shù)據(jù)庫。 通常,我們希望能夠有一個不同的數(shù)據(jù)庫用于生產(chǎn)和開發(fā),所以接下來我們將修改LocalLibrary網(wǎng)站,以從操作系統(tǒng)環(huán)境(如果已定義)獲取數(shù)據(jù)庫URI,否則使用我們的開發(fā)數(shù)據(jù)庫 。
打開 app.js ,找到設(shè)置mongoDB連接變量的行。 它看起來像這樣:
var mongoDB = 'mongodb://your_user_id:your_password@ds119748.mlab.com:19748/local_library';
使用 process.env.MONGODB_URI
的代碼替換該行,以獲取來自名為 MONGODB_URI
的環(huán)境變量的連接字符串(如果已設(shè)置) 而不是下面的占位符。)
var mongoDB = process.env.MONGODB_URI || 'mongodb://your_user_id:your_password@ds119748.mlab.com:19748/local_library';
在我們繼續(xù)之前,讓我們再次測試網(wǎng)站,并確保它不受我們的任何更改的影響。
首先,我們需要獲取我們的依賴(你會記得我們沒有將 node_modules 文件夾復(fù)制到我們的git樹中)。 您可以通過在項目根目錄下的終端中運行以下命令來實現(xiàn)此目的:
npm install
現(xiàn)在運行網(wǎng)站(請參閱相關(guān)命令的測試路由),并檢查網(wǎng)站是否仍按預(yù)期運行。
接下來讓我們保存我們對Github的所有更改。 在終端(在我們的倉庫里面),輸入以下命令:
git add -A git commit -m "Added files and changes required for deployment to heroku" git push origin master
我們現(xiàn)在應(yīng)該可以開始在Heroku上部署 LocalLibrary 。
要開始使用Heroku,您需要先創(chuàng)建一個帳戶(如果您已經(jīng)有帳戶并安裝了Heroku客戶端,請先跳過創(chuàng)建和上傳網(wǎng)站):
按照 Heroku此處的說明
客戶端安裝后,您將能夠運行命令。 例如獲得客戶端的幫助:
heroku help
要創(chuàng)建應(yīng)用程序,我們在存儲庫的根目錄中運行"create"命令。 這會在我們的本地git環(huán)境中創(chuàng)建一個名為 heroku 的git遠程("指向遠程存儲庫的指針")。
heroku create
注意:如果您愿意,可以在"創(chuàng)建"后指定值來命名遠程。 如果你不這樣,你會得到一個隨機的名字。 該名稱在默認URL中使用。
然后我們可以將我們的應(yīng)用程序推送到Heroku存儲庫,如下所示。 這將上傳的應(yīng)用程序,獲取所有的依賴,打包在一個動態(tài),并啟動網(wǎng)站。
git push heroku master
如果我們幸運,該應(yīng)用程序現(xiàn)在"運行"在網(wǎng)站上。 要打開瀏覽器并運行新網(wǎng)站,請使用命令:
heroku open
注意:網(wǎng)站將使用我們的開發(fā)數(shù)據(jù)庫運行。 創(chuàng)建一些書和其他對象,并檢查網(wǎng)站是否按照您的期望行為。 在下一節(jié)中,我們將它設(shè)置為使用我們的新數(shù)據(jù)庫。
您將記得前一節(jié)中的內(nèi)容,我們需要將NODE_ENV設(shè)置為"production",以提高性能并生成較少詳細的錯誤消息。 我們通過輸入以下命令來執(zhí)行此操作:
>heroku config:set NODE_ENV='production' Setting NODE_ENV and restarting limitless-tor-18923... done, v13 NODE_ENV: production
我們還應(yīng)使用單獨的數(shù)據(jù)庫進行生產(chǎn),并在 MONGODB_URI 環(huán)境變量中設(shè)置其URI。 您可以完全設(shè)置新的數(shù)據(jù)庫和數(shù)據(jù)庫用戶,因為我們原來 ,并獲取其URI。 您可以設(shè)置URI如圖所示(顯然,使用您自己的URI!)
>heroku config:set MONGODB_URI='mongodb://your_user:your_password@ds139278.mlab.com:39278/local_library_production' Setting MONGODB_URI and restarting limitless-tor-18923... done, v13 MONGODB_URI: mongodb://your_user:your_password@ds139278.mlab.com:39278/local_library_production
您可以隨時使用 heroku config
命令檢查配置變量 - 立即嘗試:
>heroku config === limitless-tor-18923 Config Vars MONGODB_URI: mongodb://your_user:your_password@ds139278.mlab.com:39278/local_library_production NODE_ENV: ? ?production
Heroku會在更新變量時重新啟動您的應(yīng)用程序。 如果你現(xiàn)在檢查主頁,它應(yīng)該顯示零值的對象計數(shù),因為上面的更改意味著我們現(xiàn)在使用一個新的(空)數(shù)據(jù)庫。
Heroku使用獨立的附加組件為應(yīng)用程序提供后備服務(wù),例如電子郵件或數(shù)據(jù)庫服務(wù)。 我們不在本網(wǎng)站使用任何插件,但他們是與Heroku合作的重要組成部分,因此您可能想查看主題 add-ons"class ="external">管理加載項(Heroku docs)。
Heroku客戶端提供了一些調(diào)試工具:
heroku logs # Show current logs heroku logs --tail # Show current logs and keep updating with any new results heroku ps #Display dyno status
這是本教程關(guān)于在生產(chǎn)中設(shè)置快速應(yīng)用程序的結(jié)束,以及關(guān)于使用Express的一系列教程。 我們希望你發(fā)現(xiàn)它們有用。 您可以在此處查看源代碼的全面翻譯版本。
更多建議: