前端也需要懂,负载均衡与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版本,解压,注意:放置的路径不要有中文。
小柒这里直接放置E盘:
修改conf
目录下的nginx.conf
文件,将端口修改,以免端口冲突,小柒这里设置为8888.打开cmd命令行,进入目录,使用
nginx -t
检查配置是否正确:
正确后,使用nginx -start
命令启动,访问刚刚设置的localhost:8888
,就可以看到欢迎页面:常用命令:启动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后,全局安装
express
:npm 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个简单的服务器,端口分别为:8566
、8867
、8700
。
-
-
修改
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
尝试的多刷新几次,可以发现权重越高的服务器,接受的请求越多,这里返回
8566
的次数最多。
参考文章: