写给小白的 Nginx 文章

2022-12-19 0 270

写给小白的 Nginx 文章

书名门牌号:Nginx concepts I wish I knew years ago

书名译者:Aemie Jariwala(已许可)

翻译者 & 标定:HelloGitHub-小鱼干 & 卤肉

Nginx 是两个选用characterization构架的 Web 伺服器,可用作逆向全权、阻抗调谐、电子邮件全权和 HTTP 内存。

Emmm,下面的 Nginx 如是说看往后很多繁杂所以充满著了未明觉厉的名词。Relax,在这首诗里,我(原作)会宿苞你认知 Nginx 的构架和私有名词,最终课堂教学两把加装和实用性Nginx

写给小白的 Nginx 文章

单纯而言,你如果读懂一点儿:Nginx 是个奇妙的 Web 伺服器。(注:奇妙之处Nenon会暗喻)

那甚么是 Web 伺服器呢?具体而言,Web 伺服器是两个掮客。举个范例,你要出访hellogithub.com(注:书名范例为 dev.to),在门牌号栏输出 https://hellogithub.com时,你的应用程序会找出https://hellogithub.com 的互联网伺服器门牌号并将它对准后端伺服器,后端伺服器再回到积极响应给应用程序。

全权 vs 逆向全权

Nginx 的基本特性是全权,所以你一定要明白甚么是代理逆向全权

全权

看个小范例,现在我们有 N 个应用程序(N >= 1),两个中间 Web 伺服器(在本例中,我们称之为全权)和两个伺服器。这个范例主要的场景是,伺服器不知道哪个应用程序在请求(积极响应)。是不是有点难以认知?下面让我用示意图讲解下:

写给小白的 Nginx 文章

如图,client1 和 client2 通过全权伺服器向伺服器发送请求 request1 和 request2,此时后端伺服器不知道 request1 是由 client1 发送的还是 client2 发送的,但会执行(积极响应)操作。

逆向全权

单纯而言,逆向全权与全权的功能相反。现在我们有两个应用程序、两个中间 Web 伺服器和 N 个后端伺服器(N >= 1),同样的来看下示意图:

写给小白的 Nginx 文章

如图,应用程序将通过 Web 伺服器发送请求。而 Web 伺服器会通过两个算法,当中最有意思的算法是轮询,直接将请求对准许多后端伺服器中的两个,并通过 Web 伺服器将积极响应回到给应用程序。因此,在下面的范例中,应用程序其实并不知道在与哪个后端伺服器进行交互。

阻抗均衡

又是枯燥的两个名词:阻抗均衡,不过它很好认知,因为阻抗均衡本身是逆向全权的两个实例。

来看看阻抗均衡和逆向全权的本质区别。在阻抗均衡中,你必须有 2 个或者更多的后端伺服器,但在逆向全权中,多台伺服器不是必需的,甚至一台后端伺服器也能运作。我们再深入点,如果我们有很多来自应用程序的请求,阻抗调谐会检查每个后端伺服器的状态,均匀地分配请求,更快地向应用程序发送积极响应。

有状态 vs 无状态应用

Okay,在我们开始课堂教学 Nginx 之前,先搞清所有的基本知识!

有状态应用

有状态应用存了两个额外变量,只用来保存伺服器中单个实例使用所需的信息。

写给小白的 Nginx 文章

如图所示,两个后端伺服器 server1 存储了一些信息,伺服器 server2 并不存储此信息,因此,应用程序 (上图 Bob) 的交互可能会也可能不会得到想要的结果,因为它可能会与 server1 或 server2 交互。在本例中,server1 允许 Bob 查看数据文件,但 server2 不允许。因此,虽然有状态应用避免对数据库的多次 API 调用,并且(积极响应)速度更快,但它可能会在不同的伺服器上导致这个(无法得到想要结果)问题。

无状态应用

无状态应用有更多的数据库 API 调用,但当应用程序与不同后端伺服器的交互时,无状态应用却存在更少的问题。

写给小白的 Nginx 文章

没明白?单纯而言,如果我通过 Web 伺服器从应用程序向后端伺服器 server1 发送请求,它将向应用程序回到两个令牌,用作任何进一步的出访请求。应用程序可以使用令牌并向 Web 伺服器发送请求。此 Web 伺服器将请求连同令牌一起发送到任意后端伺服器,而每个后端伺服器都能提供相同的所需结果。

Nginx 是甚么?

Nginx 是互联网伺服器,到目前为止,我的整个博客一直在用这个互联网伺服器。老实说,Nginx 这就像个掮客

写给小白的 Nginx 文章

这个图不难认知,它是目前为止所有概念的两个组合。在这里,我们有 3 个后端伺服器运行在 3001、3002 和 3003 端口,这些后端伺服器都能出访同两个运行在 5432 端口的数据库。

当两个应用程序向 https://localhost (默认端口 443)发起两个 GET /employeeseb 伺服器再发送给应用程序。

如果我们使用两个诸如轮询这样的算法,它让 client2 向 https://localhost发送两个请求,然后 Nginx 伺服器会先将请求传到 3000 端口并将积极响应返回给应用程序。对另两个请求,Nginx 会把请求传给 3002 端口,以此类推。

知识储备完成!到这里,你对 Nginx 是甚么以及 Nginx 所涉及的名词有了两个清晰的认知。是时候,了解加装和实用性技术了。

开始加装 Nginx

时机到了,如果你了解了下面的概念,可以动手开始 Nginx 课堂教学了。

写给小白的 Nginx 文章

嗯,Nginx 的加装过程对任何系统而言都很单纯。我是两个 Mac OSX 用户,所以范例的命令是基于 macOS 的, Ubuntu、Windows 和其他 Linux 发行版操作和范例类似。

$ brew install Nginx

如果执行下面这步,你的系统就有 Nginx 了!是不是很奇妙!

运行 Nginx 如此单纯

要检查 Nginx 是否运行也很单纯。

$ nginx  # OR  $ sudo nginx

执行下面指令,再打开应用程序并输出 http://localhost:8080/回车查看下,你会看到以下画面!

写给小白的 Nginx 文章

Nginx 基本实用性 & 示例

下面,我们通过实操来感受下 Nginx 的魔力。

首先,在本地创建如下的目录结构:

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

当然,.html.md 文件中要包含基本信息。

我们想要得到甚么呢?

这里,我们有两个单独的文件夹 nginx-demotemp-nginx,每个文件夹都包含静态 HTML 文件。我们将着力在两个公共端口上运行这两个文件夹,并设置我们想要的规则。

回到之前说的,如果要修改 Nginx 默认实用性,得修改 usr/local/etc/nginx 目录下的 nginx.conf文件。我的系统中有 vim,所以在这里用 vim 来更改 Nginx 实用性,你可以用自己的编辑器来修改实用性。

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

下面的命令会打开两个 Nginx 默认实用性文件,我真的不想直接使用默认实用性。因此,我通常的做法是复制这个实用性文件,然后对主文件进行更改。这里也不例外。

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

下面命令将打开两个空文件,我们将为它添加实用性。

添加实用性的基本设置。一定要添加 events {},因为在 Nginx 构架中,它通常用来表示 worker 的数量。在这里我们用http 告诉 Nginx 我们将在 OSI 模型 的第 7 层作业。 这里,我们告诉 Nginx 监听 5000 端口,并对准 main 文件夹中的静态文件。

http {

server {

listen 5000;

root /path/to/nginx-demo/main/;

}

}

events {}
接下来我们将为 /content/outsider URL 添加其他的规则,其中 outsider 将对准第一步中提到的根目录之外的目录。 这里的 location /content 表示无论我在叶(leaf)目录中定义了甚么根(root),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;

}
最终,让我们学习下 proxy_pass命令来结束这个章节。我们已经了解了甚么是全权和逆向全权,在这里我们从定义另两个运行在 8888 端口上的后端伺服器开始。现在,我们在 5000 和 8888 端口上运行了 2 个后端伺服器。 我们要做的是,当应用程序通过 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_passhttp://localhost:5000/;         }location /new {             proxy_passhttp://localhost:5000/outsider/;         }   } }events {}

使用 sudo nginx 来运行此实用性。

其他 Nginx 命令

首次启动 Nginx Web 伺服器。

$ nginx

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

$ nginx -s reload

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

$ nginx -s stop

#OR $ sudo nginx -s stop查看系统上运行的 Nginx 进程。 $ ps -ef | grep Nginx

第 4 条命令很重要,如果前 3 条命令产生了一些问题,通常你可以用第 4 条命令找出所有正在运行的 Nginx 进程并杀死进程,然后重新启动它们。

要杀死两个进程,你需要 PID,再用以下命令杀死它:

$ kill -9 <PID> #OR  $ sudo kill -9 <PID>

结束本文之前,声明下,文中我用了些来自 Google 的图片和 Hussein Nasser 发布在油管的视频教程。

下面尽情享受 Coding、探索 Nginx 的魔力吧!

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务