pm2自动部署与ssh免密登录

这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

准备

安装依赖

在你的本地和远端都要全局安装 pm2

npm install pm2 -g
复制代码

检查远程服务器

  1. 更新 git 版本

我的 git 版本是 2.9.0;否则不能自动执行 git pull,每次部署时的代码都不是最新的

  1. 执行/usr/bin/git是否会弹出 git 命令提示,如果没有弹出就关联一下路径
whereis git

sudo ln -s [真实的git位置] /usr/bin/git
复制代码

否则会报 bash: git: command not found

  1. 查看本地和远端的 PM2 版本号是否一致

基础配置

// ecosystem.config.js

const config = {
    apps: {
        name: 'app name',
        script: './bin/www', // 服务开启的入口文件
    },
    deploy: {
        production: {
            user: 'root', // 远程服务器用户名
            host: ['101.34.36.247'], // 远程服务器ip
            ref: 'origin/master', // PM2自动拉取的git仓库分支
            repo: '[email protected]:mytac/stock-tracker-server.git', // PM2自动拉取的git地址
            path: '/root/my-server', // 拉取后的代码存放到远端的目录位置
        },
    },
}

module.exports = config
复制代码

加上上面那个文件之后,在本地执行

pm2 deploy production setup
复制代码

这句是初始化,如果你的配置文件名不是ecosystem.config.js就要在 deploy 后面写上配置文件的名字执行后,按照指令输入服务器密码,显示成功就代表执行完成了。

之后执行

pm2 deploy production
复制代码

按照提示输入密码,显示成功之后,去远端上执行

pm2 ls
复制代码

多执行几次 pm2 ls ,直到几个应用 status 趋于稳定,如果最终显示 online,如图

说明已经部署成功了,自己可以在线上测一下是否运行成功了。

错误排查

如果 status 显示 error,执行

pm2 logs
复制代码

可以定位到具体的问题。有可能是你本地都起不了服务,也有可能是没有 node_modules。

如果 pm2 logs 不能准确定位到问题,尝试先将 pm2 关闭、重启

pm2 kill

pm2 start
复制代码

,再检查一下错误。

免密操作

在部署的时候,可能会多次弹出让你输入服务器密码,这里需要配下 ssh 免密登录。

在客户端和服务端都要生成一对 ssh 私钥、公钥,如果之前生成过就不用管了

ssh-keygen
复制代码

然后复制客户端的公钥,粘贴到服务端的/root/.ssh/authorized_keys 文件中,之后修改该文件的权限为 600

chmod 600 authorized_keys
复制代码

然后来到客户端,输入命令行

ssh-copy-id -i 客户端的公钥 root@remoteIp
复制代码

这时试一下

ssh root@remoteIp
复制代码

如果可以直接进入说明配置成功,如果不行应该是权限的问题。

成功免密登录之后,在服务端的 /etc/ssh/sshd_config 中 把 PasswordAuthentication 修改为 no,重启 sshd 服务

systemctl restart sshd.service
复制代码

之后就可以免密登录了。(详情见参考文献的第二条)

参考

  1. pm2 官方文档
  2. SSH 关闭远程密码登录---Window&Linux 客户端证书登录&window 找不到 ssh-keygen

Guess you like

Origin juejin.im/post/7032565149894443038