浅析Nginx反向代理和负载均衡
基于上一篇博客(https://mp.youkuaiyun.com/mdeditor/83789359#)已经介绍了Nginx的一些理论和负载均衡的基础,这篇将简单分析一下Nginx在反向代理的功能,并讲解一下反向代理和负载均衡功能的联系。
1.代理服务器
代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中,再发送给客户机。
2.正向代理和反向代理
正向代理,架设在客户机与目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。
(简单来说就是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。)
反向代理,服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器。
(多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色)
反向代理主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息,这样做的好处就是可以防止外网对内网服务器的恶性攻击、缓存以减少服务器的压力和访问安全控制之外,还可以进行负载均衡,将用户请求分配给多个服务器。
3.负载均衡
这里提到的客户端发送的、nginx反向代理服务器接收到的请求数量,就是我们说的负载量
请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则
所以~将服务器接收到的请求按照规则分发的过程,称为负载均衡。
使用Nginx实现反向代理
1.使用IDEA跑两个简单的程序,分别占用8081和8082两个端口,我这里还是借用了上一个博客里的程序,代码也很简单。以跑8081端口的nginx1为例:
IndexController类
@RestController
public class HelloController {
@RequestMapping(value = "/index",method = RequestMethod.GET)
public String say(){return "这是8081端口";}
}
application.yml
server:
port: 8081
2.修改一下本地hosts文件(C:\Windows\System32\drivers\etc)
更改本地域名
3.运行启动Nginx,这里就不介绍了,详见上一篇博客。修改nginx.conf配置文件
upstream aaa{
server 127.0.0.1:8081;
}
upstream bbb{
server 127.0.0.1:8082;
}
server {
listen 80;
server_name www.aaa.com;#指定ip地址或者域名
location /{
proxy_pass http://aaa/index;#代理地址
index index.html index.htm;
}
}
server {
listen 80;
server_name www.bbb.com;
location /{
proxy_pass http://bbb/index;
index index.html index.htm;
}
}
4.输入nginx -s reload指令重新加载Nginx,使用postman查看
可以看到输入www.aaa.com和www.bbb.com分别被Nginx反向代理分配到了8081和8082的服务器上了。
总结:
如果客户机的IP和目标主机的IP在同一个网段,那就形同局域网内部发送请求,速度极快。
但如果满足不了这种需求还想到达到一个较好的请求响应时,目标主机可以对外提供一个与目标服务器在一个网段的公网IP,也就是反向代理服务的IP,通过代理服务器转发客户机请求,决定幕后的N台服务器谁来处理这个请求,并且由于反向代理服务器与目标主机在一个网段,访问速度也会很快。
Nginx用作反向代理服务器时,它就是众多反向代理服务器中的一种,通过简单的配置,指定到服务器IP或域名地址便可将客户机请求转发给指定服务器处理请求。