17611538698
webmaster@21cto.com

我希望几年前就知道的 Nginx 概念

运维 0 731 2024-05-12 06:55:12

图片

Nginx 是一个 Web 服务器,用来作反向代理、负载均衡器、邮件代理和 HTTP 缓存,它遵循主从式架构。

嗯,一个复杂的术语和一个令人困惑的定义,充满了令人困惑的大词,对吗?

别担心,我可以帮助大家首先了解 Nginx 架构和术语的基本框架。然后我们将继续安装和创建Nginx配置。

图片

为了让事情变得简单,请记住:Nginx 是一个令人叹为观止的 Web 服务器。

Web服务器,简单来说,就像一个中间人。假设你想要访问 dev.to,你在浏览器中输入地址https://dev.to,浏览器会找到Web服务器的地址,https://dev.to然后将其定向到后端服务器,后端服务器会将响应返回给客户端。

代理与反向代理


Nginx 的基本功能是代理。因此现在有必要了解什么是代理和反向代理。


代理


好吧,我们有客户端 (>= 1)、一个中间 Web 服务器(在本例中,我们称之为代理)和一个服务器。这里发生的主要事情是服务器不知道哪个客户端正在请求。


有点混乱?让我用下列的草图来解释一下。

图片

在此,让client1和client2通过Proxy服务器向服务器发送请求request1和request2。此时后端服务器将不知道request1是由client1还是client2发送的,但是会执行操作。

反向代理


从文字上解释,反向代理与代理的作用相反。在这里,我们假设有一个客户端、一个中间 Web 服务器和多个后端服务器 (>=1)。


下面也用草图来做个展示!

图片

在此,客户端将通过Web服务器发送请求。现在,Web服务器将通过一种算法定向到众多服务器中的任何一个,其中一个是循环法(最可爱的一个图片),并通过Web服务器将响应发送回客户端。

所以在此处,客户端并不知道它与哪个后端服务器交互。

负载均衡


这是另一个新术语,但这个术语更容易理解,因为它是反向代理本身的一个实例应用。


来看看基本的区别。在负载平衡中,你必须有 2 个或更多个后端服务器,但在反向代理设置中,这不是必需的,也可以与 1 个后端服务器一起工作。


让我们从幕后看一下,如果有很多来自客户端的请求,则负载均衡器会检查每个后端服务器的状态并分配请求的负载,并更快地将响应发送到客户端。


有状态应用程序与无状态应用程序


好吧,伙伴们,我保证已经非常接近开始编写 Nginx 代码了。让我们来弄清楚所有的准系统!


有状态应用程序


该应用程序会存储一个附加变量,用于保存仅适用于服务器的单个实例的信息。


图片

如果对于后端服务器server1存储了一些信息,则它不会为服务器server2存储,因此交互的客户端(此处为 Bob)可能不会获得所需的结果,因为它可能与 server1 或 server2 交互。

在这种情况下,server1 将允许 Bob 查看配置文件,但 server2 则不允许。因此,即使它阻止了对数据库的许多 API 调用并且速度更快,它也可能导致跨不同服务器的问题。

无状态应用程序


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

图片

这很简单,如果我通过 Web 服务器从客户端发送请求到后端服务器server1,它将向客户端提供一个令牌(Token)以用于访问任何进一步的请求。客户端可以使用令牌并向Web服务器发送请求。该 Web 服务器将请求连同令牌一起发送到任何后端服务器,每个后端服务器将提供相同的所需输出。

什么是 Nginx?


Nginx 是 Web 服务器,到目前为止我一直在整个网站中使用它做为 Web 服务器。


老实说,Nginx就像一个中间人。


图片

该图是我到目前为止解释中所有概念的组合。在此,我们有 3 个后端服务器在端口 3001、3002、3003 上运行,所有这些后端服务器都使用在端口 5432 上运行的相同数据库。

GET /employees

现在,当客户端在(默认在端口 443 上)发送请求到 https://localhost时,它将根据算法将此请求传递到任意后端服务器,并从数据库中获取信息,并将 JSON 发送回 Nginx Web 服务器并发送返回给客户端。

如果我们要使用诸如round-robin之类的算法,那么假设客户端 2 也发送了一个请求:https://localhost,那么 Nginx 服务器将首先将请求传递到端口 3000,然后将响应发送回客户端。对于另一个请求,Nginx 会将请求传递给 3002 等等。

至此,你已经清楚地了解了 Nginx 是什么,以及 Nginx 使用的术语。现在我们将继续了解安装和配置技术。

安装过程


终于到安装正式环节了。如果你最后理解了 Nginx 编码部分的概念,我会感到非常地高兴。


我是 Mac OSX 用户,因此将基于它编写安装命令。但对于ubuntu和windows以及其他 Linux 发行版来说,也会进行类似的操作。


$ brew install nginx

如下图示:

图片

等待它下载并安装,然后你的系统上现在已经安装了 Nginx!😛

要运行它并检查 Nginx 是否在您的系统上运行,请使用如下命令:

$ nginx # 或者$ sudo nginx

之后,打开你的Chrome并打开 http://localhost:8080/,你将看到以下屏幕!

图片

基本配置设置和示例


下面,我们将做一个例子来看看 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 默认配置进行更改是nginx.conf文件,是在usr/local/etc/nginx文件夹中。另外,我的系统中有 vim,因此将使用 vim 进行更改,你可以自由地使用其它喜欢选择的编辑器。


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

这将打开一个带有默认 nginx 配置的文件,这里我不想对它做更改,我通常所做的方法是复制此配置文件,然后对主文件进行更改。

$ cp nginx.conf copy-nginx.conf$ rm nginx.conf && vim nginx.conf

现在这将打开一个空文件,我们将为其添加配置。

  1. 添加基本的配置设置。添加 是必须的,events {}因为它通常用于提及 Nginx 架构的工作线程数量。我们在这里用来http告诉 Nginx 我们将在OSI 模型的第 7 层工作。


    在此,我们告诉 nginx 监听端口 5000 并指向主文件夹中提到的静态文件。

  http {
server { listen 5000; root /path/to/nginx-demo/main/; }
}
events {}
接下来,我们将为/content和/outsiderURL 添加其他规则。
其中外部人员将指向第一步中提到的根目录之外的目录。


这里location /content表示在叶目录中定义哪个根,内容子 URL 都将添加到定义的根 URL 的末尾。

因此在这里,当我指定 root 时,root /path/to/nginx-demo/它表示着我告诉 Nginx 显示http://localhost:5000/path/to/nginx-demo/content/文件夹中静态文件的内容。

http {
server { listen 5000; root /path/to/nginx-demo/main/;
location /content { root /path/to/nginx-demo/; }
location /outsider { root /path/temp-nginx/; } }
}
events {}

很酷!现在,Nginx 不仅限于定义 URL 根,还可以设置规则,以便我可以阻止客户端访问某些文件。

我们在主服务器中编写一条附加规则,定义为阻止任何.md文件被访问。可以在 Nginx 中使用正则表达式,将定义规则如下:


   location ~ .md {        return 403;   }


现在我们已经了解了什么是代理和反向代理,因此我们将首先定义在端口 8888 指向运行的另一个后端服务器。假设我们有 2 个在端口 5000 和 8888 上运行的后端服务器。

我们要做的是,当客户端通过 Nginx 访问端口 8888 时,我们会将这个请求传递到端口 5000 并将响应发回客户端。

   server {       listen 8888;
location / { proxy_pass http://localhost:5000/; }
location /new { proxy_pass http://localhost:5000/outsider/; } }


让我们一起看看最终的完整代码:😁

http {
server { listen 5000; root /path/to/nginx-demo/main/;
location /content { root /path/to/nginx-demo/; }
location /outsider { root /path/temp-nginx/; }
location ~ .md { return 403; } }
server { listen 8888;
location / { proxy_pass http://localhost:5000/; }
location /new { proxy_pass http://localhost:5000/outsider/; } }
}
events {}

接着运行此代码:

sudo nginx

额外的 Nginx 命令

用于测试配置文件中格式是否正确的命令:

sudo nginx -T

首次启动 Nginx Web 服务器。

  $ nginx   #OR   $ sudo nginx

重新加载正在运行的 Nginx Web 服务器。

  $ nginx -s reload  #OR   $ sudo nginx -s reload

停止正在运行的 Nginx  服务器。

$ nginx -s stop#OR $ sudo nginx -s stop



了解系统上是否正在运行 Nginx 进程。

$ ps -ef | grep Nginx


第 4 个命令很重要,如果前 3 个命令有可能导致一些错误,通常情况下可使用第 4 个命令找到所有正在运行的 Nginx 进程然后终止它们,然后再重新启动它。

要终止进程,需要刚才显示的 PID,然后使用以下命令终止它:

$ kill -9 #OR $ sudo kill -9 

现在我们已经对 Nginx 及其配置有了基本的了解。如果有其它想法欢迎通过评论告诉我。

让我们一起享受和探索 Nginx 的魔力吧!图片

作者:万能的大雄

评论