⭐在分布式微服务架构中,服务是分布在不同主机、服务器上的。我们希望访问不同的服务,就需要一个代理服务器来为我们做请求转发,这个时候我们就引入了Nginx。⭐
🌺Nginx的引入🌺
我们在请求传统的单体项目时,常常是在低并发的情况下进行的。一个公司项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个jar包启动应用就够了,然后内部tomcat返回内容给用户。
但是慢慢的,使用公司平台的用户越来越多了,并发量慢慢增大了,这时候一台服务器满足不了我们的需求了。
于是我们横向扩展,又增加了服务器。这个时候几个项目启动在不同的服务器上,用户要访问,就需要增加一个代理服务器了,通过代理服务器来帮我们转发和处理请求。下图的服务器1就是代理服务器。
我们希望这个代理服务器可以帮助我们接收用户的请求,然后将用户的请求按照规则帮我们转发到不同的服务器节点之上。这个过程用户是无感知的,用户并不知道是哪个服务器返回的结果,我们还希望他可以按照服务器的性能提供不同的权重选择。保证最佳体验!所以我们使用了Nginx。
还有一种情况就是,当我们的分布式微服务项目不同服务部署在不同主机下的时候,我们希望通过不同的路径访问不同的服务怎么来实现?
公司的项目不一定都部署在一台服务器上,对吧?通常情况下都会被拆分在不同主机上的,我们希望通过不同路径访问它们,而且我们为了分担服务器的访问压力,我们希望轮训访问这两台服务器。在访问服务器上的资源的时候,我们还希望静态资源和动态资源能够分开,这又怎么办?
所以整理一下我们的需求,我们的访问需求如下:
- 需要代理服务器
- 负载均衡
- 动静分离
实现上面的需求可以用 网关服务,也可以使用 Nginx!
使用Nginx还有一个好处就是可以使用 高可用集群 防止服务器宕机。
如上图,我们用两个Nginx服务器搭建了一个简单的集群,这个也叫双机热备。当其中一台Nginx宕机之后,仍能用另一台来工作,两台Nginx之间是用keeplived
来监测心跳,从而确定主从设备之间是否宕机。
🌺深刻理解正向代理与反向代理🌺
正向代理和 反向代理是Nginx的重要概念、功能。因为国内的砖家起名字的时候一开始说正向代理,反向代理。但是,从逻辑处理上来说有漏洞,就是一个必要的前提需要说明,正向和反向是基于什么来定方向的?就像坐标轴一样,原点是什么,定义右边是正,左边是负。
我们先看一下官网解释:
🌹Reverse proxy🌹
From Wikipedia, the free encyclopedia
A reverse proxy taking requests from the Internet and forwarding them to servers in an [internal network](https://www.zhihu.com/search?q=internal network&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={“sourceType”%3A"answer"%2C"sourceId"%3A471185862}). Those making requests to the proxy may not be aware of the internal network.
In computer networks, a reverse proxy is a type of proxy server that retrieves resources on behalf of a client from one or more servers. These resources are then returned to the client, appearing as if they originated from the proxy server itself.[1] Unlike a forward proxy, which is an intermediary for its associated clients to contact any server, a reverse proxy is an intermediary for its associated servers to be contacted by any client.
Quite often, popular web servers use reverse-proxying functionality, shielding application frameworks of weaker HTTP capabilities.
重点是这句:
Unlike a forward proxy, which is an intermediary for its associated clients to contact any server, a reverse proxy is an intermediary for its associated servers to be contacted by any client。
翻译:正向代理是客户端和其他所有服务器(重点:所有)的代理者,而反向代理是客户端和所要代理的服务器之间的代理。
总结:一个对客户端负责,一个对所代理的服务器负责。一个正,一个反。
我们配合下图来理解:
客户端这个时候想访问,但是因为国内原因不能访问,这个时候就用了代理服务器,代理服务器帮你访问服务器资源,拿到以后传给国内的你。这个时候代理服务器是在帮你去其他网络拿资源,整个时候整个网络的资源走向如下图,从外网服务器到代理服务器,最后到客户端,所以这个是 正向代理。正向=代理服务器在帮你(客户端)=资源走向。
那什么是 反向代理 呢?看下图:
客户端将请求发送到代理服务器,由代理服务器去选择目标服务器获取数 据后,返回给客户端,这种代理方式为反向代理。
接下来我们就理解什么是 反向代理?
项目设计者, 不希望客户端直接访问目标 Web 服务器(比如目标 Web 服务器是集群, 如 果直接访问就会提供多个公网 IP), 而是希望提供一个统一的访问 IP, 这个是理解反向代理 的前提,即为什么要反向代理。
- 反向代理帮助的对象是目标 Web 服务器。
🌹正向代理与反向代理的区别🌹
当前面的内容理解后,对于正向代理和反向代理的区别就很好理解了。
最核心的不同在于代理的对象不同。
- 正向代理是代理客户端
- 反向代理是代理服务器。
而根据这核心的区别,我们也可以记住:代理哪端便可以隐藏哪端。
也就是说:
- 正向代理隐藏真实客户端
- 反向代理隐藏真实服务端
🌹反向代理为什么叫反向代理🌹
从我们用户的角度来看:
- 代理我们发出请求的客户端被称为正向代理。
- 而代理我们访问的服务器,则被称为反向代理。
从代理结构的角度来看(代理服务器在两种代理中的作用均为收发请求与响应)
🌹负载均衡🌹
当客户端向反向代理服务器(比如 Nginx)发出请求,如果 Nginx 代理了多个 WEB 服务器(集群),Nginx 会将请求/负载分发到不同的服务器,也就是负载均衡。
这么做的好处就是分担服务器压力,提高并发效率。
🌹动静分离🌹
为了加快网站的解析速度,可以把动态资源和静态资源由不同的服务器来 解析,降低单个服务器的压力。
🌺Nginx的安装🌺
⭐Windows安装⭐
🌹下载nginx🌹
http://nginx.org/en/download.html 下载稳定版本。
以nginx/Windows-1.16.1为例,直接下载 nginx-1.16.1.zip。
下载后解压,解压后如下
###🌹启动nginx🌹
有很多种方法启动nginx
(1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过
(2)打开cmd命令窗口,切换到nginx解压目录下,输入命令 nginx.exe
,回车即可
🌹检查nginx是否启动成功🌹
直接在浏览器地址栏输入网址 http://localhost:80 回车,出现以下页面说明启动成功!
###🌹配置监听🌹
nginx的配置文件是conf目录下的nginx.conf,默认配置的nginx监听的端口为80,如果80端口被占用可以修改为未被占用的端口即可。
当我们修改了nginx的配置文件nginx.conf 时,不需要关闭nginx后重新启动nginx,只需要执行命令 nginx -s reload
即可让改动生效
🌹关闭nginx🌹
如果使用cmd命令窗口启动nginx, 关闭cmd窗口是不能结束nginx进程的,可使用两种方法关闭nginx
(1)输入nginx命令 nginx -s stop
(快速停止nginx) 或 nginx -s quit
(完整有序的停止nginx)
(2)使用taskkill taskkill /f /t /im nginx.exe
taskkill是用来终止进程的,
/f是强制终止 .
/t终止指定的进程和任何由此启动的子进程。
/im示指定的进程名称 .
🌹Linux下常用命令🌹
# 开启 service firewalld start # 重启 service firewalld restart # 关闭 service firewalld stop # 查看防火墙规则 firewall-cmd --list-all # 查询端口是否开放 firewall-cmd --query-port=8080/tcp # 开放80端口 firewall-cmd --permanent --add-port=80/tcp # 移除端口 firewall-cmd --permanent --remove-port=8080/tcp #重启防火墙(修改配置后要重启防火墙) firewall-cmd --reload # 参数解释 1、firwall-cmd:是Linux提供的操作firewall的一个工具; 2、--permanent:表示设置为持久; 3、--add-port:标识添加的端口;
⭐负载均衡⭐
upstream lb{ server 127.0.0.1:8080 weight=1; server 127.0.0.1:8081 weight=1; } location / { proxy_pass http://lb; }