pm2 和github上面的自動部署

環境介紹

本地: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

此時主要是在遠程服務器中,並未將github.com加入known_hosts,在服務器端通過如下命令設置:

如果代碼是放在碼雲上面 則 應該將 gitee.com 加入known_host,在服務器通過如下命令設置:

ssh-keyscan -t rsa github.com >> ~/.ssh/known_hostsssh-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


PM2相關

服務器部署及Nginx設置(此部分在本文中暫未涉及)

Git相關


異常處理參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章