一、定义
轻量级的Web服务器
高性能的HTTP和反向代理服务器
稳定高效的负载均衡服务器
采用C编写
二、特点
Web服务:处理静态和索引文件、自动索引的效率非常高
代理服务:可实现无缓存的反向代理加速,提高客户端运行速度
负载均衡服务:既可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡
轻量级:占有内存少,成本低,节省带宽,安装、配置简单
高质量:代码规范,Bug少,上手简单,模块可扩展
高并发:非阻塞,采用内核Poll模型,支持更多并发连接,最大支持5万并发,实际生产能跑2~3万并发连接数
高稳定性:采取分阶段资源分配技术,CPU与内存占用率低,Nginx保持1万个没有活动的连接,而这些连接只占用2.5MB内存,类似DOS这样的攻击对Nginx来说基本上是没有任何作用的,Nginx代理和后端Web服务器间无需长连接
高可用性:支持热部署,启动速度快,不间断运行,可同步升级版本或配置
跨平台:可以在大多数 UnixLinux OS 上编译运行,并有 Windows 移植版
异步处理:异步接收用户请求,先将用户请求全部接收下来,再一次性发送到后端Web服务器,极大减轻后端Web服务器的压力,发送响应报文边接收来自后端Web服务器的数据,边发送给客户端
三、对比Apache
相同点:
都是HTTP服务器
都采用模块化结构设计
都支持通用语言接口,如PHP、Perl、Python等
支持正反向代理、虚拟主机、URL重写、压缩传输、SSL加密传输
不同点:
Apache处理速度很慢,占用内存大
Apache所有模块支持动静态编译,Nginx模块都是静态编译
空间使用上:Nginx安装包仅几百K
四、功能
一、代理
较少正向代理,最常用反向代理,由HTTP模块ngx_http_proxy_model支持,一般单独配置一个server块。
指令:
Proxy_pass:配置被代理服务器地址,主机名称/IP地址+端口号
upstream:配置一组后端服务器
Proxy-buffer:启用后,Nginx会将被代理的服务器的响应数据异步地传递给客户端;关闭后, Nginx只要接收到响应数据就会同步地传递给客户端,不会读取完整响应数据
二、负载均衡
负载均衡技术主要实现和作用于第四层/第七层,Nginx一般是第七层负载均衡。
静态负载均衡算法:一般轮询、基于比率加权轮询、基于优先级的加权轮询
动态负载均衡算法:基于任务量的最少连接优先、基于性能的最快响应优先、动态性能分配
Nginx:采用基于优先级的加权轮询算法。
三、缓存
Nginx缓存驱动技术有两种:
404驱动:Nginx处理客户端请求时资源不存在,则会产生404错误,Nginx通过捕获该错误进一步转向后端服务器请求数据,最后将后端服务器响应数据传回给客户端,同时在本地缓存。
资源不存在驱动:通过location块中的if条件直接判断请求资源是否存在,,不存在则直接驱动Nginx与后端服务器通信更新Web缓存。
Nginx实现的两种缓存机制:
Proxy Cache:Nginx自身实现,功能完整,高性能。Nginx服务启动后,会生成专门的进程对磁盘上的缓存文件进行扫描,在内存中建立缓存索引,提高访问效率,并且还会生成专门的管理进程对磁盘上的缓存文件进行过期判定/更新等方面的管理。
与Proxy Buffer不同:Proxy Buffer实现了后端服务器响应数据的异步传输,而Proxy Cahce则实现了Nginx对客户端数据请求的快速响应。Nginx在接收到后端服务器响应数据后,一方面通过Proxy Buffer机制将数据传递给客户端,另一方面根据Proxy Cahce的配置将这些数据缓存到本地,当客户端下次访问相同数据时,Nginx直接从本地检索数据返回给客户端,减少与后端服务器的交互时间。
Proxy Store:与Proxy Cache的区别是,它对来自后端服务器的响应数据,尤其是静态数据只进行简单的缓存,且只能缓存200状态码下的响应数据,不支持缓存过期更新,内存索引建立等功能,但支持设置用户/用户组对缓存的访问权限。
Memcached
Memcached是一套高性能的基于分布式环境的缓存系统,用于动态Web应用可减轻后台数据服务器的负载,提高客户端响应速度.Nginx的标准模块ngx_http_memcached_module提供了对Memcached的支持。
Nginx首先请求Memcached,如果缓存没有命中,Nginx则proxy_pass给后端服务器响应该请求,但此时也需要后端服务器在将数据响应给客户端之后,,将响应内容手动写入Memcached,以供下次直接从Memcached检索数据。
分布式Memcached
为了充分发挥Memcached分布式优势,提升服务器响应速度,我们使用Nginx的一致性Hash模块,将request分布到不同的Memcached Server中。 同时,对于访问不命中的情况,需要后端服务器在对客户端做出响应时将响应数据按照一致性Hash规则写入Memcached。
条件:
安装Nginx一致性Hash模块
配置Memcached一致性Hash规则
五、模块化
Nginx架构的基础:高度模块化。
在Nginx中,除了少量的核心代码,其他一切皆为模块,特点:
1.高度抽象的模块接口
2.灵活性
3.配置模块的设计使Nginx提供了高可配置性、高可扩展性、高可定制性、高可伸缩性。
4.核心模块接口简单化
5.多层次、多类别的模块设计
Nginx五大类型模块:核心模块、配置模块、事件模块、HTTP模块、mail模块
Nginx模块直接被编译仅Nginx,因此属于静态编译方式。启动Nginx后,Nginx的模块被自动加载。
六、进程管理
Nginx由一个master进程和多个worker进程组成
master进程:不处理网络事件和业务执行,只通过管理worker等子进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。通过fork系统调用子进程来实现和子进程的通信。
worker进程:处理master进程fork过来的请求,通过处理信号来实现和master通信。
优点:
1.利用多核系统的并发处理能力
2.负载均衡
3.管理进程负责监控工作进程的状态
七、工作原理
Nginx会按需同时运行多个进程:一个主进程和几个工作进程,所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。
主进程以root用户身份运行,而worker、cache loader和cache manager均应以非特权用户身份运行。
Nginx具有“强悍”的高并发高负载能力,因此一般会作为前端的服务器直接向客户端提供静态文件服务。于是,Nginx通常会被配置为既是静态Web服务器也是反向代理服务器,不适合Nginx处理的请求就会直接转发到上游服务器中处理。
Nginx减轻了上游服务器的并发压力,延长了一个请求的处理时间,并增加了用于缓存请求内容的内存和磁盘空间。