1. 程式人生 > >Centos 7 上利用pm2部署 nodejs 程式

Centos 7 上利用pm2部署 nodejs 程式

本文探索如何利用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 pm2@latest
-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版本。

示例程式碼庫

pm2 釋出

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

前提條件


  • 釋出機器(可以是你的laptop)可以ssh到目標伺服器
  • 目標伺服器可以ssh到git拉去程式碼
github上的開原始碼不需要ssh可以直接通過https的連結拉去

配置ssh使用者

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

$ ssh-keygen -t rsa
$ ssh-copy-id node@myserver.com

同樣方式設定目標伺服器 -> 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 osboxes@192.168.1.186
/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
osboxes@192.168.1.186'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.


Administrator@PC-20160321GFRJ MINGW64 ~/.ssh
$ ssh osboxes@192.168.1.186
Last login: Wed Jul  5 1

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