Centos 7 上利用pm2部署 nodejs 程式 – No Jenkins

NO IMAGE

本文探索如何利用pm2 來部署nodejs的程式到centos系統上。

參考資源

版本

git version git version 2.11.1
node -v v8.0.0
pm2 -v 2.5.0

安裝nodejs

參考上面的資源連結,在目標伺服器上安裝nodejs, 本次嘗試採用命令:

curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -
yum -y install nodejs

安裝pm2

npm install [email protected] -g

解決SSH使用者的許可權問題

用root使用者顯然是不推薦的,然後安裝nodejs和npm其他package的安裝,我們可能都是通過sudo來安裝的。當我們釋出程式的時候,我們使用的ssh使用者,這裡必須解決掉npm perssmision的問題。 參考資源給出了很好的官方的指導;本文采用了第一種方式: sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share} 使用這邊命令將owner設定為當前使用者。

網上的很多文章都忽略了這個問題,這裡可以暫時跳過, 到後面的pm2 deploy的時候,問題爆發了再針對性的來解決。

git 安裝

在目標伺服器上安裝git;(如果通過ssh push的方式,目前機器也可以不安裝git)。本次嘗試採用在目標伺服器上直接pull程式碼。git 安裝參考上面的資源連結。 本文采用了第三方repo來簡化安裝。(並非最佳實踐,使用第三方的repo需要三思而後行 , 手動安裝請參考:Git Installing from source

sudo rpm -U http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm 
sudo yum install -y git

git 版本過低可能引發無法pull到最新的程式碼的問題。 Ticket Reference CentOS自帶的repository只有舊版本和最新版本是1.8.x版本。

示例程式碼庫

示例程式碼: https://github.com/choelea/image-utils-web.git branches/pm2-deploy-1

pm2 釋出

參考官方文件, 截止這篇文章的時間,官方文件和程式碼有些不一致;但是不影響其參考價值。

前提條件

  • 釋出機器(可以是你的laptop)可以ssh到目標伺服器
  • 目標伺服器可以ssh到git拉去程式碼

github上的開原始碼不需要ssh可以直接通過https的連結拉去

配置ssh使用者

一般的雲伺服器可以通過web介面的console去配置。 如果沒有可以已經有使用者名稱和密碼的登入方式,可以通過下面的命令來設定ssh。(後面有示例)

$ ssh-keygen -t rsa
$ ssh-copy-id [email protected]

同樣方式設定目標伺服器 -> git 伺服器的ssh訪問。

建立deploy的配置檔案

通過pm2 ecosystem 生成模板進行修改。 可以是json,js,yaml 檔案;優選前兩種。

module.exports = {
/**
* Application configuration section
* http://pm2.keymetrics.io/docs/usage/application-declaration/
*/
apps : [
// First application
{
name      : 'image-utils-web',
script    : 'server.js',
// env: {  If we don't comment here, it will override below deploy config
//   PORT: 3011
// },
env_production : {
NODE_ENV: 'production'
}
}
],
/**
* Deployment section
* http://pm2.keymetrics.io/docs/usage/deployment/
*/
deploy : {
production : {
user : 'joe',// ssh 使用者名稱
host : '192.168.1.188', // 目標伺服器地址
ref  : 'origin/master',
repo : 'https://github.com/choelea/image-utils-web.git',
path : '/home/joe/nodejsapp/nodejs-playaround', // 目標伺服器部署地址
'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production'
},
dev : {
user : 'osboxes',
host : '192.168.1.186',
ref  : 'origin/master',
repo : 'https://github.com/choelea/image-utils-web.git',
path : '/home/osboxes/temp',
'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env dev',
env  : {
NODE_ENV: 'dev',
PORT: 3012
}
}
}
};

執行命令pm2 deploy ecosystem.config.js dev 即可進行對應環境的部署。(部署前需要執行pm2 deploy ecosystem.config.js dev setup 來建立對應的資料夾。一般會有current,shared, source 三個資料夾,current是個軟連線指向了source

示例:

本地虛擬機器測試示例:

如下是利用本地已經生成好的公私鑰(id_rsa, id_rsa.pub),將公鑰上傳至目標伺服器192.168.1.186繫結使用者osboxes。

$ ssh-copy-id -i id_rsa.pub [email protected]
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter                                                             out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompt                                                            ed now it is to install the new keys
[email protected]'s password:
Number of key(s) added: 1
Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
[email protected] MINGW64 ~/.ssh
$ ssh [email protected]
Last login: Wed Jul  5 1

windows 系統預設沒有ssh命令,如果安裝了有git,可以通過git bash來執行ssh的命令。