目录

Nginx简介

Nginx配置

1. 全局块

2. events块

3. http块

4. server块

5. location块

Nginx架构

1. Web请求处理机制

2. 事件处理机制

3. 设计架构

master进程

woker进程

进程启动

进程交互



参考文档 常见服务器产品


Nginx简介

Apache\Microsoft IIS\Tomcat\Lighttpd\Nginx等。

Nginx服务器功能丰富,既可以作为HTTP服务器,也可以作为代理&反向代理或者邮件服务器;能够快速响应静态页面;支持fastcgi、ssl、virtual host、url rewrite、http basic auth、Gzip等大量功能;并且支持第三方功能模块扩展。

正向代理其实就是用户主动使用代理,这个代理对用户来说是透明的,对用户来说,这个代理属于正向。反向代理是与正向代理相反,这个代理是用户不知道的,都是在服务器端自己做的处理,这个代理对用户来说,是反向的。

客户端代理->正向代理(隐藏用户)

服务端代理->反向代理(隐藏服务)

Nginx配置

worker_processes  1;                                                       // 全局
events {                                                                            // events
     worker_connections  1024;
 } http {                                                                                  // http
     include       mime.types;                                                // http全局
     default_type  application/octet-stream;
     sendfile        on;    keepalive_timeout  65;
    server {                                                                           // server
         listen       80;                                                               // server全局
         server_name test1.aa.com;        access_log  "/home/work/orp/log/webserver/access_log_wap"  main;  // format 自定义服务日志的格式字符串 off为取消访问日志 log_format main string 定义服务日志格式
        location / {                                                                   // location
             root   html;
             index  index.html index.htm;
         }        error_page   500 502 503 504  /50x.html;
         location = /50x.html {
             root   html;
         }    }
   server {                                                                           // server
         listen       80;                                                               // server全局
         server_name test2.aa.com;        location / {                                                                   // location
             root   html;
             index  index.html index.htm;
         }        error_page   500 502 503 504  /50x.html;
         location = /50x.html {
             root   html;
         }    }
}
1. 全局块
主要是设置一些影响nginx服务的整体运行的指令,通常配置nginx服务器的用户(组)、允许生成的work process数目、nginx进程PID存放路径,日志存放路径和类型以及配置文件的引入。
worker_processes  1;   // nginx进程最多可以产生的worker process数目
user  nobody;               // 配置运行nginx的用户 nobody表示所有用户可以启动
error_log  /home/work/log/error_log  notice;       // errorlog存放路径
pid        /home/work/var/nginx.pid;                      // 配置nginx进程pid存放路径
include file;                                                          // file是要引入的配置文件,它支持相对路径。注:新引用进来的文件要求运行nginx进程的用户对其具有写权限,并且符合nginx配置文件的相关语法和结构

2. events块

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等。

events {
     use epoll;                                  // 事件驱动模型的选择 method包括select/poll/kqueue/epoll/rtsig/eventport
     worker_connections  8192;      // 配置单个worker process的最大链接数目,默认512
 }3. http块
http块是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
http 块也可以包括http全局块、server 块。
    include       mime.types;                                                // 引用mime.types文件包括浏览器可以识别的mime类型
     default_type  application/octet-stream;                         // 用于处理前端请求的mime类型
     sendfile        on;    keepalive_timeout  65;

4. server块

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。后面会详细介绍虚拟主机的概念。

每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

      

listen       80;                                                               // 端口监听
         server_name test1.aa.com;                                        // 基于名称的虚拟主机配置        access_log  "/home/work/orp/log/webserver/access_log_wap"  main;  // format 自定义服务日志的格式字符串 off为取消访问日志 log_format main string 定义服务日志格式
        location / {                                                                   // location
             root   html;
             index  index.html index.htm;
         }5. location块
一个 server 块可以配置多个 location 块。这块的主要作用是基于 Nginx  服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
        location / {                                                                   // location
             root   html;                                                               // 配置请求的根目录
             index  index.html index.htm;                                   // 设置默认首页         }

location的语法结构:location [ = | ~ ~* | ^~] uri (...)

uri变量是带匹配的请求字符串,可以是包含正则表达式和不包含正则表达式。据此我们可以划分为标准URI和正则URI

  • “=”: 用于标准URI前,要求请求字符串与uri严格匹配。如果已经匹配成功,就停止向下搜索并且立即处理此请求。
  • “~”:用于表示URI包含正则表达式,并且区分大小写。
  • “~*”:用于表示URI包含正则表达式,并且不区分大小写。
  • “^~”:用于标准URI前,要求Nginx找到标识URI和请求字符串匹配度最高的location后,立即处理此location请求,而不继续使用location块中的正则uri和请求字符串匹配。

配置请求的根目录可以在location中通过指明root配置,还可以通过alias指令改变location接收到的URI请求路径。

Nginx架构

1. Web请求处理机制

一般情况完成并行处理请求的工作有三种方式可以选择:多进程、多线程和异步。关于异步,需要再次描述一下同步、异步

阻塞和非阻塞的概念。

同步和异步是描述通信模式的概念。同步机制是发送方发送请求后,需要等待接收到接收方发回的响应后才接着发送下一个请求;异步极致是和同步相反,在异步机制中,发送方发送一个请求后,不等待接收方响应这个请求,就继续发送下个请求。

阻塞和非阻塞时用来描述进程处理调用的方式,在网络通信中主要是指socket的阻塞和非阻塞,而socket的实质也就是IO操作。socket阻塞调用的方式时,调用结果返回之前,当前线程从运行状态刮起,一直等到结果返回,才进入就绪状态,获取CPU继续执行;非阻塞方式正好相反,在非阻塞方式中如果调用结果不能够马上返回,当前线程不会改起,合适立即返回进行下一个调用。

nginx服务器显著优势时能够同时处理大量并发请求。它是结合多进程机制和异步机制提供服务,异步机制是异步非阻塞的方式。nginx启动后开启多个worker process勇于接收和处理客户端请求。

2. 事件处理机制

事件驱动模型是Nginx服务器保障完整功能和良好性能的重要机制之一。事件驱动处理库,又被称为多路IO复用方法。事件驱动概念:在持续的事物管理过程中,由当前时间节点上出现的事件引起的调用可用资源执行相关任务,解决问题,防止事物堆积的一种策略。 一般由:事件收集器、事件发送器和事件处理器组成。

nginx 代码解读 nginx 详解_Nginx

实时信号事件驱动模型:rtsig

基于平台的事件驱动模型有:kqueue、dev/poll、eventport

3. 设计架构

Nginx 服务器使用 master/worker 多进程模式。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处理网络请求与响应。

master进程

主要用来管理worker进程,具体包括如下4个主要功能:

  • 接收来自外界的信号。
  • 向各worker进程发送信号。
  • 监控woker进程的运行状态。
  • 当woker进程退出后(异常情况下),会自动重新启动新的woker进程。

nginx 代码解读 nginx 详解_服务器_02

woker进程

主要用来处理基本的网络事件

  • 多个worker进程之间是对等且相互独立的,他们同等竞争来自客户端的请求。
  • 一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。
  • worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。同时,nginx为了更好的利用多核特性,具有cpu绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来cache的失效。

nginx 代码解读 nginx 详解_Nginx_03

进程启动

nginx 代码解读 nginx 详解_html_04

 进程交互

master-worker:主进程生成工作进程后,将新生成的工作进程加入到工作进程表中,并建立一个单向管道且传递给工作进程。

worker-worker:由于工作进程是相互隔离的,因此一个进程要知道另一个进程的信息,只能通过工作进程,为了达到工作进程交互的目的,主进程在生成工作进程后,在工作进程表中遍历,将该新进程的ID以及针对该进程创建的管道句柄传递给工作表中的其他工作进程,为工作进程之间的交互做准备。每个工作进程捕获通道中的可读事件,根据指令采取响应措施。

例:#向Nginx主进程发送USR1信号,重新打开日志文件  kill -USR1 `cat ${PID}`

nginx 代码解读 nginx 详解_html_05