书名门牌号:Nginx concepts I wish I knew years ago
书名译者:Aemie Jariwala(已许可)
翻译者 & 标定:HelloGitHub-小鱼干 & 卤肉
Nginx 是两个选用characterization构架的 Web 伺服器,可用作逆向全权、阻抗调谐、电子邮件全权和 HTTP 内存。
Emmm,下面的 Nginx 如是说看往后很多繁杂所以充满著了未明觉厉的名词。Relax,在这首诗里,我(原作)会宿苞你认知 Nginx 的构架和私有名词,最终课堂教学两把加装和实用性Nginx。
单纯而言,你如果读懂一点儿:Nginx 是个奇妙的 Web 伺服器。(注:奇妙之处Nenon会暗喻)
那甚么是 Web 伺服器呢?具体而言,Web 伺服器是两个掮客。举个范例,你要出访hellogithub.com(注:书名范例为 dev.to),在门牌号栏输出 https://hellogithub.com时,你的应用程序会找出https://hellogithub.com 的互联网伺服器门牌号并将它对准后端伺服器,后端伺服器再回到积极响应给应用程序。
全权 vs 逆向全权
Nginx 的基本特性是全权,所以你一定要明白甚么是代理和逆向全权。
全权
看个小范例,现在我们有 N 个应用程序(N >= 1),两个中间 Web 伺服器(在本例中,我们称之为全权)和两个伺服器。这个范例主要的场景是,伺服器不知道哪个应用程序在请求(积极响应)。是不是有点难以认知?下面让我用示意图讲解下:
如图,client1 和 client2 通过全权伺服器向伺服器发送请求 request1 和 request2,此时后端伺服器不知道 request1 是由 client1 发送的还是 client2 发送的,但会执行(积极响应)操作。
逆向全权
单纯而言,逆向全权与全权的功能相反。现在我们有两个应用程序、两个中间 Web 伺服器和 N 个后端伺服器(N >= 1),同样的来看下示意图:
如图,应用程序将通过 Web 伺服器发送请求。而 Web 伺服器会通过两个算法,当中最有意思的算法是轮询,直接将请求对准许多后端伺服器中的两个,并通过 Web 伺服器将积极响应回到给应用程序。因此,在下面的范例中,应用程序其实并不知道在与哪个后端伺服器进行交互。
阻抗均衡
又是枯燥的两个名词:阻抗均衡,不过它很好认知,因为阻抗均衡本身是逆向全权的两个实例。
来看看阻抗均衡和逆向全权的本质区别。在阻抗均衡中,你必须有 2 个或者更多的后端伺服器,但在逆向全权中,多台伺服器不是必需的,甚至一台后端伺服器也能运作。我们再深入点,如果我们有很多来自应用程序的请求,阻抗调谐会检查每个后端伺服器的状态,均匀地分配请求,更快地向应用程序发送积极响应。
有状态 vs 无状态应用
Okay,在我们开始课堂教学 Nginx 之前,先搞清所有的基本知识!
有状态应用
有状态应用存了两个额外变量,只用来保存伺服器中单个实例使用所需的信息。
如图所示,两个后端伺服器 server1 存储了一些信息,伺服器 server2 并不存储此信息,因此,应用程序 (上图 Bob) 的交互可能会也可能不会得到想要的结果,因为它可能会与 server1 或 server2 交互。在本例中,server1 允许 Bob 查看数据文件,但 server2 不允许。因此,虽然有状态应用避免对数据库的多次 API 调用,并且(积极响应)速度更快,但它可能会在不同的伺服器上导致这个(无法得到想要结果)问题。
无状态应用
无状态应用有更多的数据库 API 调用,但当应用程序与不同后端伺服器的交互时,无状态应用却存在更少的问题。
没明白?单纯而言,如果我通过 Web 伺服器从应用程序向后端伺服器 server1 发送请求,它将向应用程序回到两个令牌,用作任何进一步的出访请求。应用程序可以使用令牌并向 Web 伺服器发送请求。此 Web 伺服器将请求连同令牌一起发送到任意后端伺服器,而每个后端伺服器都能提供相同的所需结果。
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 的加装过程对任何系统而言都很单纯。我是两个 Mac OSX 用户,所以范例的命令是基于 macOS 的, Ubuntu、Windows 和其他 Linux 发行版操作和范例类似。
$ brew install Nginx如果执行下面这步,你的系统就有 Nginx 了!是不是很奇妙!
运行 Nginx 如此单纯
要检查 Nginx 是否运行也很单纯。
$ nginx # OR $ sudo nginx执行下面指令,再打开应用程序并输出 http://localhost:8080/回车查看下,你会看到以下画面!
Nginx 基本实用性 & 示例
下面,我们通过实操来感受下 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 默认实用性,得修改 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 {
return403;
} 最终,让我们学习下 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 的魔力吧!