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

2024年 5月 17日 66.3k 0

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

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

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

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

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

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

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

代理与反向代理

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

代理

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

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

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

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

反向代理

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

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

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

在此,客户端将通过Web服务器发送请求。现在,Web服务器将通过一种算法定向到众多服务器中的任何一个,其中一个是循环法(最可爱的一个我希望几年前就知道的 Nginx 概念-5),并通过Web服务器将响应发送回客户端。

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

负载均衡

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

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

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

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

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

有状态应用程序

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

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

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

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

无状态应用程序

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

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

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

什么是 Nginx?

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

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

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

该图是我到目前为止解释中所有概念的组合。在此,我们有 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 概念-9

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

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

$ nginx # 或者$ sudo nginx

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

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

基本配置设置和示例

下面,我们将做一个例子来看看 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

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

  • 添加基本的配置设置。添加 是必须的,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 的魔力吧!我希望几年前就知道的 Nginx 概念-5

    相关文章

    塑造我成为 CTO 之路的“秘诀”
    “人工智能教母”的公司估值达 10 亿美金
    教授吐槽:985 高校成高级蓝翔!研究生基本废了,只为房子、票子……
    Windows 蓝屏中断提醒开发者:Rust 比 C/C++ 更好
    Claude 3.5 Sonnet 在伽利略幻觉指数中名列前茅
    上海新增 11 款已完成登记生成式 AI 服务

    发布评论