環境介紹
本地:Window 10.11.4,應用採用的技術:Node.js + Express.js
遠端服務器:阿里雲ECS(1核CPU、1GB內存),IP:47.98.154.75,系統爲Ubunt
Github:賬戶名:awhlmycn
系統架構
服務器部署Node的應用,並在3000端口進行監聽。本地代碼開發測試後,更新到Github私人倉庫。然後通過pm2部署遠程服務器。
服務器端安裝必要的軟件
擬安裝如下應用:Node、npm、pm2。
通過預留的賬號密碼登錄系統,終端中輸入:
ssh root@47.98.154.75
更新軟件:
sudo apt-get update
更新完畢後,安裝Node.js:
sudo apt-get install nodejs
安裝pm2:
npm install pm2 -g
(可選)服務器端創建新用戶
爲服務器安全起見,創建用戶(用戶名:yishi):
useradd yishi
設置密碼:
passwd yishi
添加sudo權限:
usermod -aG wheel yishi
(可選)服務器端關閉root用戶的ssh訪問:
爲服務器安全起見,關閉root賬戶的遠程訪問。
打開配置文件:
vi /etc/ssh/sshd_config
找到如下設置,並修改yes爲no:
PermitRootLogin no
保存文件後,重啓sshd服務:
service sshd restart
退出root賬戶,並使用新創建用戶訪問。
本地安裝pm2
Windows中,由於已經具備了node以及npm,再次不介紹如何安裝上述兩個軟件了。與服務器端類似,通過如下命令安裝pm2:
npm install pm2 -g
如果可得到版本號,則說明安裝成功:
pm2 -v
設置Github倉庫
此處爲方便演示,我們在Github上新建一個私人(private)倉庫,名爲myWeb
倉庫創建後,還需要設置Deploy keys,依次點擊Settings > Deploy keys > Add deploy key。其中的Key部分,可以在服務器端上通過ssh-keygen生成,並通過
cat ~/.ssh/id_rsa.pub
即可輸出。輸出後,複製到deploy key中點擊Add key,完成設置。
完成上述設置後,需要本地的應用代碼關聯此Github倉庫,按照Github官網的介紹,通過在本地應用下執行:
git remote add origin https://github.com/awhlmycn/myWeb.git
git push -u origin master
來完成設置。
本地pm2的ecosystem配置
在本地的目標應用下,輸入:
pm2 ecosystem
生成pm2的部署配置模板文件如下:
{
/**
* Application configuration section
* PM2 - Application Declaration
*/
apps : [
// First application
{
name : "API",
script : "app.js",
env: {
COMMON_VARIABLE: "true"
},
env_production : {
NODE_ENV: "production"
}
},
// Second application
{
name : "WEB",
script : "web.js"
}
],
/**
* Deployment section
* PM2 - Deployment
*/
deploy : {
production : {
user : "node",
host : "47.98.154.75",
ref : "origin/master",
repo : "[email protected]:awhlmycn/myWeb.git",
path : "/home/temp",
"post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env production"
},
dev : {
user : "node",
host : "47.98.154.75",
ref : "origin/master",
repo : "[email protected]:repo.git",
path : "/home/temp",
"post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env dev",
env : {
NODE_ENV: "dev"
}
}
}
}
應爲目前我們僅部署一個應用,因此,先把不必要的信息刪除,即刪除apps部分的第二項。同時把我們的目標文件改爲你應用的入口文件,此處修改爲Express.js的默認設置,即:
script : "./bin/www",
apps部分就設置完畢了,然後再設置deploy部分。其中production用於生產環境,dev用於開發環境,爲了演示,我們只設置production部分。
下面依次介紹各個設置:
production : {
user : "登錄遠程服務器的用戶名,此處填寫我們創建的yishi",
host : "遠程服務器的IP或hostname,此處可以是數組同步部署多個服務器,不過鑑於我們只有一個服務器,因此我們填寫123.57.205.23",
ref : "遠端名稱及分支名,此處填寫origin/master",
repo : "git倉庫地址,此處填寫[email protected]:e10101/pm2app.git",
path : "遠程服務器部署目錄,需要填寫user具備寫入權限的目錄,此處填寫/home/yishi/www/production",
"post-deploy" : "部署後需要執行的命令,此處填寫npm install && pm2 startOrRestart ecosystem.json --env production"
},
整理後,按照我們的設置,應爲:
production: {
user: "yishi",
host: "47.98.154.75",
ref: "origin/master",
repo: "[email protected]:awhlmycn/myWeb.git",
path: "/home/temp",
"post-deploy": "npm install && pm2 startOrRestart ecosystem.json --env production"
},
因爲pm2的部署是通過ssh進行的,因此需要開通本地到遠程服務器的無密碼登錄,同樣,在Mac下,通過ssh-keygen生成RSA公鑰,並拷貝到遠程服務器:
scp ~/.ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys
上述命令中的root爲用戶名,執行時需要替換爲你設置的用戶名。
設置ssh完畢後,再看看整理完畢的ecosystem配置文件,如下:
{
/**
* Application configuration section
* PM2 - Application Declaration
*/
apps : [
// First application
{
name : "pm2app",
script : "./bin/www",
env: {
COMMON_VARIABLE: "true"
},
env_production : {
NODE_ENV: "production"
}
}
],
/**
* Deployment section
* PM2 - Deployment
*/
deploy : {
production : {
user: "yishi",
host: "47.98.154.75",
ref: "origin/master",
repo: "[email protected]:awhlmycn/myWeb.git",
path: "/home/temp",
"post-deploy": "npm install && pm2 startOrRestart ecosystem.json --env production"
}
}
}
在本地應用目錄下,執行pm2 deploy命令:
pm2 deploy ecosystem.json production setup
提示錯誤:
Host key verification failed. fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. failed to clone Deploy failed
此時主要是在遠程服務器中,並未將http://github.com加入known_hosts,在服務器端通過如下命令設置:
如果代碼是放在碼雲上面 則 應該將 gitee.com 加入known_host,在服務器通過如下命令設置:
ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
ssh-keyscan -t rsa gitee.com >> ~/.ssh/known_hosts
問題一:
Warning: Permanently added the RSA host key for IP address '52.74.223.119' to the list of known host
這個的主要原因是沒有把 52.74.223.119 加入到 vim /etc/hosts
解決方法 : 52.74.223.119 github.com
問題二 :
git使用時遭遇 the authenticity of host cant't be established
解決方法 : 在/etc/ssh/ssh_config文件的配置下面加上
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
然後重啓ssh : service ssh restart
在本地繼續執行部署命令:
pm2 deploy ecosystem.json production setup
此時,如無其他問題,輸出應提示:
○ setup complete
--> Success
至此,pm2的部署設置完畢。
pm2部署
pm2的部署設置完畢後,接下來就是實際部署了。
在部署前,現將本地代碼修改並進行git提交:
git add .
git commit -m "update ecosystem"
git push
提交後,在本地應用目錄,輸入如下命令進行生產環境的部署:
pm2 deploy ecosystem.json production
可以看到如下輸出:
[PM2][WARN] Applications pm2app not running, starting...
[PM2] App [pm2app] launched (1 instances)
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ pm2app │ 0 │ fork │ 1028 │ online │ 0 │ 0s │ 11.246 MB │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
○ hook test
○ successfully deployed origin/master
--> Success
部署成功,在遠程服務器查看端口情況:
netstat -antp
可以看到應用默認部署的3000端口已經開放了。通過瀏覽器打開:
http://47.98.154.75:3000/
可以看到部署的Web應用可以訪問了。(如果netstat -antp中可見3000端口可訪問,可以檢查下ECS的防火牆設置,確保3000端口對外開放)
pm2其他命令
應用列表:
pm2 list
應用信息(查看應用編號爲0的信息):
pm2 show 0
(重要)服務器端設置pm2開機自動啓動
開啓啓動設置,此處是CentOS系統,其他系統替換最後一個選項(可選項:ubuntu, centos, redhat, gentoo, systemd, darwin, amazon):
pm2 startup centos
然後按照提示需要輸入的命令進行輸入:
sudo su -c "env PATH=$PATH:/usr/bin pm2 startup centos -u root --hp /home/temp"
保存pm2設置:
pm2 save
現在重新啓動系統,測試是否可以開機啓動:
sudo reboot
等系統重啓後,通過瀏覽器檢查系統是否自動啓動:
http://47.98.154.75:3000/
如果啓動正常,說明設置成功!
以上就是如何通過pm2部署Node應用到服務器生成環境的總結。
參考
其他PM
- StrongLoop Process Manager StrongLoop
- GitHub - foreverjs/forever: A simple CLI tool for ensuring that a given script runs continuously (i.e. forever) Forever
PM2相關
- PM2 - Deployment PM2部署設置
- PM2 - Startup Script PM2開機啓動設置
- How To Set Up a Node.js Application for Production on CentOS 7
- Process managers for Express apps
- GitHub - Unitech/pm2-deploy: Deploy part of PM2
- PM2 Restart Processes After System Reboot PM2隨系統重啓
- Deploying Node.js Applications with PM2 另一個部署教程
服務器部署及Nginx設置(此部分在本文中暫未涉及)
- 如何在生產服務器上部署 Node.js 應用? - Nginx 知乎上的討論
- Hosting & Deploying NodeJS Apps on CentOS 7
- How To Set Up nginx Virtual Hosts (Server Blocks) on CentOS 6
- Express behind proxies
- reverse proxy
- 服務器部署 | Node.js實戰
- Performance Best Practices Using Express in Production Express最佳實戰
- GitHub - chovy/git-deploy-node: Deploy a node app using git for continuous deployment.
Git相關
- Git - Working with Remotes
- Managing deploy keys
- Automating deployments to integrators 另一種部署方案,從Github直接部署到其他平臺中去,用的Webhooks技術
異常處理參考