• Nginx反向代理和负载均衡


    Nginx反向代理和负载均衡

    环境说明

    由于我使用的是windows系统,所以我用虚拟机虚拟出来了3台linux系统

    • 虚拟机一:192.168.1.20 (Nginx反向代理和负载均衡服务器,系统kali linux)
    • 虚拟机二:192.168.1.19 (node服务器一,系统ubuntu 17.10)
    • 虚拟机三:192.168.1.22(node服务器二,系统ubuntu 17.10)

    环境需要的程序

    • git
    • Node
    • Nginx
    • pm2

    首先环境的搭建,由于这三台电脑都是我刚刚虚拟出来的,所以什么环境都没有!

    虚拟机一的环境搭建

    由于我们的虚拟机一主要是用来做Nginx的反向代理和负载均衡的,那么我们只需要安装Nginx就可以

    $ sudo apt-get install nginx -y
    

    ok我们访问下Nginx反向代理服务器是否正常启动

    虚拟机二和虚拟机三的环境搭建

    我比较喜欢使用nvm去安装node,因为nvm能让我自由的去切换node的版本(两台node服务器环境必须一致哦!)

    //安装git工具
    $ sudo apt-get install git
    
    //从github网站把nvm的源码下载下来放到当前登录用户的.nvm目录下(以后方便我们找)
    $ git clone https://github.com/creationix/nvm.git ~/.nvm
    
    //让nvm命令在每次打开shell窗口的时候生效
    $ echo "source ~/.nvm/nvm.sh" >> ~/.bashrc
    
    //让nvm的命令立即生效(关闭shell窗口重新打开也可以生效)
    $ source ~/.nvm/nvm.sh
    
    //查看nvm是否安装成功和查看当前的node版本信息
    $ nvm ls
    

    我们安装下node,此处直接安装stable最新的稳定版本

    //这个时间会比较长,稍微有点耐心
    $ nvm install stable
    

    安装pm2

    $ npm install pm2 -g
    

    编写我们的项目代码

    初始化项目创建package.json

    $ mkdir nodeapp && cd $_
    $ npm init
    $ npm install koa --save
    

    创建我们的node主程序入口文件app.js(由于我们只关注与上线发布和负载均衡所以node项目只是一个Hello Koa)

    const Koa = require('koa');
    const app = new Koa();
     
    app.use(ctx => {
      ctx.body = 'Hello Koa';
    });
     
    app.listen(3000);
    

    编写pm2的配置文件pm2.json

    pm2 是一个带有负载均衡功能的Node应用的进程管理器.
    当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载。pm2官网
    pm2重用的命令

    • pm2 start app.js : 启动服务,入口文件是app.js。
    • pm2 start app.js -i [n] --name [name] : 启动n个进程,名字命名为name。
    • npm stop [name or id] : 停止服务。
    • npm stop all : 停止所有服务。
    • npm delete [name or id] : 删除服务。
    • npm delete all : 删除所有服务。
    • npm restart [name or id] : 重启服务。
    • npm reload [name or id] : 和rastart功能相同,但是可以实现0s的无缝衔接;如果有nginx的使用经验,可以对比nginx reload指令。
    • pm2 monit : 对服务进行监控。
    • pm2 start **.json : 启动制定配置文件的服务

    ok知道pm2怎么用了,我们采用配置文件的方式启动,接下来编写我们的pm2.json配置文件

    {
    	"name"      : "nodeApp",
    	//max_memory_restart: "300M",//设置node单个进程可占用最大的内存,如果内存使用率超过300M,pm2自动重启该进程
    	"script"    : "app.js",//node主入口文件
    	"out_file" : "logs/out.log",
    	"error_file" : "logs/error.log",
    	"instances"  : "max",//让node程序占满你的cpu,发挥cpu最大的功效
    	"exec_mode"  : "cluster",//以主进程的方式启动
    	"watch":true
    }
    

    那pm2的配置文件和node程序写好了我们在本地测试下pm2和node程序能不能正常的启动(有点小尴尬,自己本机I7的6700K的CPU居然被这个小程序给占满了~~~)

    上线部署到我们的两台node服务器中

    其实说到上线部署呢,我们应该有自己的git服务器,所有的代码都应该从git服务器上去拉取,部署呢?应该有一个统一部署的方式通常使用的是jenkins,编写好我们统一部署的shell脚本(在这里体现出来为什么所有的服务器环境必须一致了,方便管理啊),用jenkins一键部署,但是.....本次只是做个小实验,没必要这么大动干戈,所以呢,我们还是手动的上传下代码手动起下服务吧!(下次介绍如何搭建自己的git服务器和jenkins的使用)
    我们把项目中的node_moudles文件夹删除然后给项目打个包准备上传服务器,项目结构应该是这样的

    我们使用scp命令用于将一个文件从本地上传至服务器,或者从服务器上把一个文件下载至本地
    郑重说明:由于我本地用的windows系统,为了演示我把项目文件拽进了另一个linux虚拟机中进行的上传

    //scp 本地文件 远程服务器用户名@远程服务器地址:/home/shuoer
    
    //把项目文件上传至虚拟机一
    scp nodeapp.zip shuoer@192.168.1.19/home/shuoer
    
    //把项目文件上传至虚拟机二
    scp nodeapp.zip shuoer@192.168.1.22/home/shuoer
    

    额.....报错了!

    额...好像ssh服务没起来,好像也没有安装

    //安装ssh
    $ sudo apt-get install ssh -y
    
    //不管ssh启动没有直接重启ssh
    $ sudo service ssh restart
    

    ok,好不容易上传成功了,我们分别进入这两台服务器进行项目解压和安装依赖最后启动服务

    为了明显我们在两台服务器上分别让页面输出自己的ip地址

    重头戏来了,Nginx的反向代理和负载均衡

    进入我们的虚拟机一,配置nginx.conf
    温馨提示:

    • nginx的配置文件默认在/etc/nginx/nginx.conf
    • 网站根目录默认在/var/www/html

    upstream模块

    负载均衡模块用于从”upstream”指令定义的后端主机列表中选取一台主机。nginx先使用负载均衡模块找到一台主机,再使用upstream模块实现与这台主机的交互。

    nginx 的两种负载均衡方式

    • 轮训加权(也可以不加权,就是1:1负载)
      我们可以根据两台服务器的性能进行分配权重,比如192.168.1.19服务器比较牛逼,另外一个比较差我们可以这么配置,按照4:1分配,比如5次访问有4次访问的是192.168.1.19服务器
      upstream test {
          server 192.168.1.19:3000 weight=4;
          server 192.168.1.22:3000 weight=1;
      }
      
    • ip_hash(同一ip会被分配给固定的后端服务器,解决session问题)
      #”ip_hash”只能在upstream {}中使用。这条指令用于通知nginx使用ip hash负载均衡算法。
      #如果没加这条指令,nginx会使用默认的round robin负载均衡模块。
      upstream test {
          ip_hash;
          server 192.168.1.19:3000;
          server 192.168.1.22:3000;
      }
      

    打开nginx.conf我的可能和你们的都不一样(我把所有的注释都删除了,是不是整洁了很多?)
    填入如下代码,这里我没有采用负载均衡的任何算法

    user www-data;
    worker_processes auto;
    pid /run/nginx.pid;
    include /etc/nginx/modules-enabled/*.conf;
    
    events {
    	worker_connections 768;
    }
    
    http {
    	sendfile on;
    	tcp_nopush on;
    	tcp_nodelay on;
    	keepalive_timeout 65;
    	types_hash_max_size 2048;
    	include /etc/nginx/mime.types;
    	default_type application/octet-stream;
    	ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    	ssl_prefer_server_ciphers on;
    	access_log /var/log/nginx/access.log;
    	error_log /var/log/nginx/error.log;
    	gzip on;
    	#include /etc/nginx/conf.d/*.conf;
    	#include /etc/nginx/sites-enabled/*;
    	#用于设置负载的服务器列表
    	upstream test {
    		#虚拟机二
    		server 192.168.1.19:3000;
    		#虚拟机三
    		server 192.168.1.22:3000;
    	}
    	server {
    		#监听80端口
    		listen 80;
    		location / {
    			#转发的地址,此处为upstream模块
    			proxy_pass http://test;
    		}
    	}
    }
    

    ok,将配置文件保存好之后重启我们的nginx

    $ sudo service nginx restart
    

    打开浏览器检验下我们的成果

  • 相关阅读:
    【转】dip,px,pt,sp 的区别
    JAVA中报错 : org.springframework.beans.factory.BeanCreationException
    ExecuteNonQuery及对比
    ParameterDirection参数类型
    WinForm控件组合使用
    DataGridView控件内实现修改与删除
    DataView筛选绑定
    动态反射
    反射属性名和属性值
    接口与抽象类
  • 原文地址:https://www.cnblogs.com/shuoer/p/7820899.html
Copyright © 2020-2023  润新知