Nginx 是一个高性能,支持高并发的,轻量级的 Web Sever。 Nginx 采用模块化的架构, 可以通过开发 Nginx 的扩展模块 , 将 Nginx 打造成一个全能的 Web Sever, 即将一些功能在前端 Nginx 反向代理层解决,比如登录校验、js 合并等。
1. Nginx 进程模型
Nginx 采用多进程模型,单 Master — 多 Worker,由 Master 处理外部信号、配置文件的读取及 Worker 的初始化,Worker 进程采用 单线程、非阻塞的事件模型(Event Loop,事件循环)来实现端口的监听及客户端请求的处理和响应,同时Worker还要处理来自 Master 的信号。
表面上看,当 Nginx 处理一个来自客户端的请求时,先根据请求头的host、ip和 port 来确定由哪个 server 处理,确定了 server 之后,再 根据请求的 uri 找到对应的 location,这个请求就由这个location 处理。实际 Nginx 将一个请求的处理划分为若干个不同阶段 (phase),这些阶段按照前后顺序依次执行。1
2
3
4
5
6
7
8
9
10
11
NGX_HTTP_POST_READ_PHASE, //0读取请求phase
NGX_HTTP_SERVER_REWRITE_PHASE,//1这个阶段主要是处理全局的(server block)的rewrite
NGX_HTTP_FIND_CONFIG_PHASE, //2这个阶段主要是通过uri来查找对应的location,然后根据loc_conf设置r的相应变量
NGX_HTTP_REWRITE_PHASE, //3这个主要处理location的rewrite
NGX_HTTP_POST_REWRITE_PHASE, //4postrewrite,这个主要是进行一些校验以及收尾工作,以便于交给后面的模块。
NGX_HTTP_PREACCESS_PHASE, //5比如流控这种类型的access就放在这个phase,也就是说它主要是进行一些比较粗粒度的access。
NGX_HTTP_ACCESS_PHASE, //6这个比如存取控制,权限验证就放在这个phase,一般来说处理动作是交给下面的模块做的.这个主要是做一些细粒度的access
NGX_HTTP_POST_ACCESS_PHASE, //7一般来说当上面的access模块得到access_code之后就会由这个模块根据access_code来进行操作
NGX_HTTP_TRY_FILES_PHASE, //8try_file模块,就是对应配置文件中的try_files指令,可接收多个路径作为参数,当前一个路径的资源无法找到,则自动查找下一个路径
NGX_HTTP_CONTENT_PHASE, //9内容处理模块
NGX_HTTP_LOG_PHASE //10log 模块
2. ngx_lua
waiting for update……