首先,我们来了解一下Nginx是什么。Nginx(“enginex”)是一个高性能的HTTP和反向代理服务器。它的特点是内存少,并发性强。事实上,nginx的并发性确实优于其他同类型的web服务器。在中国大陆使用nginx网站的用户包括:百度、京东、新浪、网易、腾讯、淘宝等。首先,Nginx不是web服务器。其主要功能包括三个“反向代理”、“负载均衡”、“动静分离”。接下来主要讲解这三个函数。说到服务器,有些朋友肯定会想到Tomcat,那么Nginx和Tomcat是什么关系呢?Tomcat服务器不是web服务器,Nginx是代理服务器,两者的功能不同,而且Nginx可以作为静态页面的web服务器,还支持CGI协议perl、php等动态语言.但是java不支持。Java程序只有配合tomcat才能完成。所以Nginx和Tomcat算是一种合作关系。下面我们主要说说Nginx的三大功能:1.反向代理(也就是代理服务器)说到反向代理,我们先来看看什么是正向代理。正向代理是代理客户端。以图片为例。我们想访问谷歌。因为有防火墙,我们不能访问,但是我们可以通过代理服务器访问。这个方法是一个正向代理。那么什么是反向代理呢?如果我们有一个并发访问量特别大的电商网站,只用一台服务器来处理请求是远远不够的,所以我们需要用Nginx来代理我们的服务器,把请求发送给几个服务器进行处理。这就是所谓的反向代理。2.负载均衡我们的Nginx会向几台服务器发送请求,那么Nginx对应几台服务器,如何将请求分发到这些服务器,这就是负载均衡,为了保证每台服务器正常运行,我们要做负载平衡。负载均衡有多种策略。Nginx选择roundrobin,即依次分配,分配给服务器1,分配给服务器2,分配给服务器3,分配给服务器1,依次类推。三动静分离大家都知道我们在写程序的时候需要尽可能的解耦。假设我们程序中的静态资源域和代码是耦合在一起的,我们每次换一张图片或者换一个样式都需要换代码。这时候我们的Nginx就派上用场了,Nginx可以将静态资源和动态资源分离。Nginx可以将我们的静态资源存储在一个文件系统中。当我们需要静态资源时,只需要填写静态资源的url即可。当我们更改静态资源时,只需要更改文件系统中的静态资源即可。需要更改我们的代码。说完Nginx的三大功能,再说说Nginx的底层原理。Nginx采用master-workers机制:首先,对于每个worker进程,一个独立的进程不需要加锁,这样就省去了加锁带来的开销,同时在编程和查找的时候也方便很多问题。其次,可以使用独立的进程,这样它们就不会相互影响。一个进程退出后,其他进程还在工作,服务不会中断。master进程会快速启动一个新的worker进程。当然,如果worker进程异常退出,那肯定是程序有bug。异常退出会导致当前worker上所有请求失败,但不会影响所有请求,降低了风险。当请求来了,它会通知我们的master,master会通知worker,所有的worker都会去竞争这个请求,所以Nginx是非常高效的。那么我们需要设置多少个worker呢?Nginx使用了类似redis的io多路复用机制。每个worker都是一个独立的进程,但是每个进程中只有一个主线程,采用异步非阻塞的方式进行处理。请求,甚至数以千计的请求。每个工作线程都可以最大限度地发挥CPU的性能。因此,worker的数量与服务器的CPU数量相等最为合适。设置少了会浪费CPU,设置多了会造成CPU上下文频繁切换造成的丢失。
