热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

nodepython后台启动_pm2开机启动egg项目

egg部署在本地开发时,我们使用egg-bindev来启动服务,但是在部署应用的时候不可以这样使用。因为egg-bindev会针对本地开发做很多处理&#
4cea4606990c59101418e8d8b657d842.png

egg部署

在本地开发时,我们使用 egg-bin dev 来启动服务,但是在部署应用的时候不可以这样使用。因为 egg-bin dev 会针对本地开发做很多处理,而生产运行需要一个更加简单稳定的方式。所以本章主要讲解如何部署你的应用。

一般从源码代码到真正运行,我们会拆分成构建和部署两步,可以做到一次构建多次部署

构建

Javascript 语言本身不需要编译的,构建过程主要是下载依赖。但如果使用 TypeScript 或者 Babel 支持 ES6 以上的特性,那就必须要这一步了。

一般安装依赖会指定 NODE_ENV=production 或 npm install --production 只安装 dependencies 的依赖。因为 devDependencies 中的模块过大而且在生产环境不会使用,安装后也可能遇到未知问题。

$ cd baseDir$ npm install --production$ tar -zcvf ../release.tgz .

构建完成后打包成 tgz 文件,部署的时候解压启动就可以了。

增加构建环节才能做到真正的一次构建多次部署,理论上代码没有改动的时候是不需要再次构建的,可以用原来的包进行部署,这有着不少好处:

  • 构建依赖的环境和运行时是有差异的,所以不要污染运行时环境。
  • 可以减少发布的时间,而且易回滚,只需要把原来的包重新启动即可。

部署

服务器需要预装 Node.js,框架支持的 Node 版本为 >= 8.0.0。

框架内置了 egg-cluster 来启动 Master 进程,Master 有足够的稳定性。

同时,框架也提供了 egg-scripts 来支持线上环境的运行和停止。

首先,我们需要把 egg-scripts 模块作为 dependencies 引入:

$ npm i egg-scripts --save

添加 npm scripts 到 package.json:

{ "scripts": { "start": "egg-scripts start --daemon", "stop": "egg-scripts stop" }}

这样我们就可以通过 npm start 和 npm stop 命令启动或停止应用。

注意:egg-scripts 对 Windows 系统的支持有限,参见 #22。

PM2的使用

安装

安装命令

npm install pm2 -g

让PM2保持最新状态:

pm2 update

在egg项目的根目录定义启动文件:

// server.jsconst egg = require('egg');const workers = Number(process.argv[2] || require('os').cpus().length);egg.startCluster({ workers, baseDir: __dirname,});

这样,我们就可以通过 PM2 进行启动了(本次启动在egg项目的根目录):

pm2 start server.js --name test

启动挂钩

检测计算机上可用的init系统并生成配置,使用:

pm2 startup

运行 pm2 startup,即在/etc/init.d/目录下生成pm2-root的启动脚本,且自动将pm2-root设为服务。

查的信息如下

[PM2] Init System found: systemd[PM2] To setup the Startup Script, copy/paste the following command:sudo env PATH=$PATH:/home/lxj/.nvm/versions/node/v10.15.1/bin /home/lxj/.nvm/versions/node/v10.15.1/lib/node_modules/pm2/bin/pm2 startup systemd -u lxj --hp /home/lxj

执行上面所查命令

sudo env PATH=$PATH:/home/lxj/.nvm/versions/node/v10.15.1/bin /home/lxj/.nvm/versions/node/v10.15.1/lib/node_modules/pm2/bin/pm2 startup systemd -u lxj --hp /home/lxj

使用NVM时,此pm2路径会在更新Node.js时改变。 每次更新后您都需要运行startup命令。

运行

pm2 save

以此来保存您的进程列表,启动挂钩会自动加载您之前保存的进程列表。

运行 pm2 save,会将当前pm2所运行的应用保存在/root/.pm2/dump.pm2下,当开机重启时,运行pm2-root服务脚本,并且到/root/.pm2/dump.pm2下读取应用并启动。

完成以上命令就能够开机自启动名为test的项目了。

离线更新

获取egg的压缩包,解压缩替换原有的文件并

pm2 restart test

完成离线更新操作。

npm install pm2 -g # 命令行安装 pm2 pm2 start app.js -i 4 #后台运行pm2,启动4个app.js # 也可以把'max' 参数传递给 start # 正确的进程数目依赖于Cpu的核心数目pm2 start app.js --name my-api # 命名进程pm2 list # 显示所有进程状态pm2 monit # 监视所有进程pm2 logs # 显示所有进程日志pm2 stop all # 停止所有进程pm2 restart all # 重启所有进程pm2 reload all # 0秒停机重载进程 (用于 NETWORKED 进程)pm2 stop 0 # 停止指定的进程pm2 restart 0 # 重启指定的进程pm2 startup # 产生 init 脚本 保持进程活着pm2 web # 运行健壮的 computer API endpoint (http://localhost:9615)pm2 delete 0 # 杀死指定的进程pm2 delete all # 杀死全部进程pm2 start app.js -i max # 根据有效CPU数目启动最大进程数目pm2 start app.js -i 3 # 启动3个进程pm2 start app.js -x #用fork模式启动 app.js 而不是使用 clusterpm2 start app.js -x -- -a 23 # 用fork模式启动 app.js 并且传递参数 (-a 23)pm2 start app.js --name serverone # 启动一个进程并把它命名为 serveronepm2 stop serverone # 停止 serverone 进程pm2 start app.json # 启动进程, 在 app.json里设置选项pm2 start app.js -i max -- -a 23 #在--之后给 app.js 传递参数pm2 start app.js -i max -e err.log -o out.log # 启动 并 生成一个配置文件,你也可以执行用其他语言编写的app ( fork 模式):pm2 start my-bash-script.sh -x --interpreter bashpm2 start my-python-script.py -x --interpreter python



推荐阅读
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 如何使用ES6语法编写Webpack配置文件? ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 如何精通编程语言:全面指南与实用技巧
    如何精通编程语言:全面指南与实用技巧 ... [详细]
  • Vue CLI 初始化 Webpack 项目时,main.js 文件是如何被调用的? ... [详细]
  • C语言中类型自动转换的深入解析与应用
    C语言中类型自动转换的深入解析与应用 ... [详细]
  • 在CICS应用环境中,众多客户端通过网络与CICS服务器进行连接。系统管理员可以通过CICS系统交易CEMT查询当前连接的客户端信息。然而,在非客户端模式下,识别用户连接并解决信息获取错误的问题变得更为复杂。本文将探讨如何在CICS服务器端准确识别非客户端模式的用户连接,并提供有效的解决方案,以确保系统的稳定性和数据的准确性。此外,还将介绍一些常用的诊断工具和技术,帮助管理员快速定位和解决问题。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 本文深入解析了Java面向对象编程的核心概念及其应用,重点探讨了面向对象的三大特性:封装、继承和多态。封装确保了数据的安全性和代码的可维护性;继承支持代码的重用和扩展;多态则增强了程序的灵活性和可扩展性。通过具体示例,文章详细阐述了这些特性在实际开发中的应用和优势。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • Vue应用预渲染技术详解与实践 ... [详细]
author-avatar
泉水叮咚139
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有