經過Github與PM2部署Node應用

做者:郭一實
連接:https://zhuanlan.zhihu.com/p/20940096
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。node

背景git

前一段時間,是經過百度雲的BAE部署本身的Node應用的,不過隨着應用的不斷開發,BAE的限制不斷制約了應用的使用。因而着手將應用遷移到阿里雲的ECS上去。本文便是介紹瞭如何在ECS上搭建Node環境,並將本地製做好的應用進行發佈。github

環境介紹web

本地:Mac OSX 10.11.4,應用採用的技術:Node.js + Express.jsnpm

遠端服務器:阿里雲ECS(1核CPU、1GB內存),IP:123.57.205.23,系統爲CentOS7.0json

Github:帳戶名:e10101ubuntu

系統架構centos

服務器部署Node的應用,並在3000端口進行監聽。本地代碼開發測試後,更新到Github私人倉庫。而後經過pm2部署遠程服務器。數組

服務器端安裝必要的軟件瀏覽器

擬安裝以下應用:Node、npm、pm2。

經過預留的帳號密碼登陸系統,終端中輸入:

ssh root@123.57.205.23
更新軟件:

yum update -y
更新完畢後,安裝Node.js:

yum install nodejs -y
安裝Npm:

yum install yum -y
安裝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

Macbook中,因爲已經具有了node以及npm,再次不介紹如何安裝上述兩個軟件了。與服務器端相似,經過以下命令安裝pm2:

npm install pm2 -g
若是可獲得版本號,則說明安裝成功:

pm2 -v
設置Github倉庫

此處爲方便演示,咱們在Github上新建一個私人(private)倉庫,名爲pm2app。

倉庫建立後,還須要設置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/e10101/pm2app.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 : "212.83.163.1",
      ref  : "origin/master",
      repo : "git@github.com:repo.git",
      path : "/var/www/production",
      "post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env production"
    },
    dev : {
      user : "node",
      host : "212.83.163.1",
      ref  : "origin/master",
      repo : "git@github.com:repo.git",
      path : "/var/www/development",
      "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倉庫地址,此處填寫git@github.com:e10101/pm2app.git",
      path : "遠程服務器部署目錄,須要填寫user具有寫入權限的目錄,此處填寫/home/yishi/www/production",
      "post-deploy" : "部署後須要執行的命令,此處填寫npm install && pm2 startOrRestart ecosystem.json --env production"
    },
整理後,按照咱們的設置,應爲:

production: {
  user: "yishi",
  host: "123.57.205.23",
  ref: "origin/master",
  repo: "git@github.com:e10101/pm2app.git",
  path: "/home/yishi/www/production",
  "post-deploy": "npm install && pm2 startOrRestart ecosystem.json --env production"
},
由於pm2的部署是經過ssh進行的,所以須要開通本地到遠程服務器的無密碼登陸,一樣,在Mac下,經過ssh-keygen生成RSA公鑰,並拷貝到遠程服務器:

scp ~/.ssh/id_rsa.pub yishi@123.57.205.23:/home/yishi/.ssh/authorized_keys
上述命令中的yishi爲用戶名,執行時須要替換爲你設置的用戶名。

設置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: "123.57.205.23",
      ref: "origin/master",
      repo: "git@github.com:e10101/pm2app.git",
      path: "/home/yishi/www/production",
      "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,在服務器端經過以下命令設置:

ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
在本地繼續執行部署命令:

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://123.57.205.23: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 yishi --hp /home/yishi"
保存pm2設置:

pm2 save
如今從新啓動系統,測試是否能夠開機啓動:

sudo reboot
等系統重啓後,經過瀏覽器檢查系統是否自動啓動:

http://123.57.205.23:3000/
若是啓動正常,說明設置成功!

以上就是如何經過pm2部署Node應用到服務器生成環境的總結。

相關文章
相關標籤/搜索