slot deposit pulsa slot mahjong slot gacor slot gacor slot gacor resmi slot gacor 2025 slot gacor terpercaya slot gacor 2025 slot gacor hari ini slot gacor hari ini slot gacor hari ini
我希望几年前就知道的 Nginx 概念
17611538698
webmaster@21cto.com

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

运维 0 1219 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 的魔力吧!图片

作者:万能的大雄

评论