Centos 7 上利用pm2部署 nodejs 程序 - No Jenkins

本文介绍如何使用PM2在CentOS系统上部署Node.js应用程序,包括安装Node.js、PM2及Git,解决权限问题,并通过示例展示如何配置PM2进行自动化部署。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

示例代码库

示例代码: https://github.com/choelea/image-utils-web.git branches/pm2-deploy-1

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 'osboxes@192.168.1.186'"
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的命令。

<think>嗯,用户问的是怎么在Linux上部署应用。首先,我需要确定用户的具体需求是什么。部署的应用类型有很多,比如Web应用、数据库、或者微服务?不过用户没有具体说明,可能需要给出一个通用的步骤,然后再举几个常见例子。 首先,我得考虑通用步骤。通常部署流程包括准备环境、安装依赖、获取应用代码、配置、启动应用,还有后续的维护。可能还需要提到自动化工具,比如Ansible或者Docker,这样用户可以根据需要选择。 然后,用户可能对Linux不太熟悉,所以步骤要详细,但也不能太复杂。比如,系统更新和依赖安装,可能需要用apt或yum,根据不同的发行版。要提醒用户注意权限问题,可能需要sudo。 接下来,获取应用代码的方式,比如git clone或者下载压缩包。配置部分,环境变量和配置文件的位置,比如/etc目录或者用户目录下的隐藏文件。启动应用的话,如果是服务,可能需要systemd来管理,这样开机启动和日志都方便。 然后,安全方面,防火墙设置,比如ufw或者firewalld,还有SSH的安全配置,比如禁用root登录,使用密钥认证。这些虽然用户没提,但部署时很重要,应该包含进去。 举例部分,选常见的应用,比如Nginx、Node.js应用、Docker部署。Nginx比较简单,安装步骤明确。Node.js应用可能需要PM2来守护进程,Docker的例子可以展示容器化部署的便捷性。 还要考虑用户可能遇到的问题,比如权限错误,端口冲突,依赖缺失。在注意事项里提醒他们查看日志,使用systemctl status之类的命令。备份和监控也是维护的重要部分,应该提到。 另外,用户可能不知道如何选择部署方式,所以比较一下物理机、虚拟机、容器的优缺点,帮助他们做决定。最后,提供参考链接,比如官方文档和自动化工具的资料,方便用户深入阅读。 要确保回答结构清晰,分步骤,每个部分有标题,代码用反引号包裹,变量用$符号。检查一下LaTeX有没有错误,虽然这个问题可能用不上数学公式,但系统指令里提到行内数学表达式要用$...$,所以如果有变量或代码中的$符号要注意转义。 总之,先写通用步骤,再举例子,最后注意事项和扩展建议。确保语言简洁,步骤明确,用户能跟着操作。可能需要多次检查命令的正确性,比如apt install和systemctl的命令是否正确,避免用户复制时出错。</think>在Linux系统上部署应用通常需要以下步骤,以下是通用流程及常见场景示例: ### 一、基础部署流程 1. **系统准备** ```bash # 更新系统软件包 sudo apt update && sudo apt upgrade -y # Debian/Ubuntu sudo yum update -y # CentOS/RHEL # 安装常用工具 sudo apt install -y curl wget git vim # Debian/Ubuntu ``` 2. **环境依赖安装** ```bash # 示例:安装Python环境 sudo apt install -y python3 python3-pip pip3 install virtualenv # 示例:安装Java环境 sudo apt install -y openjdk-17-jdk ``` 3. **获取应用文件** ```bash # 通过Git克隆代码 git clone https://github.com/username/repo.git cd repo # 或下载预编译包 wget https://example.com/app.tar.gz tar -xzvf app.tar.gz ``` 4. **配置文件修改** ```bash # 典型配置文件路径 vim config/appsettings.conf # 常见需修改项 • 数据库连接信息 • 服务监听端口(如:`PORT=8080`) • 日志存储路径 ``` 5. **启动应用** ```bash # 直接启动(适合测试) python3 app.py # 后台运行(生产推荐) nohup ./start.sh > output.log 2>&1 & # 使用systemd托管(以myapp.service为例) sudo systemctl enable myapp.service sudo systemctl start myapp ``` ### 二、常见部署场景示例 #### 场景1:部署Nginx Web服务器 ```bash # 安装 sudo apt install -y nginx # 配置 sudo vim /etc/nginx/sites-available/default # 启动服务 sudo systemctl enable nginx sudo systemctl restart nginx # 验证 curl http://localhost ``` #### 场景2:部署Node.js应用 ```bash # 安装Node.js curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt install -y nodejs # 安装PM2进程管理器 sudo npm install -g pm2 # 启动应用 pm2 start app.js pm2 save pm2 startup ``` #### 场景3:使用Docker部署 ```bash # 安装Docker curl -fsSL https://get.docker.com | sudo sh # 运行容器(以MySQL为例) sudo docker run -d \ --name mysql-server \ -e MYSQL_ROOT_PASSWORD=your_password \ -p 3306:3306 \ mysql:8.0 # 查看运行状态 sudo docker ps ``` ### 三、关键注意事项 1. **安全配置** ```bash # 配置防火墙 sudo ufw allow 22/tcp # 开放SSH sudo ufw allow 80/tcp # 开放HTTP sudo ufw enable # 定期更新系统 sudo apt update && sudo apt upgrade -y ``` 2. **日志监控** ```bash # 查看实时日志 journalctl -u nginx -f # 查看错误日志 tail -f /var/log/nginx/error.log ``` 3. **备份策略** ```bash # 定时备份数据库 0 3 * * * mysqldump -u root -pPASSWORD dbname > /backups/db_$(date +\%F).sql ``` ### 四、进阶部署方式对比 | 方式 | 优点 | 缺点 | |------------|-----------------------|-----------------------| | 物理机部署 | 最高性能 | 维护成本高 | | 虚拟机部署 | 资源隔离 | 性能损耗约5-15% | | 容器化部署 | 快速部署,环境一致 | 需要学习容器技术 | ### 五、问题排查技巧 1. 检查端口占用: ```bash sudo lsof -i :8080 ``` 2. 查看系统资源: ```bash htop # 实时监控 free -h # 内存使用 df -h # 磁盘空间 ``` ### 扩展建议 • 学习使用自动化部署工具(Ansible/Terraform) • 掌握基础Shell脚本编写 • 了解CI/CD流水线搭建(Jenkins/GitLab CI) > **官方文档参考**: > - [Nginx官方文档](https://nginx.org/en/docs/) > - [Docker文档](https://docs.docker.com/) > - [Systemd使用指南](https://www.freedesktop.org/wiki/Software/systemd/)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值