一、什么是nginx
nginx是一款免费的、开源的、高性能的HTTP服务器和反向代理服务器,在我们工作中主要用在这三个方向:
- 静态服务器
- 反向代理
- 负载均衡
当然还有一些其它的功能(如灰度分流…)这篇就不细究了,会在后面的章节谈及。
nginx可以承受每秒1万次的请求量,而它之所以能接受这么多的请求是因为它的架构模式决定的。它的设计不像其它服务器那样使用线程处理请求,而是利用的异步事件驱动,底层利用了Linux系统的epoll事件处理模型。
二、nginx有哪些特点
- 配置简单:只需要通过配置来完成自己定制的功能,复杂的功能还可以支持结合lua脚本编写
- 跨平台:nginx既有Linux版本,也有Windows版本的支持
- 非阻塞:可以支持2~3万的并发连接,非阻塞的i/o通信
- 多进程:多个工作进程的支持充分利用cpu的资源,减少并发带来的问题
- 异步处理:先将用户请求全部接受,再一次性发送到后端web服务器,减小服务器压力
- 高可用:能快速发现故障机器,并过滤掉,也提供连接超时重试机制、稳定性高
- 内存消耗小、成本低廉(相比于F5)、节省带宽
…
三、nginx的整体架构
1、模块化设计
标准的高内聚低耦合,分为核心模块和功能模块
核心模块:维持一个运行循环(run-loop,有点像netty里的event loop),执行网络请求处理的不同阶段的模块功能,存储读写、内容传输、网络读写、外出过滤,以及将请求转发上游服务器。还提供错误日志记录、配置文件解析、事件驱动机制、进程管理等
功能模块:HTTP模块提供HTTP协议解析相关功能;邮件服务模块支持POP3、IMAP、SMTP协议的支持;还有些其它的模块比如对json支持、对lua的支持等
2、代理设计
无论是对于HTTP还是memcache、redis等网络请求或响应都采用了代理机制
3、事件驱动模型
基于异步非阻塞的事件驱动模型,是nginx高并发、高性能的关键因素
4、多进程模型
nginx启动的时候,会生成两种类型的进程,一个主进程和多个工作进程,多个工作进程可以通过配置文件来指定,一般会设成当前机器的cpu核数的两倍(io密集型)。主进程主要负责进程调度、加载配置、启动工作进程;而工作进程是用来处理实际的网络请求及响应,每一个worker进程都可以同时处理数以千计的网络请求
四、nginx事件驱动模型
工作进程在调用io后,就去处理其它的请求,当io调用返回后会触发事件并通知该工作进程,从而实现异步调用。nginx事件驱动模型由三个部分组成:
- 事件发送器:负责将io事件发送到事件处理器
- 事件收集器:负责收集工作进程的各种io请求
- 事件处理器:负责各种事件的响应工作
由事件收集器收集工作进程的请求,事件发送器将每个请求放入一个待处理的事件列表,事件处理器使用非阻塞的调用方式处理请求。常见处理方式有这三种:select模型、poll模型、epoll模型。
五、总结
上面我们简单了解了nginx是干什么的和它的架构模型,下一篇我会介绍nginx的实际应用部分。