这篇文章上次修改于 378 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

Node线上部署实现Nginx的负载均衡

这篇文章只是简单的介绍怎么将node项目代码上传到服务器上并通过PM2部署在服务器上,然后通过配置Nginx反向代理实现一个简单的负载均衡,下面开始吧~~~

线上部署Node项目

开发一个简单的项目(两个node服务)

pm2

pm2是一个带有负载均衡功能的进程管理工具,可以用它来管理node进程,并查看node进程的状态,当然也支持性能监控,进程守护,负载均衡等功能。

特性:

1、能动态监控文件的上传,0秒热启动

2、能够负载均衡CPU

3、当内存使用过多、CPU调度太频繁时,自动重启

4、监控重启(restart)次数

项目目录:(只需要写app.jspm2.json两文件的代码)

  • nginx-conf

    • nginx.conf --> nginx配置文件(这个给运维看的,项目用不着,就不实现了)
  • logs --> 输出日志信息
  • app.js --> 项目入口
  • pm2.json --> pm2配置文件
  • package.json

安装依赖包

npm i express --save

需全局安装pm2

npm i pm2 -g

两个node服务app.js的实现

// 第一个node服务器
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Server One!!!');
})

app.listen(8080, () => {
  console.log('Server Running.....');
})
// 第二个node服务器
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Server Two!!!');
})

app.listen(8080, () => {
  console.log('Server Running.....');
})

pm2.json的实现(两个服务配置一样)

{
  "apps": {
      "name": "node 部署",                                
      "script": "app.js",                                                
      "watch": true,
      "instances": "max",
      "error_file": "./logs/app-err.log",         
      "out_file": "./logs/app-out.log",           
      "exec_mode": "cluster"
  }
}

然后将两个node服务代码压缩上传到服务器主机上

我用的一个是阿里云服务器,一个是本机

登录服务器主机,将上传的代码解压命名为nodeapp放在一个目录里,然后cd到该目录运行

安装上线需要的依赖包

npm install --production

通过pm2运行node服务

pm2 start pm2.json

部署成功如图

浏览器输入服务器主机的IP加上8080端口

两个node服务测试通过后,下面通过nginx实现负载均衡

Nginx负载均衡

nginx配置

worker_processes 4; #允许生成的进程数,默认为1
events {
    worker_connections 1024;
}
http {
  upsteam test {   #负载均衡配置
    server 127.0.0.1:8080;
    server 45.23.34.122:8080;
  }
  server {
    listen 3000;
    location / {
      proxt_pass http://test; # 代理到test的定义的服务器列表
    }
  }
}

重启nginx

$ nginx -s reload

浏览器输入http://localhost:3000进行测试(我是在本机配置的nginx服务)

效果如图

命令总结

pm2相关命令

$ pm2 start xxx                 # 启动xxx应用程序
$ pm2 start app.js --watch      # 当文件变化时自动重启应用
$ pm2 ls                        # 列表 PM2 启动的所有的应用程序
$ pm2 monit                     # 显示每个应用程序的CPU和内存占用情况
$ pm2 logs                      # 显示所有应用程序的日志
$ pm2 stop all                  # 停止所有的应用程序
$ pm2 stop 0                    # 停止 id为 0的指定应用程序
$ pm2 restart all               # 重启所有应用
$ pm2 reload all                # 重启 cluster mode下的所有应用
$ pm2 gracefulReload all        # Graceful reload all apps in cluster mode
$ pm2 delete all                # 关闭并删除所有应用
$ pm2 delete 0                  # 删除指定应用 id 0
$ pm2 startup                   # 创建开机自启动命令

设置软连接

ln -s /node-v11.11.0/bin/pm2/bin/pm2 /usr/bin/pm2

连接服务器主机

// --- 登入
$ ssh 用户名@公网IP  // eg: ssh xiaoliu@45.23.34.122
输入密码

// --登出
$ exit

向服务器主机上传文件

scp -r 上传文件或压缩包 用户名@公网IP:上传服务器的目录

查看node服务占用的端口

ps aux | grep node

查看指定TCP连接的端口占用信息

lsof -i tcp:端口号

停掉指定进程

kill -9 pid

总结

整个负载均衡的过程:用户访问服务端,服务端通过nginx反向代理到负载均衡的node集群,然后随机将用户的请求发给比较闲的node服务。