探索Nginx的奥秘--从代理到负载均衡的艺术实践

文章目录

⭐在分布式微服务架构中,服务是分布在不同主机、服务器上的。我们希望访问不同的服务,就需要一个代理服务器来为我们做请求转发,这个时候我们就引入了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

  1. taskkill是用来终止进程的,
  2. /f是强制终止 .
  3. /t终止指定的进程和任何由此启动的子进程。
  4. /im示指定的进程名称 .

🌹Linux下常用命令🌹

xml 复制代码
# 开启
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:标识添加的端口;
⭐负载均衡⭐
xml 复制代码
upstream lb{
    server 127.0.0.1:8080 weight=1;
    server 127.0.0.1:8081 weight=1;
}
location / {
    proxy_pass http://lb;
}
相关推荐
Harbor Lau21 分钟前
Linux常用中间件命令大全
linux·运维·中间件
漫谈网络39 分钟前
基于 Netmiko 的网络设备自动化操作
运维·自动化·netdevops·netmiko
꧁坚持很酷꧂1 小时前
Linux Ubuntu18.04下安装Qt Craeator 5.12.9(图文详解)
linux·运维·qt
小诸葛的博客3 小时前
详解Linux中的定时任务管理工具crond
linux·运维·chrome
一默19913 小时前
CentOS 7.9升级OpenSSH到9.9p2
linux·运维·centos
BranH4 小时前
Linux系统中命令设定临时IP
linux·运维·服务器
极小狐4 小时前
极狐GitLab 项目功能和权限解读
运维·git·安全·gitlab·极狐gitlab
宁酱醇4 小时前
GitLab_密钥生成(SSH-key)
运维·ssh·gitlab
秋风起,再归来~4 小时前
【Linux庖丁解牛】—进程优先级!
linux·运维·服务器
Lalolander4 小时前
设备制造行业如何避免项目管理混乱?
运维·制造·工程项目管理·四算一控·epc·环保设备工程·设备制造