当前位置: 首页 > 科技观察

牛皮!几张图就把Nginx剖析清楚了

时间:2023-03-20 00:55:22 科技观察

Nginx是一个主从架构的web服务器,可以做反向代理,负载均衡,邮件代理,HTTP缓存。图片来自PexelsEmmm,上面对Nginx的介绍看起来有点复杂,充满了不明确的名词。放心,在这篇文章中,我将首先带你了解Nginx的架构和术语,最后在实践中安装和配置Nginx。简而言之,你只需要记住一件事:Nginx是一个了不起的网络服务器。(注:下面会讲解魔术)那么什么是Web服务器呢?简而言之,Web服务器是一个中间人。比如你想访问xxxx.com,当你在地址栏输入https://xxxx.com时,你的浏览器会找到https://xxxx.com的web服务器地址,并指向后台服务器,然后端服务器返回一个响应给客户端。ProxyvsReverseProxyNginx的基本特性是proxy,所以你必须了解什么是proxy和reverseproxy。Proxy看一个小例子,现在我们有N个客户端(N>=1),一个中间Web服务器(在这种情况下,我们称之为代理)和一个服务器。这个例子的主要场景是服务器不知道哪个客户端在请求(响应)。是不是有点难懂?我用示意图来解释一下:如图所示,client1和client2通过代理服务器向服务器发送请求request1和request2。此时后端服务器不知道request1是client1还是client2发出的,但是会执行(响应)action。反向代理简单地说,反向代理与代理相反。现在我们有一个客户端、一个中间Web服务器和N个后端服务器(N>=1)。同理看示意图:如图所示,客户端会通过Web服务器发送请求。而web服务器会经过一个算法,其中最有意思的就是轮询,直接将请求指向众多后端服务器中的一台,通过web服务器将响应返回给客户端。因此,在上面的示例中,客户端实际上并不知道它正在与哪个后端服务器交互。负载均衡是另一个无聊的名词:负载均衡,但是很好理解,因为负载均衡本身就是反向代理的一个实例。下面我们来看看负载均衡和反向代理的本质区别。在负载均衡中,你必须有2台或更多的后端服务器,但在反向代理中,不需要多台服务器,即使一台后端服务器也可以。让我们更深入一点,如果我们有很多来自客户端的请求,负载均衡器会检查每个后端服务器的状态,平均分配请求,并更快地向客户端发送响应。有状态vs无状态应用程序好的,在我们开始使用Nginx之前,让我们先了解所有基础知识!有状态应用程序有状态应用程序存储一个额外的变量,该变量仅用于保存服务器中单个实例使用所需的信息。如图,一个后端服务器server1存储了一些信息,服务器server2不存储这些信息,因此,客户端(上图中的Bob)的交互可能会也可能不会得到想要的结果,因为它可能与服务器1或服务器2。在此示例中,server1允许Bob查看数据文件,但server2不允许。因此,虽然有状态应用程序避免了对数据库的多次API调用并且(响应)速度更快,但它可能会在不同的服务器上导致此(无法获得所需结果)问题。Statelessapplications无状态应用程序有更多的数据库API调用,但在客户端与不同的后端服务器交互时出现的问题更少。没听懂?简单的说,如果我从一个客户端通过web服务器向后端服务器server1发送一个请求,它会返回一个token给客户端,用于任何进一步的访问请求。客户端可以使用令牌并向Web服务器发送请求。此Web服务器将请求连同令牌一起发送到任何后端服务器,每个后端服务器都可以提供相同的期望结果。什么是Nginx?到目前为止,Nginx是我在整个博客中一直使用的网络服务器。老实说,Nginx就像一个中间人。这张图并不难理解,它是迄今为止所有概念的组合。这里我们有3个后端服务器在端口3001、3002和3003上运行,所有这些后端服务器都在访问在端口5432上运行的同一个数据库。当客户端向https://localhost(默认端口443)发起GET/employees请求时,Nginx会根据算法向任一后端服务器发送请求,从数据库中获取数据并将JSON数据返回给NginxWeb服务器,并发送给客户端。如果我们使用roundrobin之类的算法,让client2向https://localhost发送请求,那么Nginx服务器会先将请求传递到3000端口,然后将响应返回给client。对于另一个请求,Nginx会将请求传递到3002端口,依此类推。知识储备完毕!至此,你对Nginx是什么以及Nginx涉及的术语有了清晰的认识。是时候了解安装和配置技术了。是时候开始安装Nginx了。理解了以上概念,就可以开始Nginx实践了。那么,Nginx的安装过程对于任何系统来说都很简单。我是MacOSX用户,所以示例命令基于macOS、Ubuntu、Windows和其他Linux发行版,操作与示例类似。$brewinstallNginx只要按照上面的步骤,你的系统上就有了Nginx!是不是很神奇?运行Nginx如此简单,检查Nginx是否正在运行也如此简单。$nginx#OR$sudonginx执行上面的命令,然后打开浏览器输入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$vimnginx.conf上面命令会打开一个Nginx默认配置文件,实在不想直接使用默认配置。所以我通常的做法是复制这个配置文件,然后对主文件进行更改。这里也不例外。$cpngx.confcopy-nginx.conf$rmnginx.conf&&vimnginx.conf上面的命令将打开一个空文件,我们将向其中添加配置。①添加配置的基本设置。一定要加上events{},因为在Nginx架构中,它通常用来表示worker的数量。这里我们使用http告诉Nginx我们将在OSI模型的第7层进行操作。在这里,我们告诉Nginx监听端口5000并指向主文件夹中的静态文件。http{server{listen5000;root/path/to/nginx-demo/main/;}}events{}②接下来我们将为/content和/outsiderURL添加其他规则,其中outsider将指向除根目录。这里location/content的意思是不管我在叶目录下定义什么root,content子url都会添加到定义的rooturl的末尾。因此,当我将root指定为root/path/to/nginx-demo/时,这仅意味着我告诉Nginx在http://localhost:5000/path/to/nginx-demo/content/文件夹中显示静态内容的文件。http{server{listen5000;root/path/to/nginx-demo/main/;location/content{root/path/to/nginx-demo/;}location/outsider{root/path/temp-nginx/;}}}事件{}太棒了!现在Nginx不仅可以定义URL根路径,还可以设置规则,这样我们就可以阻止客户端访问某个文件。③接下来,我们在master服务器上写一个规则,防止任意.md文件被访问。在Nginx中我们可以使用正则表达式,所以我们将这样定义规则:location~.md{return403;}④最后,让我们学习proxy_pass命令来结束本章。现在我们已经了解了什么是代理和反向代理,这里我们首先定义另一个运行在端口8888上的后端服务器。现在,我们有2个运行在端口5000和8888上的后端服务器。我们要做的是,当客户端通过Nginx访问8888端口,将请求传递到5000端口,返回响应给客户端!server{listen8888;location/{proxy_passhttp://localhost:5000/;}location/new{proxy_passhttp://localhost:5000/outsider/;}}看,这就是所有的配置信息:http{server{listen5000;root/path/to/nginx-demo/main/;location/content{root/path/to/nginx-demo/;}location/outsider{root/path/temp-nginx/;}location~.md{return403;}}server{listen8888;location/{proxy_passhttp://localhost:5000/;}location/new{proxy_passhttp://localhost:5000/outsider/;}}}events{}使用sudonginx运行此配置。其他Nginx命令首次启动NginxWeb服务器:$nginx#OR$sudonginx重新加载正在运行的NginxWeb服务器:$nginx-sreload#OR$sudonginx-sreload停止正在运行的NginxWeb服务器:$nginx-sstop#OR$sudonginx-sstop查看系统中正在运行的Nginx进程:$ps-ef|grepNginx第4条命令很重要,如果前3条命令有问题,通常可以使用第4条命令找到所有正在运行的Nginx进程并Kill进程,然后重新启动它们。要杀死一个进程,您需要PID,然后使用以下命令将其杀死:$kill-9#OR$sudokill-9EnjoyCoding并探索Nginx的魔力!作者:AemieJariwala编辑:陶家龙来源:转载自公众号HelloGitHub(ID:GitHub520)