前端也需要懂,负载均衡与Nginx反向代理

前面的话

常常听说负载均衡与反向代理,通过这篇文章一起体验一番。文章后面的小实例,可以体验一把Nginx是如何负载均衡的。

正向代理

举个例子: 比如你要直接访问一个外网,但是被限制了,你只好去找一个代理服务器(这个代理服务器可以与你要访问的网站通信),把请求发给代理服务器,由代理服务器代替你去请求,最终再由代理服务器将响应返回给你。这个过程就是一次正向代理。

正向代理的特点代理的是客户端,代客户端发请求,客户端明确知道它所访问的服务器地址,而服务器却不明确处理请求究竟来自哪个具体的客户端

反向代理

我们知道,一般电商网站,比如某宝,每天的访问量那是相当大的,如果用户发的请求全部发到单个服务器上,服务器很容易崩溃,所以一般会部署多台服务器来分担。

同样,我们还是不能直接去访问这些服务器,还是要将请求发到代理服务器上,代理服务器按一定的规则将请求发给各个服务器,最后再由代理服务将响应发回来。这个过程就是反向代理。

反向代理的特点: 代理的是服务器,代服务器接收请求,客户端不知道自己最终请求的是哪一个服务器

负载均衡

均衡这个词,可以理解为保持每个服务器的压力均等,不要出现,有的服务器承载了很大的负载,而有的服务器几乎0负载。

那么负载均衡实际上就是将大量的请求进行分布式处理,按规则分发给每个服务器,使得每个服务器都不会出现过大负载

Nginx是什么?

Nginx作为一个基于C实现的高性能Web服务器,可以通过一系列算法 来实现负载均衡。

具有高性能、高并发、低内存占用的特点。通常被用为反向代理的工具。也就是说Nginx作为反向代理服务器,它会选择一台压力小的服务器来处理你的请求。

总结: 用户访问网站时,首先会访问Nginx服务器,然后Nginx服务器再从服务器集群中选择压力较小的服务器,来处理用户的请求

Nginx的协议支持

Nginx工作在网络的第7层,支持HTTP/HTTPS协议的负载均衡。

Nginx支持的负载均衡调度算法
  • weighted round robin(加权轮询): 每个服务器有自己的权重weght, weight值越大意味着该服务器的性能越好,可以承载更多的请求。该算法中 ,Nginx会将请求都分配给高权重的服务器,直到该服务器权重降到比其他服务器低,再将请求分配给下一个高权重的服务器。
  • IP 哈希(IP hash): 根据客户端的ip的hash值将请求分类,同一ip发出的请求映射到同一服务器上。在一定程度上解决了集群部署环境下Session不共享的问题。
  • fair: 智能动态调度算法,动态的根据后端服务器的响应时间来判断负载情况,响应时间长表示负载高,分配的请求就会少。(Nginx默认不支持fair算法,如果要使用,要安装upstream_fair模块)
  • URL hash: 根据请求的URL的hash值来分配服务器,相同的URL的请求会分配给固定的服务器当存在缓存的时候,效率一般较高。(同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装Nginx的hash软件包)
Nginx反向代理与负载均衡的实现
  • 安装Nginx
    去官网下载对应的nginx版本,解压,注意:放置的路径不要有中文
    前端也需要懂,负载均衡与Nginx反向代理_第1张图片
    小柒这里直接放置E盘:
    前端也需要懂,负载均衡与Nginx反向代理_第2张图片
    修改conf目录下的nginx.conf文件,将端口修改,以免端口冲突,小柒这里设置为8888.
    前端也需要懂,负载均衡与Nginx反向代理_第3张图片

    打开cmd命令行,进入目录,使用nginx -t检查配置是否正确:
    在这里插入图片描述
    正确后,使用nginx -start 命令启动,访问刚刚设置的localhost:8888,就可以看到欢迎页面:
    前端也需要懂,负载均衡与Nginx反向代理_第4张图片

    常用命令:启动nginx : nginx -start ;重启nginx: nginx -s reload;关闭nginx:nginx -s stop;检查配置:nginx -t

  • nginx.conf文件的简单说明:

    • worker_processes: 工作进程数,和CPU核数相同

    • worker_connections: 每个进程允许的最大连接数

    • upstream模块: 负载均衡就靠它。(下面我们会用到)

        upstream firstdemo {
               
              server  xxx;
              server  xxx;
              server  xxx;
          }
      
      语法格式:upstream xxx {
               
        // 里面的server分别对应着不同的服务器
       } 
      
    • server模块 :实现反向代理(主要依靠proxy_pass来配置)。

      server {
               
              listen 8080; // 监听的端口号
              location / {
               
              	root   html;
      			index  index.html index.htm;
                  proxy_pass http://xxx; // 代理哪些服务器(上面upstream 对应的名字)
              }
          }
      
  • 基于Node + Express 来搭建简单的服务器

    • 安装node后,全局安装expressnpm i express

    • 新建index.js文件,搭建一个简单的服务器,多建几个

      // server1.js
      const express = require('express');
      const app = express();
      
      const port = '8566';
      
      app.get('/', (req, res) =>res.end(`Hello, i am prot ${
               prot}`));
      
      app.listen(port, () =>console.log(`运行在: ${
               port}`));
      

      运行:node server1.js 。小柒这里建了3个简单的服务器,端口分别为:856688678700

  • 修改nginx.conf文件

    • 在http模块里,添加upstream对象,不同的server设置了不同的权重。

      upstream webServer {
               
      	server localhost:8566 weight=10; 
        	server localhost:8867 weight=2;
        	server localhost:8700;
          }
      
    • 在http模块的server对象,写上代理地址:

       location / {
               
                  root   html;
                  index  index.html index.htm;
      	    proxy_pass http://webServer; // 与上面一致
              }
      
  • 重启Nginx服务,每修改一次配置文件,就要重新启动。再次打开http://localhost:8888
    前端也需要懂,负载均衡与Nginx反向代理_第5张图片

    尝试的多刷新几次,可以发现权重越高的服务器,接受的请求越多,这里返回8566的次数最多。

参考文章:

  • 五分钟看懂 Nginx 负载均衡

你可能感兴趣的:(计算机网络,nginx)