探索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;
}
相关推荐
Michaelwubo8 分钟前
Docker dockerfile镜像编码 centos7
运维·docker·容器
努力--坚持35 分钟前
电商项目-网站首页高可用(一)
nginx·lua·openresty
好像是个likun38 分钟前
使用docker拉取镜像很慢或者总是超时的问题
运维·docker·容器
cominglately3 小时前
centos单机部署seata
linux·运维·centos
CircleMouse3 小时前
Centos7, 使用yum工具,出现 Could not resolve host: mirrorlist.centos.org
linux·运维·服务器·centos
Karoku0664 小时前
【k8s集群应用】kubeadm1.20高可用部署(3master)
运维·docker·云原生·容器·kubernetes
木子Linux4 小时前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算
mit6.8244 小时前
Ubuntu 系统下性能剖析工具: perf
linux·运维·ubuntu
watermelonoops4 小时前
Windows安装Ubuntu,Deepin三系统启动问题(XXX has invalid signature 您需要先加载内核)
linux·运维·ubuntu·deepin
阿甘知识库5 小时前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站