如何在 Ubuntu 上使用 pm2 和 Nginx 部署 Node.js 应用

简介:

pm2 是一个 Node.js 应用的进程管理器,它可以让你的应用程序保持运行,还有一个内建的负载均衡器。它非常简单而且强大,你可以零间断重启或重新加载你的 node 应用,它也允许你为你的 node 应用创建集群。

在这篇博文中,我会向你展示如何安装和配置 pm2 用于这个简单的 'Express' 应用,然后配置 Nginx 作为运行在 pm2 下的 node 应用的反向代理。

前提:

  • Ubuntu 16.04 - 64bit
  • Root 权限

第一步 - 安装 Node.js LTS

在这篇指南中,我们会从零开始我们的实验。首先,我们需要在服务器上安装 Node.js。我会使用 Nodejs LTS 6.x 版本,它能从 nodesource 仓库中安装。

从 Ubuntu 仓库安装 python-software-properties 软件包并添加 “nodesource” Nodejs 仓库。

 
 
  1. sudo apt-get install -y python-software-properties
  2. curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
AI 代码解读

安装最新版本的 Nodejs LTS:

 
 
  1. sudo apt-get install -y nodejs
AI 代码解读

安装完成后,查看 node 和 npm 版本。

 
 
  1. node -v
  2. npm -v
AI 代码解读

检查 node.js 版本

检查 node.js 版本

第二步 - 生成 Express 示例 App

我会使用 express-generator 软件包生成的简单 web 应用框架进行示例安装。express-generator 可以使用npm 命令安装。

用 npm安装 express-generator

 
 
  1. npm install express-generator -g
AI 代码解读
  • -g : 在系统内部安装软件包。

我会以普通用户运行应用程序,而不是 root 或者超级用户。我们首先需要创建一个新的用户。

创建一个名为 yume 的用户:

 
 
  1. useradd -m -s /bin/bash yume
  2. passwd yume
AI 代码解读

使用 su 命令登录到新用户:

 
 
  1. su - yume
AI 代码解读

下一步,用 express 命令生成一个新的简单 web 应用程序:

 
 
  1. express hakase-app
AI 代码解读

命令会创建新项目目录 hakase-app

用 express-generator 生成应用框架

用 express-generator 生成应用框架

进入到项目目录并安装应用需要的所有依赖。

 
 
  1. cd hakase-app
  2. npm install
AI 代码解读

然后用下面的命令测试并启动一个新的简单应用程序:

 
 
  1. DEBUG=myapp:* npm start
AI 代码解读

默认情况下,我们的 express 应用会运行在 3000 端口。现在访问服务器的 IP 地址:192.168.33.10:3000 :

express nodejs 运行在 3000 端口

express nodejs 运行在 3000 端口

这个简单 web 应用框架现在以 'yume' 用户运行在 3000 端口。

第三步 - 安装 pm2

pm2 是一个 node 软件包,可以使用 npm 命令安装。(用 root 权限,如果你仍然以 yume 用户登录,那么运行命令 exit 再次成为 root 用户):

 
 
  1. npm install pm2 -g
AI 代码解读

现在我们可以为我们的 web 应用使用 pm2 了。

进入应用目录 hakase-app

 
 
  1. su - yume
  2. cd ~/hakase-app/
AI 代码解读

这里你可以看到一个名为 package.json 的文件,用 cat 命令显示它的内容。

 
 
  1. cat package.json
AI 代码解读

配置 express nodejs 服务

配置 express nodejs 服务

你可以看到 start 行有一个 nodejs 用于启动 express 应用的命令。我们会和 pm2 进程管理器一起使用这个命令。

像下面这样使用 pm2 命令运行 express 应用:

 
 
  1. pm2 start ./bin/www
AI 代码解读

现在你可以看到像下面这样的结果:

使用 pm2 运行 nodejs app

使用 pm2 运行 nodejs app

我们的 express 应用正在 pm2 中运行,名称为 www,id 为 0。你可以用 show 选项 show nodeid|name获取更多 pm2 下运行的应用的信息。

 
 
  1. pm2 show www
AI 代码解读

pm2 服务状态

pm2 服务状态

如果你想看我们应用的日志,你可以使用 logs 选项。它包括访问和错误日志,你还可以看到应用程序的 HTTP 状态。

 
 
  1. pm2 logs www
AI 代码解读

pm2 服务日志

pm2 服务日志

你可以看到我们的程序正在运行。现在,让我们来让它开机自启动。

 
 
  1. pm2 startup systemd
AI 代码解读
  • systemd: Ubuntu 16 使用的是 systemd。

你会看到要用 root 用户运行命令的信息。使用 exit 命令回到 root 用户然后运行命令。

 
 
  1. sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u yume --hp /home/yume
AI 代码解读

它会为启动应用程序生成 systemd 配置文件。当你重启服务器的时候,应用程序就会自动运行。

pm2 添加服务到开机自启动

pm2 添加服务到开机自启动

第四步 - 安装和配置 Nginx 作为反向代理

在这篇指南中,我们会使用 Nginx 作为 node 应用的反向代理。Ubuntu 仓库中有 Nginx,用 apt 命令安装它:

 
 
  1. sudo apt-get install -y nginx
AI 代码解读

下一步,进入到 sites-available 目录并创建新的虚拟主机配置文件。

 
 
  1. cd /etc/nginx/sites-available/
  2. vim hakase-app
AI 代码解读

粘贴下面的配置:

 
 
  1. upstream hakase-app {
  2. # Nodejs app upstream
  3. server 127.0.0.1:3000;
  4. keepalive 64;
  5. }
  6. # Server on port 80
  7. server {
  8. listen 80;
  9. server_name hakase-node.co;
  10. root /home/yume/hakase-app;
  11. location / {
  12. # Proxy_pass configuration
  13. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  14. proxy_set_header Host $http_host;
  15. proxy_set_header X-NginX-Proxy true;
  16. proxy_http_version 1.1;
  17. proxy_set_header Upgrade $http_upgrade;
  18. proxy_set_header Connection "upgrade";
  19. proxy_max_temp_file_size 0;
  20. proxy_pass http://hakase-app/;
  21. proxy_redirect off;
  22. proxy_read_timeout 240s;
  23. }
  24. }
AI 代码解读

保存文件并退出 vim。

在配置中:

  • node 应用使用域名 hakase-node.co 运行。
  • 所有来自 nginx 的流量都会被转发到运行在 3000 端口的 node app。

测试 Nginx 配置确保没有错误。

 
 
  1. nginx -t
AI 代码解读

启用 Nginx 并使其开机自启动。

 
 
  1. systemctl start nginx
  2. systemctl enable nginx
AI 代码解读

第五步 - 测试

打开你的 web 浏览器并访问域名(我的是):http://hakase-app.co 。

你可以看到 express 应用正在 Nginx web 服务器中运行。

Nodejs app 在 pm2 和 Nginx 中运行

Nodejs app 在 pm2 和 Nginx 中运行

下一步,重启你的服务器,确保你的 node app 能开机自启动:

 
 
  1. pm2 save
  2. sudo reboot
AI 代码解读

如果你再次登录到了你的服务器,检查 node app 进程。以 yume 用户运行下面的命令。

 
 
  1. su - yume
  2. pm2 status www
AI 代码解读

nodejs 在 pm2 下开机自启动

nodejs 在 pm2 下开机自启动

Node 应用在 pm2 中运行并使用 Nginx 作为反向代理。

原文发布时间为:2017-05-09

本文来自云栖社区合作伙伴“Linux中国”

相关文章
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
242 44
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
array.some()可以用来权限检查、表单验证、库存管理、内容审查和数据处理等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
array.every()可以用来数据验证、权限检查、一致性检查等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
77 11
Figma-Low-Code:快速将Figma设计转换为Vue.js应用,支持低代码渲染、数据绑定
Figma-Low-Code 是一个开源项目,能够直接将 Figma 设计转换为 Vue.js 应用程序,减少设计师与开发者之间的交接时间,支持低代码渲染和数据绑定。
182 3
Figma-Low-Code:快速将Figma设计转换为Vue.js应用,支持低代码渲染、数据绑定
|
5月前
|
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
167 62

热门文章

最新文章