Nginx 是一个 Web 服务器,用来作反向代理、负载均衡器、邮件代理和 HTTP 缓存,它遵循主从式架构。
嗯,一个复杂的术语和一个令人困惑的定义,充满了令人困惑的大词,对吗?
别担心,我可以帮助大家首先了解 Nginx 架构和术语的基本框架。然后我们将继续安装和创建Nginx配置。
为了让事情变得简单,请记住:Nginx 是一个令人叹为观止的 Web 服务器。
Web服务器,简单来说,就像一个中间人。假设你想要访问 dev.to,你在浏览器中输入地址https://dev.to,浏览器会找到Web服务器的地址,https://dev.to然后将其定向到后端服务器,后端服务器会将响应返回给客户端。
代理与反向代理
Nginx 的基本功能是代理。因此现在有必要了解什么是代理和反向代理。
代理
好吧,我们有客户端 (>= 1)、一个中间 Web 服务器(在本例中,我们称之为代理)和一个服务器。这里发生的主要事情是服务器不知道哪个客户端正在请求。
有点混乱?让我用下列的草图来解释一下。
Nginx 的基本功能是代理。因此现在有必要了解什么是代理和反向代理。
代理
好吧,我们有客户端 (>= 1)、一个中间 Web 服务器(在本例中,我们称之为代理)和一个服务器。这里发生的主要事情是服务器不知道哪个客户端正在请求。
有点混乱?让我用下列的草图来解释一下。
代理
好吧,我们有客户端 (>= 1)、一个中间 Web 服务器(在本例中,我们称之为代理)和一个服务器。这里发生的主要事情是服务器不知道哪个客户端正在请求。
有点混乱?让我用下列的草图来解释一下。
好吧,我们有客户端 (>= 1)、一个中间 Web 服务器(在本例中,我们称之为代理)和一个服务器。这里发生的主要事情是服务器不知道哪个客户端正在请求。
有点混乱?让我用下列的草图来解释一下。
有点混乱?让我用下列的草图来解释一下。
在此,让client1和client2通过Proxy服务器向服务器发送请求request1和request2。此时后端服务器将不知道request1是由client1还是client2发送的,但是会执行操作。
反向代理
从文字上解释,反向代理与代理的作用相反。在这里,我们假设有一个客户端、一个中间 Web 服务器和多个后端服务器 (>=1)。
下面也用草图来做个展示!
在此,客户端将通过Web服务器发送请求。现在,Web服务器将通过一种算法定向到众多服务器中的任何一个,其中一个是循环法(最可爱的一个),并通过Web服务器将响应发送回客户端。
所以在此处,客户端并不知道它与哪个后端服务器交互。
负载均衡
这是另一个新术语,但这个术语更容易理解,因为它是反向代理本身的一个实例应用。
来看看基本的区别。在负载平衡中,你必须有 2 个或更多个后端服务器,但在反向代理设置中,这不是必需的,也可以与 1 个后端服务器一起工作。
让我们从幕后看一下,如果有很多来自客户端的请求,则负载均衡器会检查每个后端服务器的状态并分配请求的负载,并更快地将响应发送到客户端。
有状态应用程序与无状态应用程序
好吧,伙伴们,我保证已经非常接近开始编写 Nginx 代码了。让我们来弄清楚所有的准系统!
有状态应用程序
该应用程序会存储一个附加变量,用于保存仅适用于服务器的单个实例的信息。
这是另一个新术语,但这个术语更容易理解,因为它是反向代理本身的一个实例应用。
来看看基本的区别。在负载平衡中,你必须有 2 个或更多个后端服务器,但在反向代理设置中,这不是必需的,也可以与 1 个后端服务器一起工作。
让我们从幕后看一下,如果有很多来自客户端的请求,则负载均衡器会检查每个后端服务器的状态并分配请求的负载,并更快地将响应发送到客户端。
有状态应用程序与无状态应用程序
好吧,伙伴们,我保证已经非常接近开始编写 Nginx 代码了。让我们来弄清楚所有的准系统!
有状态应用程序
该应用程序会存储一个附加变量,用于保存仅适用于服务器的单个实例的信息。
来看看基本的区别。在负载平衡中,你必须有 2 个或更多个后端服务器,但在反向代理设置中,这不是必需的,也可以与 1 个后端服务器一起工作。
让我们从幕后看一下,如果有很多来自客户端的请求,则负载均衡器会检查每个后端服务器的状态并分配请求的负载,并更快地将响应发送到客户端。
有状态应用程序与无状态应用程序
好吧,伙伴们,我保证已经非常接近开始编写 Nginx 代码了。让我们来弄清楚所有的准系统!
有状态应用程序
该应用程序会存储一个附加变量,用于保存仅适用于服务器的单个实例的信息。
让我们从幕后看一下,如果有很多来自客户端的请求,则负载均衡器会检查每个后端服务器的状态并分配请求的负载,并更快地将响应发送到客户端。
有状态应用程序与无状态应用程序
好吧,伙伴们,我保证已经非常接近开始编写 Nginx 代码了。让我们来弄清楚所有的准系统!
有状态应用程序
该应用程序会存储一个附加变量,用于保存仅适用于服务器的单个实例的信息。
有状态应用程序与无状态应用程序
好吧,伙伴们,我保证已经非常接近开始编写 Nginx 代码了。让我们来弄清楚所有的准系统!
有状态应用程序
该应用程序会存储一个附加变量,用于保存仅适用于服务器的单个实例的信息。
好吧,伙伴们,我保证已经非常接近开始编写 Nginx 代码了。让我们来弄清楚所有的准系统!
有状态应用程序
该应用程序会存储一个附加变量,用于保存仅适用于服务器的单个实例的信息。
有状态应用程序
该应用程序会存储一个附加变量,用于保存仅适用于服务器的单个实例的信息。
该应用程序会存储一个附加变量,用于保存仅适用于服务器的单个实例的信息。
如果对于后端服务器server1存储了一些信息,则它不会为服务器server2存储,因此交互的客户端(此处为 Bob)可能不会获得所需的结果,因为它可能与 server1 或 server2 交互。
在这种情况下,server1 将允许 Bob 查看配置文件,但 server2 则不允许。因此,即使它阻止了对数据库的许多 API 调用并且速度更快,它也可能导致跨不同服务器的问题。
无状态应用程序
现在无状态是指更多对数据库的 API 调用,但客户端与不同后端服务器交互时存在的问题更少。
这很简单,如果我通过 Web 服务器从客户端发送请求到后端服务器server1,它将向客户端提供一个令牌(Token)以用于访问任何进一步的请求。客户端可以使用令牌并向Web服务器发送请求。该 Web 服务器将请求连同令牌一起发送到任何后端服务器,每个后端服务器将提供相同的所需输出。
什么是 Nginx?
Nginx 是 Web 服务器,到目前为止我一直在整个网站中使用它做为 Web 服务器。
老实说,Nginx就像一个中间人。
Nginx 是 Web 服务器,到目前为止我一直在整个网站中使用它做为 Web 服务器。
老实说,Nginx就像一个中间人。
老实说,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 编码部分的概念,我会感到非常地高兴。
我是 Mac OSX 用户,因此将基于它编写安装命令。但对于ubuntu和windows以及其他 Linux 发行版来说,也会进行类似的操作。
$ brew install nginx
我是 Mac OSX 用户,因此将基于它编写安装命令。但对于ubuntu和windows以及其他 Linux 发行版来说,也会进行类似的操作。
$ brew install nginx
$ 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
下面,我们将做一个例子来看看 Nginx 的魔力。首先在本机创建目录结构如下:
-
-
-
-
-
-
-
-
-
-
.
├── nginx-demo
│ ├── content
│ │ ├── first.txt
│ │ ├── index.html
│ │ └── index.md
│ └── main
│ └── index.html
└── temp-nginx
└── outsider
└── index.html
.
├── 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 的魔力吧!