如何使用pm2來運行Node.js應用程式
這是一篇介紹如何在Linux上管理Node進程並透過GitHub Webhooks自動重啟它們的技術文章。
pm2是一個非常有用的Linux進程管理工具。
我在幾個項目中使用過它,現在我想告訴你如何使用它!
特別是我將使用它在DigitalOcean VPS上運行一個Node.js應用程式,並設置當我們將應用程式的更新推送到GitHub存儲庫時,pm2將會被觸發,從GitHub更新應用程式並重啟它。
聽起來很酷吧?那我們開始吧!
首先,在DigitalOcean上註冊並按照我的教程创建一個VPS。
重要提示:在DigitalOcean上使用
NodeJS
映象,它已經設置了pm2
和node
,而且除了root
用戶外還有一個nodejs
用戶。
當你的VPS運行起來之後,我們可以開始了。
確保你使用nodejs
用戶進行ssh登錄。當以root
身份登录時,只需運行su nodejs
以使用該用戶。
你在VPS上運行的示例Node.js應用程式位於/var/www/html/
文件夾中,它由hello.js
文件組成。
應用程式的部署/運行已經通過pm2程序進行管理,它是一個守護進程管理器。
你可以使用pm2 list
命令來查看現在正在運行的所有應用程序:
如果你對應用程式做任何更改,這些更改將在重新啟動應用程式之前不會生效:
1 | pm2 restart hello |
你可以停止正在運行的應用程式:
1 | pm2 stop hello |
如果你嘗試重新加載頁面,這將在瀏覽器中產生一個錯誤:
你可以運行:
1 | pm2 start hello |
將應用程式重新啟動。
pm2的好處是,當系統重新啟動時,它會自動重新運行應用程序。
現在你已經看到了內置的Hello World的運行方式,讓我們部署另一個應用程式。
讓我們停止當前的示例應用程式:
1 | pm2 stop hello |
並在/var/www/html
中創建一個名為test
的文件夾:
1 | mkdir test |
進入該文件夾:
1 | cd test |
運行以下命令:
1 | npm init -y |
然後安裝Express:
1 | npm install express |
現在運行nano app.js
並添加以下代碼:
1 | const express = require("express") |
運行:
1 | pm2 start app.js --name app |
你應該看到應用程式正在運行!
我們使用了3000端口,這就是hello
應用程式使用的端口,所以我們不需要做其他配置。
否則,我們需要修改/etc/nginx/sites-available/default
文件,並添加一個新的URL來映射到我們的應用程式。
現在我們部署了一個示例應用程式,讓我們看看如何從GitHub部署一個應用程式。
首先,讓我們停止剛才在上一節中構建的應用程式:
1 | pm2 stop app |
然後創建一個簡單的GitHub應用程式。這個示例不會很複雜,它非常類似於我們在上一節中構建的應用程式,但它會顯示Hello World, deployed from GitHub!
而不僅僅是Hello World!
在本地創建一個文件夾,在該文件夾中運行以下命令:
1 | npm init -y |
然後安裝Express:
1 | npm install express |
現在運行nano app.js
並添加以下代碼:
1 | const express = require("express") |
現在我們把應用程式推送到GitHub上。我使用的是GitHub桌面版,官方的GitHub應用程式,我只需將該文件夾拖放到該應用程式中,它會讓我創建一個新的Git存儲庫和一個GitHub存儲庫。
我使用了標准的Node.js .gitignore
文件來初始化存儲庫,它忽略了node_modules
文件夾。我們將看到如何在部署期間初始化npm模塊。
現在我們需要在DigitalOcean機器上創建一個SSH密鑰,並將其添加到GitHub。否則,我們將無法訪問剛剛建立的私有存儲庫。
仔細檢查您用於連接到GitHub的電子郵件地址,因為它很重要。您可以在GitHub設置中的電子郵件面板中找到它。然後運行以下命令:
1 | ssh-keygen -t rsa -b 4096 -C "[[email protected]](/cdn-cgi/l/email-protection)" |
現在在GitHub上打開“SSH和GPG金鑰”面板:
然後點擊“New SSH key”。將“DigitalOcean”作為標題,以便你知道此密鑰的用途。
現在在DigitalOcean droplet上運行less /home/nodejs/.ssh/id_rsa.pub
以獲取公鑰。
將其粘貼到您的設置中,然後保存。你應該可以在SSH密鑰列表中看到它。
現在我們應該能夠在服務器上克隆私有存儲庫。
進入/var/www/html
文件夾,並運行以下命令:
1 | git clone [[email protected]](/cdn-cgi/l/email-protection):<yourname>/<reponame>.git |
在我的情況下,它是:
1 | git clone [[email protected]](/cdn-cgi/l/email-protection):flaviocopes/testdo.git |
應用程式被成功下載:
現在輸入cd testdo
,然後運行npm install
。
應用程式現在已準備好運行,所以輸入:
1 | pm2 stop test |
停止先前的應用程式,再運行:
1 | pm2 start app.js --name testdo |
以啟動新的應用程式:
安裝名為pm2-githook
的pm2模塊 https://github.com/vmarchaud/pm2-githook,使用以下命令:
1 | pm2 install pm2-githook |
要配置應用程序,我們需要使用以下命令,該命令需要正確轉義雙引號:
1 | pm2 set pm2-githook:apps "{\"testdo\":{\"secret\":\"test123\",\"prehook\":\"npm install --production\",\"posthook\":\"echo done\"}}" |
在這個示例中,我使用了secret
值test123
,但請將其更改為不容易猜測的值。
默認情況下,此模塊在端口8888上監聽來自GitHub的Webhooks。
現在這個端口是關閉的,使用以下命令打開它:
1 | sudo ufw allow 8888 |
現在在GitHub的存儲庫設置中,在Webhooks部分點擊Add Webhook。
粘貼你網域的URL,加上端口8888。
在這個示例中,我使用了secret
值test123
。
現在,如果你對代碼做了任何更改,它應該會自動部署!
tags: [“pm2”, “node.js”, “Linux”, “GitHub”, “webhooks”, “deployment”]