我们先来了解一下nginx是什么。
Nginx(“engine x”)是一个高性能的Http和反向代理服务器,特点是内存少,并发性强。其实nginx的并发性在同类型的web服务器中确实是比较好的。nginx网站在中国大陆的用户有百度、JD.COM、新浪、网易、腾讯、淘宝等。
首先,nginx不是web服务器。其主要功能有三个“反向代理”、“负载均衡”、“动静分离”。接下来,我们将主要关注这三个功能。说到服务器,肯定有朋友能想到tomcat,那么nginx和tomcat是什么关系呢?Tomcat服务器不是web服务器,nginx是代理服务器,功能不同。除此之外,nginx还可以作为静态页面的web服务器,它还支持cgi同意的动态语言,比如perl和php。但是不支持java。Java程序只有和tomcat合作才能完成。所以nginx和tomcat是合作关系。
这里主要讲nginx的三个功能:
一、反向代理(即代理服务器)
说到反向代理,我们先来看看什么是正向代理。
转发代理是代理客户端。以图为例。我们想访问谷歌。因为防火墙的存在,我们无法访问,但是可以通过代理服务器访问。这种方式是正向代理。
什么是反向代理?
如果我们有一个电子商务网站,访问并发量特别大,只用一个服务器处理请求是远远不够的,所以我们要用nginx来充当我们的服务器,把请求发送到几个服务器进行处理。这就是所谓的反向代理。
第二,负载平衡
我们的nginx会向几个服务器发送请求,那么nginx如何向这些服务器分配请求呢?有必要提一下负载均衡。为了保证每台服务器的正常运行,我们必须做负载均衡。负载平衡有许多策略。nginx选择轮询,即依次分配给服务器1、服务器2、服务器3、服务器1,以此类推。
第三,动静分离
众所周知,我们应该尽可能地将编程解耦。让我们假设静态资源域和代码在我们的程序中是耦合在一起的。我们每换一张图片,一个风格都需要换代码。这时候我们的nginx就派上用场了,nginx可以把静态资源和动态资源分开。
Nginx可以在文件系统中存储我们的静态资源。当我们需要静态资源时,我们只需要填写静态资源的url。当我们改变静态资源时,我们只需要改变文件系统中的静态资源,而不需要改变我们的代码。
说完了nginx的三大功能,接下来我们来说说nginx的底层原理。
Nginx采用主工人机制:
首先,对于每一个工作进程,独立的进程都不需要加锁,这样就省去了加锁带来的开销。同时也会方便编程和查找问题。其次,可以使用独立的进程,这样就不会互相影响。一个进程退出后,其他进程还在工作,服务不会中断。主进程将很快启动一个新的工作进程。当然,工作进程异常退出肯定是程序的bug。异常退出会导致当前工作线程上的所有请求失败,但不会影响所有请求,因此风险降低。
当请求来的时候,它会通知我们的主,主再通知工人,所有的工人都会竞争这个请求,所以nginx的效率很高。那么我们要设置多少工人呢?nginx和redis一样,采用io复用机制。每个worker都是一个独立的进程,但是每个进程只有一个主线程,请求以异步无阻塞的方式处理,甚至是上千个请求。每个工作线程都可以最大限度地发挥cpu的性能。因此,工作线程的数量等于服务器中cpu的数量是最合适的。少了会浪费cpu,多了会造成cpu频繁上下文切换带来的损失。
Copyright © 2019-2025 but6.com. All Rights Reserved. 八特科技 版权所有 《中华人民共和国增值电信业务经营许可证》B1-20211227(代理商) 深圳市八特科技有限公司 粤ICP备2022103497号-1