欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-16 14:13:04
...

前面的话

常常听说负载均衡与反向代理,通过这篇文章一起体验一番。文章后面的小实例,可以体验一把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反向代理
    小柒这里直接放置E盘:
    前端也需要懂,负载均衡与Nginx反向代理
    修改conf目录下的nginx.conf文件,将端口修改,以免端口冲突,小柒这里设置为8888.
    前端也需要懂,负载均衡与Nginx反向代理

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

    常用命令:启动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反向代理

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

参考文章:

相关标签: 计算机网络