专栏名称: 51CTO技术栈
有趣 | 有料 | 有内涵,为您提供最优质的内容,愿我们一起悦享技术,成就人生。
目录
相关文章推荐
51好读  ›  专栏  ›  51CTO技术栈

牛皮!几张图就把Nginx剖析的明明白白

51CTO技术栈  · 公众号  · 程序员  · 2021-02-22 18:05

正文

Nginx 是一个采用主从架构的 Web 服务器,可用于反向代理、负载均衡器、邮件代理和 HTTP 缓存。


图片来自 Pexels


Emmm,上面的 Nginx 介绍看过去有些复杂而且充满了不明觉厉的术语。


Relax,在这篇文章里,我会先带你理解 Nginx 的架构和专有术语,最后实践一把安装和配置 Nginx。

简单来说,你只要记住一点:Nginx 是个神奇的 Web 服务器。(注:神奇之处下文会娓娓道来)

那什么是 Web 服务器呢?简而言之,Web 服务器就是一个中间人。


举个例子,你要访问 xxxx.com,在地址栏输入 https://xxxx.com 时,你的浏览器会找到 https://xxxx.com 的网络服务器地址并将它指向后端服务器,后端服务器再返回响应给客户端。


代理 vs 反向代理


Nginx 的基本特性是代理,所以你一定要明白什么是代理和反向代理。


代理


看个小例子,现在我们有 N 个客户端(N>=1),一个中间 Web 服务器(在本例中,我们称之为代理)和一个服务器。


这个例子主要的场景是,服务器不知道哪个客户端在请求(响应)。是不是有点难以理解?


下面让我用示意图讲解下:

如图,client1 和 client2 通过代理服务器向服务器发送请求 request1 和 request2,此时后端服务器不知道 request1 是由 client1 发送的还是 client2 发送的,但会执行(响应)操作。


反向代理


简单来说,反向代理与代理的功能相反。现在我们有一个客户端、一个中间 Web 服务器和 N 个后端服务器(N>=1)。


同样的来看下示意图:

如图,客户端将通过 Web 服务器发送请求。而 Web 服务器会通过一个算法,当中最有意思的算法是轮询,直接将请求指向许多后端服务器中的一个,并通过 Web 服务器将响应返回给客户端。

因此,在上面的例子中,客户端其实并不知道在与哪个后端服务器进行交互。


负载均衡


又是枯燥的一个名词:负载均衡,不过它很好理解,因为负载均衡本身就是反向代理的一个实例。


来看看负载均衡和反向代理的本质区别。在负载均衡中,你必须有 2 个或者更多的后端服务器,但在反向代理中,多台服务器不是必需的,甚至一台后端服务器也能运作。


我们再深入点,如果我们有很多来自客户端的请求,负载均衡器会检查每个后端服务器的状态,均匀地分配请求,更快地向客户端发送响应。


有状态 vs 无状态应用


Okay,在我们开始实践 Nginx 之前,先搞清所有的基本知识!


有状态应用


有状态应用存了一个额外变量,只用来保存服务器中单个实例使用所需的信息。

如图所示,一个后端服务器 server1 存储了一些信息,服务器 server2 并不存储此信息,因此,客户端 (上图 Bob) 的交互可能会也可能不会得到想要的结果,因为它可能会与 server1 或 server2 交互。


在本例中,server1 允许 Bob 查看数据文件,但 server2 不允许。因此,虽然有状态应用避免对数据库的多次 API 调用,并且(响应)速度更快,但它可能会在不同的服务器上导致这个(无法得到想要结果)问题。


无状态应用


无状态应用有更多的数据库 API 调用,但当客户端与不同后端服务器的交互时,无状态应用却存在更少的问题。

没明白?简单来说,如果我通过 Web 服务器从客户端向后端服务器 server1 发送请求,它将向客户端返回一个令牌,用于任何进一步的访问请求。


客户端可以使用令牌并向 Web 服务器发送请求。此 Web 服务器将请求连同令牌一起发送到任意后端服务器,而每个后端服务器都能提供相同的所需结果。


Nginx 是什么?


Nginx 是网络服务器,到目前为止,我的整个博客一直在用这个网络服务器。老实说,Nginx 这就像个中间人。

这个图不难理解,它是目前为止所有概念的一个组合。在这里,我们有 3 个后端服务器运行在 3001、3002 和 3003 端口,这些后端服务器都能访问同一个运行在 5432 端口的数据库。


当一个客户端向 https://localhost (默认端口 443)发起一个 GET /employees 请求时,Nginx 将基于算法向任意后端服务器发送请求,从数据库获取数据并将 JSON 数据返回 Nginx Web 服务器再发送给客户端。


如果我们使用一个诸如轮询这样的算法,它让 client2 向 https://localhost 发送一个请求,然后 Nginx 服务器会先将请求传到 3000 端口并将响应返回给客户端。对另一个请求,Nginx 会把请求传给 3002 端口,以此类推。

知识储备完成!到这里,你对 Nginx 是什么以及 Nginx 所涉及的术语有了一个清晰的理解。是时候,了解安装和配置技术了。


开始安装 Nginx


时机到了,如果你了解了上面的概念,可以动手开始 Nginx 实践了。

嗯,Nginx 的安装过程对任何系统来说都很简单。我是一个 Mac OSX 用户,所以例子的命令是基于 macOS 的, Ubuntu、Windows 和其他 Linux 发行版操作和例子类似。

$ brew install Nginx


只要执行上面这步,你的系统就有 Nginx 了!是不是很神奇?


运行 Nginx 如此简单,要检查 Nginx 是否运行也很简单。

$ nginx 
# OR 
$ sudo nginx


执行上面指令,再打开浏览器并输入 http://localhost:8080/ 回车查看下,你会看到以下画面!

Nginx 基本配置 & 示例


下面,我们通过实操来感受下 Nginx 的魔力。


首先,在本地创建如下的目录结构:

.
├── nginx-demo
│  ├── content
│  │  ├── first.txt
│  │  ├── index.html
│  │  └── index.md
│  └── main
│    └── index.html
└── temp-nginx
  └── outsider
    └── index.html

当然,.html 和 .md 文件中要包含基本信息。我们想要得到什么呢?

这里,我们有两个单独的文件夹 nginx-demo 和 temp-nginx,每个文件夹都包含静态 HTML 文件。我们将着力在一个公共端口上运行这两个文件夹,并设置我们想要的规则。


回到之前说的,如果要修改 Nginx 默认配置,得修改 usr/local/etc/nginx 目录下的 nginx.conf文件。


我的系统中有 vim,所以在这里用 vim 来更改 Nginx 配置,你可以用自己的编辑器来修改配置。

$ cd /usr/local/etc/nginx
$ vim nginx.conf






请到「今天看啥」查看全文