Nginx 的是一种轻量级高性能的 HTTP 和反向代理服务器,因为它的稳定性,丰富的模块 库,灵活的配置和低系统资源的消耗而闻名。
(1)作为服务器
相比的 Apache,Nginx 的使用更少的资源,支持更多的并发链接,能够支持高达 500,00 个 并发链接数的响应。
(2)作为负载均衡服务器
它既可以在内部直接支持的 Rails 和 PHP,也可支持作为 HTTP 代理服务器对外进行服务。 Nginx 用 C 编写,不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
(3)作为邮件代理服务器
最早开发这个产品的目的之一就是为了作为邮件代理服务器,其占有内存少,并发能力 强使 得作为邮件代理服务器有非常优秀的表现。
1. 模块
Nginx 的从结构上分为核心模块、基础模块和第三方模块。
① 核心模块:HTTP 模块、EVENT 模块、MAIL 模块。
② 基础模块:HTTP Access 模块、HTTP FastCGI 模块、HTTP 代理模块、HTTP 重写模块。
③ 第三方模块:HTTP 上游哈希模块和 HTTP 访问密钥模块。
Nginx 的启动后台包含 2 类进程:
① 一个主进程:管理工作者进程,包含接收外界信号,向 Worker 进程发送信号,监控 Worker 进程运行状态,当任意一个 Worker 进程出现错误从而导致 Coredump 时,Master 进程 会立刻启动新的 Worker 进程继续提供服务。
② 多个 Worker 进程:基本的网络事件在 Worker 进程中执行,Worker 进程是相互独立的,
一个请求只能在一个 Worker 进程中执行,Worker 进程数是可设置的(一般设置与 CPU 核数相等,原因与 Nginx 的的进程模型以及事件模型相关)。
2.进程模型
(1)操作 Nginx
当操作 Nginx 时,只需要与主进程通讯即可,Master 进程会接收外界的信息,根据信息 进行不同的操作。比如重新加载配置:Master 接受到 kill -HUP pid 信号后,先重新加载配置, 开启新的 Worker 进程接收新的请求。而旧的 Worker 进程接收 Master 信息,不再接收新的请 求,继续处理完当前进程未处理完的请求。
(2)Worker 进程处理请求
首先每个 Worker 进程都是 Master 进程中 Fork 而来的。在 Master 进程中先建立好要监听 的插座(listenfd)。这句话的意思是 Master 进程会监听来自客户端的请求,然后再 Fork 多个 Worker 进程,所有的 Worker 进程的 listenfd 在新的请求进来都变得可读,为保证只有一个 Worker 进程处理请求,所有的 Worker 进程在注册 listenfd 读事件前抢夺 Accept_mutex,抢到 Accept_mutex 的那个进程注册 listenfd 读事件,然后在读事件里调用 Accept 接受,接着开始读 取请求、解析请求、处理请求返回数据给客户端,最后断开连接。
(3)Nginx 的处理事件
Nginx 采用异步非阻塞的方式处理请求,具体来说,系统调用就像 Select、Poll、Epoll、 Kqueue 这样的系统调用,它们提供一种机制,让用户可以同时监控多个事件。虽然调用它们 是阻塞的,但可以设置超时时间,在超时时间内,如果有事件准备好就返回