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

2025-05-24

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

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

哇!这术语好复杂,定义也好混乱,还充斥着各种令人费解的词汇,对吧?别担心,我可以先帮你理解一下 Nginx 架构和术语的基本框架。然后我们再安装并创建Nginx配置。

使困惑

为了简单起见,只需记住:Nginx 是一个出色的 Web 服务器

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

代理与反向代理

Nginx 的底层功能是代理。因此,现在需要了解什么是代理和反向代理。

代理人

好了,我们有客户端(>= 1),一个中间 Web 服务器(在本例中我们称之为代理),以及一个服务器。这里主要发生的情况是服务器不知道哪个客户端在请求。有点困惑?让我用示意图来解释一下。

代理人

这里,让client1&client2通过代理服务器向服务器发送请求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发送一个请求,它会返回一个令牌给客户端,用于访问后续的请求。客户端可以使用该令牌向 Web 服务器发送请求。Web 服务器会将请求连同令牌一起发送给任何后端服务器,每个后端服务器都会提供相同的预期输出。

什么是 Nginx?

Nginx 是 Web 服务器,到目前为止,我在整个博客中一直使用“Web 服务器”这个词。说实话,它就像一个中间人

Nginx

该图并不令人困惑,它只是我迄今为止解释过的所有概念的组合。其中,我们有 3 个后端服务器分别在端口 3001、3002、3003 上运行,所有这些后端服务器都使用在端口 5432 上运行的同一个数据库。

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

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

信息量太大了!不过现在,你已经清楚地了解了 Nginx 是什么,以及 Nginx 中使用的术语。现在我们继续学习安装和配置技巧。

安装过程

我们终于到了!如果你终于理解了 Nginx 的概念,并开始学习它的编码部分,那我真是太自豪了。

自豪的

好吧,我只想告诉你,安装过程在任何系统上都超级简单,只需一行代码。我是 Mac OSX 用户,所以会基于它编写命令。不过对于UbuntuWindows和其他 Linux 发行版,安装过程也类似。

$ brew install Nginx
Enter fullscreen mode Exit fullscreen mode

以上只是必需步骤,现在你的系统上已经安装好了 Nginx!太棒了!

跑起来太简单了!😛

运行此程序并检查 Nginx 是否在您的系统上运行,这又太简单了。

$ nginx 
# OR 
$ sudo nginx
Enter fullscreen mode Exit fullscreen mode

此后,使用您最喜欢的浏览器进行检查http://localhost:8080/,您将看到如下所示的屏幕!

启动 nginx

基本配置设置和示例

好的,我们将通过一个例子来了解 Nginx 的神奇之处。
首先,在本地机器上创建如下目录结构:

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

另外,在htmlmd文件中包含基本上下文

我们想要达到什么目的?

这里有两个独立的文件夹nginx-demotemp-nginx,每个文件夹都包含静态 HTML 文件。我们将重点介绍如何在公共端口上运行这两个文件夹,并设置我们所需的规则。

现在回到正题。要对 Nginx 默认配置进行任何更改,我们将在路径nginx.conf中的中进行更改usr/local/etc/nginx。另外,我的系统中有 vim,所以我使用 vim 进行更改,但您可以自由选择使用您选择的编辑器。

$ cd /usr/local/etc/nginx
$ vim nginx.conf
Enter fullscreen mode Exit fullscreen mode

这将打开一个包含默认 nginx 配置的文件,而我实在不想用这个文件。因此,我通常的做法是复制这个配置文件,然后修改主文件。我们也照做。

$ cp nginx.conf copy-nginx.conf
$ rm nginx.conf && vim nginx.conf 
Enter fullscreen mode Exit fullscreen mode

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

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

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

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

    这里的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 根目录,还可以设置规则,以便我可以阻止客户端访问某些文件。

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

       location ~ .md {
            return 403;
       }
    
  4. 让我们通过学习常用命令来结束本教程proxy_pass。现在我们已经了解了什么是代理和反向代理,因此我们将从定义另一个在端口 8888 运行的后端服务器开始。所以现在我们有两台后端服务器分别在端口 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 {}
Enter fullscreen mode Exit fullscreen mode

使用 运行此代码sudo nginx

额外的 Nginx 命令!

  1. 首次启动 Nginx Web 服务器。

      $ nginx 
      #OR 
      $ sudo nginx
    
  2. 重新加载正在运行的 Nginx Web 服务器。

      $ nginx -s reload
      #OR 
      $ sudo nginx -s reload
    
  3. 停止正在运行的 Nginx Web 服务器。

      $ nginx -s stop
      #OR 
      $ sudo nginx -s stop
    
  4. 了解系统上正在运行哪些 Nginx 进程。

      $ ps -ef | grep Nginx
    

第 4 个命令很重要,如果前 3 个命令偶然导致某些错误,您通常可以做的是使用第 4 个命令找到所有正在运行的 Nginx 进程并终止进程,然后重新启动它。

要终止一个进程,您需要 PID,然后使用以下命令终止它:

$ kill -9 <PID>
#OR 
$ sudo kill -9 <PID>
Enter fullscreen mode Exit fullscreen mode

在结束这篇文章之前,我使用了来自谷歌图片的图表和视觉效果以及Hussein Nasser的几个 YouTube 教程

我们已经完成了对 Nginx 及其配置的基本了解。如果您对 Nginx 的高级配置感兴趣,请通过评论告诉我。在此之前,享受编程的乐趣,探索 Nginx 的魅力吧!👋

文章来源:https://dev.to/aemiej/nginx-concepts-i-wish-i-knew-years-ago-23o0
PREV
2018 年 22 个 Angular 专家面试问题及答案
NEXT
如何解决编程面试中的挑战