UC头条:Nginx基础知识
1、架构设计
1.1、设计概览
1.2、模块化结构
1.3、Web请求处理方式
1.4、事件驱动模型
2、常用功能
2.1、HTTP代理与反向代理
2.2、负载均衡
2.3、Web缓存
Niginx是一款开源的高性能HTTP服务器及反向代理服务器产品,此外,它还可以提供IMAP/POP3代理服务等功能。
1、架构设计
1.1、设计概览
主进程:MasterProcess,主要功能是与外界通信和对内部其它进程管理,包括进行配置文件解析、数据结构初始化、模块配置和注册、信号处理、网络监听生成、工作进程生成和管理工作。
工作进程:WorkerProcess,由主进程生成,生成数量可在配置文件中指定,正常情况下生存于主进程的整个生命周期,主要进行进程初始化、模块调用和请求处理等工作,是Nginx服务器提供服务的主体。
缓存机制:为提高请求与响应处理效率,通过缓存机制,将历史响应数据缓存到本地。在每次Nginx服务器启动后的一段时间内,会启动专门的进程对本地缓存的内容重建索引,保证对缓存文件的快速访问。
点击加载图片
1.2、模块化结构
Nignx服务器的开发完全遵循模块化设计思想。
命名习惯:一般ngx_开头,_module结尾,如ngx_core_module、ngx_events_module等。
模块分类:核心模块、标准HTTP模块、可选HTTP模块、邮件服务模块与第三方模块5大类。
核心模块:提供最基础最核心服务,主要包括两类功能,一类为主体功能,如进程管理、权限控制、错误日志记录、配置解析等;一类为响应请求事件必需的功能,包括事件驱动机制、正则表达式解析等。
标准HTTP模块:默认会被编译到Nginx中,除非在配置时添加-without-XXX参数声明不编译,如
模块 | 功能 |
---|---|
ngx_http_core | 配置端口、URI分析、服务器响应错误处理、别名控制等http核心事务 |
ngx_http_access_module | 基于IP地址的访问控制(允许/拒绝) |
ngx_http_auth_basic_module | 基于HTTP的身份认证 |
ngx_http_headers_filter_module | 设置HTTP响应头 |
ngx_http_upstream_module | 负载均衡支持 |
可选HTTP模块:默认不会被编译到Nginx中,须在配置时添加-with-XXX参数声明编译
模块 | 功能 |
---|---|
ngx_http_mp4_module | 支持将H.264/AAC编码的多媒体信息按照流文件传输(如.mp4/.m4v/.m4a格式) |
ngx_http_flv_module | 支持flash |
邮件服务模块:Nginx发行版中,快速编译默认不会编译相关模块,如
模块 | 功能 |
---|---|
ngx_mail_pop3_module | 支持POP3协议 |
ngx_mail_imap_module | 支持IMAP协议 |
ngx_mail_smtp_module | 支持SMTP协议 |
第三方模块:自定义扩展模块,如
模块 | 功能 |
---|---|
echo_nginx_module | 支持在Nginx配置文件中使用echo、sleep、time及exec等类Shell命令) |
rds_json_nginx_module | 支持Json数据的处理 |
lua_nginx_module | 支持lua脚本语言 |
1.3、Web请求处理方式
处理请求的三种方式:
1、多进程方式:服务器每收到一个请求,就会由主进程生成一个子进程与客户端进行交互处理,直到连接断开,该子进程就结束了。该方式设计和实现相对简单,但是操作系统生成子进程开销较大,当并发量较大时,服务器压力很大;(初期的Apache服务器就是该方式,为了应对高并发,采用了“预生成进程”机制)
2、多线程方式:服务器每收到一个请求,就会由主进程派生一个线程与客户端进行交互处理。该方式开销小于生成进程,但是需要处理多线程问题。
3、异步方式:
同步与异步:是描述通信模式的概念。同步指发送方发送请求后,需要等到接收方响应后才能发送下一个请求;异步则相反,发送方不必等待接收方的响应就可以发现下一个请求;
阻塞与非阻塞:是描述进程处理调用的方式。阻塞方式是调用结果返回之前,当前线程从运行状态被挂起,一直等到调用结果返回之后,才会进入就绪状态,获取CPU后继续执行;非阻塞方式则相反,如果调用结果无法立即返回,当前线程也不会挂起,而是立即返回执行下一个调用。
经常会使用“同步阻塞方式“与“异步非阻塞方式”。
Nginx服务器如何处理请求:
其为了应对高并发,使用的异步非阻塞方式对外提供服务。Nginx启动后,会产生一个主进程和多个工作进程(相当于预生成),每个工作进行使用异步非阻塞方式,可以处理多个客户端请求。
1.4、事件驱动模型
事件驱动模型:一般由事件收集器、事件发送器和事件处理器三部分组成。
点击加载图片
事件处理的3中方法:
1、发送器传递一个请求,目标对象创建一个新进程,调用处理器处理。这种方式编码实现相对简单,但是创建进程开销大,导致服务器性能较差;
2、发送器传递一个请求,目标对象创建一个新线程,调用处理器处理。这种方式性能更高,但是会面临多线程控制问题(同步、死锁),编码难度增大;
3、发送器传递一个请求,目标对象将其放入一个待处理的列表中,使用非阻塞I/O方式调用处理器处理。这种方式编码复杂度更高,但是效率更好。大多数网络服务器采用的这种方式,Nginx也一样。
Nginx事件驱动模型:采用的“事件驱动处理库“方式,也称“多路IO复用方法”,最常见的有select模型、poll模型与epoll模型,Nginx还支持rtsig模型、kqueue模型、dev/poll模型和eventport模型等。
2、常用功能
2.1、HTTP代理与反向代理
最主要功能之一
2.2、负载均衡
两种场景:一种是单一的重负载分摊到多个节点做并行处理,然后汇集每个节点的结果返回;一种是将并发流量分摊到多个节点,提供服务器处理性能。一般谈到的负载均衡都是指后者。
Nginx负载均衡策略:内置策略(轮询、加权轮询、IPhash)和扩展策略(urlhash、fair等)。轮询:即每个请求按顺序逐一分配到不同的后端节点即可;加权轮询:指定请求到后端节点的权重,一般用于后端节点性能不均衡场景;IPhash:将请问IP进行hash操作,分配到不同后端节点,之后对应IP请求会固定访问某个后端节点,解决用户session在不同节点无法共享的问题;
2.3、Web缓存
缓存机制对应提高web服务器负载能力、提高用户请求响应速度至关重要,目前Nginx在这方面能力以及堪比Squid。它自身可以通过ProxyStore和ProxyCache实现,也可以与Squid、nacache联合使用。