资讯专栏INFORMATION COLUMN

通过Github与PM2部署Node应用

tianren124 / 2006人阅读

摘要:于是着手将应用迁移到阿里云的上去。环境介绍本地,应用采用的技术远端服务器阿里云核内存,,系统为账户名系统架构服务器部署的应用,并在端口进行监听。通过浏览器打开可以看到部署的应用可以访问了。

背景

前一段时间,是通过百度云的BAE部署自己的Node应用的,不过随着应用的不断开发,BAE的限制不断制约了应用的使用。于是着手将应用迁移到阿里云的ECS上去。本文即是介绍了如何在ECS上搭建Node环境,并将本地制作好的应用进行发布。

环境介绍

本地: Mac OSX 10.11.4,应用采用的技术:Node.js + Express.js

远端服务器:阿里云ECS(1核CPU、1GB内存),IP:123.57.205.23,系统为CentOS7.0

Github:账户名:e10101

系统架构

服务器部署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 ` 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应用到服务器生成环境的总结。

参考

参考部分包含了一些先关链接,详见我的知乎专栏此:

作者:郭一实
链接:https://zhuanlan.zhihu.com/p/20940096
来源:知乎

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39287.html

相关文章

  • 学习 Next.js: 部署

    摘要:原始文档在现在搬过来学习入门学习页面之间的导航学习使用共享组件学习创建动态内容学习使用路由掩码创建干净的学习干净的服务器支持学习获取数据学习部署部署要部署一个应用程序当然我们首先需要一个可部署的已经开发完成的应用程序以下面这个开发的小型博客 原始文档在 https://github.com/developerw... 现在搬过来.学习 Next.js: 入门学习 Next.js: 页面...

    laznrbfe 评论0 收藏0
  • [译] 如果可以,永远不要在生产中直接运行 Node.js

    摘要:就在几周前,我正在和一个朋友谈话,他不经意间提到,你永远都不会在生产中直接使用来运行程序。我强烈点头,表示我也不会在生产中直接运行,原因可能每个人都知道。首先,让我们弄清楚永远不要在生产中直接通过运行程序的说法。 原文地址:You should never ever run directly against Node.js in production. Maybe. 原文作者:Burke ...

    Tony_Zby 评论0 收藏0
  • 使用pm2部署node生产环境

    摘要:一是什么是可以用于生产环境的的进程管理工具,并且它内置一个负载均衡。嗯嗯,最好的用处就是监控我们的生产环境下的程序运行状态,让它给我们日以继日的处于工作状态。部署自动部署,避免逐个在所有服务器中进行。 一、PM2是什么 是可以用于生产环境的Nodejs的进程管理工具,并且它内置一个负载均衡。它不仅可以保证服务不会中断一直在线,并且提供0秒reload功能,还有其他一系列进程管理、监控...

    刘厚水 评论0 收藏0
  • 使用pm2快速将项目部署到远程服务器

    摘要:使用背景当我们需要将项目部署到远程线上服务器时传统的方法可能就是将本地代码通过等方式上传到服务器然后通过登入到服务器,配置好环境手动启动应用。 使用背景 当我们需要将项目部署到远程线上服务器时;传统的方法可能就是: 将本地代码通过ssh、ftp等方式上传到服务器; 然后通过ssh登入到服务器,配置好环境; 手动启动应用。 太过手动化,麻烦,操作繁琐。 现代自动化部署 ...

    wind5o 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<