nginx详解

引用地址:https://blog.csdn.net/tjiyu/article/details/53027619

 

1、nginx应用


       nginx (engine x)是一个可以作为HTTP WEB服务器、反向代理服务器、邮件代理服务器和一个通用的TCP / UDP代理服务器(1.9.0版本后)的多功能架构组件,同时也可以提供一定的缓存服务功能。

       nginx应用比较多的场景是WEB服务器和反向代理服务器,这两个场景的相关配置后面的文章我们会分别操作配置,这里先来认识下:

1、WEB服务器:这是应用比较多的场景,配置虚拟主机提供HTTP WEB服务。可以先通过动态/静态内容分离,而后为静态内容(html/css/js/图片等)提供HTTP访问功能;而动态内容可以整合代理模块,代理给上游服务器,来支持对外部程序的直接调用或者解析,如FastCGI支持PHP。

2、反向代理服务器:这是应用非常多的场景,为后端服务器代理。接收客户端请求,根据负载均衡策略转发给后端多个上游服务器处理;然后再等待后端服务器返回请求响应,接收到后再返回给请求的客户端。

2、nginx基本架构

  1. 一个master进程生成多个worker子进程(每个进程只有一个线程),一个worker响应多个用户请求;
  2. 非阻塞、IO复用、事件驱动:select,poll, epoll, kqueue,/dev/poll;
  3. 支持sendfile,sendfile64;
  4. 支持文件AIO(异步I/O);
  5. 支持mmap;
  6. 灵活的文件配置;
  7. 占用内存小:10,000个非活动HTTP保持连接占用大约2.5M内存。 

3、nginx功能特性

 
3-1、基本功能

  • 实现与服务静态文件(静态资源的web服务器),能缓存打开的文件描述符; 
  • 反向代理服务器,缓存、负载均衡、健康状态检测;
  • 支持FastCGI;
  • 模块化机制,非DSO机制,支持多种过滤器gzip,SSI和图像的模块完成图形大小调整等;
  • 支持SSL;

3-2、扩展功能

  • 基于名称和IP做虚拟主机;
  • 支持keeplive;
  • 支持平滑配置更新或程序版本升级;
  • 定制访问日志,支持使用日志缓存以提高性能;
  • 支持URL rewrite;
  • 支持路径别名;
  • 支持基于IP及用户的认证;
  • 支持速率限制,并发数限制等;

4、nginx并发模型

       如前图,一个master进程生成多个worker子进程(每个进程只有一个线程),一个worker响应多个用户请求。如果单进程启动:仅有一个进程,既充当master进程的角色,也充当worker进程的角色。

 

4-1、master进程

      充当整个进程组与用户的交互接口(接收来自外界的信号,向各worker进程发送信号),同时监控worker进程的运行状态。

      它不需要处理网络事件,不负责业务的执行,只会通过管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。

4-2、worker进程

      主要任务是处理基本的网络事件,完成具体的任务逻辑。多个worker进程之间是对等的,互相独立的。 

      worker进程主要关注点是与客户端或后端服务器(此时nginx作为中间代理)之间的数据可读/可写等I/O交互事件,所以工作进程的阻塞点是在像select()、epoll_wait()等这样的I/O多路复用函数调用处,以等待发生数据可读/写事件。当然也可能被新收到的进程信号中断。

      worker进程个数:

     如果负载以CPU密集型应用为主,一般会设置与机器cpu核数一致或少一个(用来处理用户等其他任务);

     如果负载以IO密集型为主,如响应大量内容给客户端,则worker数应该为CPU个数的1.5或2倍。  

     因为更多的worker数,只会导致进程来竞争cpu资源了,从而带来不必要的上下文切换。而且,nginx为了更好的利用多核特性,具有cpu绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来cache的失效。

     更具体的可以根据公式:Nthread = Ncpu*Ucpu*(1+W/C),Ncpu是cpu的个数,Ucpu是cpu的使用率,W为等待时间,C为计算时间。这时需要通过监控工具来获取相应数据来计算。

     最后,再以监控工具数据为准进行微调。

4-3、并发处理

  • A、在master进程里面,先创建socket,并bind、listen在80端口(所以master进程需要root权限); 
  • B、然后再fork出多个worker进程,这样每个worker进程都可以去accept这个socket(会产生惊群问题), 或者使用锁机制,让抢到锁的一个worker进程去accept这个socket,注意这里一般使用select/poll/epoll机制来解决accept阻塞问题;
  • C、当一个新连接进来后,而只有抢到锁的一个进程可以accept这个连接进行处理(也是放入epoll中);
  • D、抢到锁的worker进程accept到新连接后,会立即释放锁;然后所有worker进程再次参与抢锁,这样就回到了第二步,进行循环处理并发连接;

4-4、惊群问题

  • A、生产原因:像上面第二步,多个worker进程等待同一个socket的连接事件,当这个事件发生时,这些进程被同时唤醒,就是惊群。
  • 注意,在linux2.6内核上,accept系统调用已经不存在惊群,但用epoll机制来解决accept阻塞问题,epoll_wait会有惊群问题(新增 EPOLLEXCLUSIVE 选项解决了)。
  • B、导致后果:许多worker进程被内核重新调度唤醒,只有一个进程可以accept这个连接进行处理,其他余者皆失败,导致性能浪费。
  • C、nginx解决方案:使用锁机制,让抢到锁的一个worker进程去accept(epoll_wait)这个socket;如果操作系统支持原子整型,才会使用共享内存实现原子上锁,否则使用文件上锁。

5、Nginx配置说明

5-1、配置文件区域说明

       nginx主要配置文件nginx.conf,里面主要包括以下几个配置区域,如下表:

  • main块: 配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  • events块: 配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  • http块:  可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  • upstream块: 配置HTTP负载均衡器分配流量到几个应用程序服务器。
  • server块:  配置虚拟主机的相关参数,一个http中可以有多个server。
  • location块  :配置请求的路由,以及允许根据用户请求的URI来匹配指定的各location以进行访问配置;匹配到时,将被location块中的配置所处理。

       nginx文件结构如下:

        ... #main全局块 

        events { #events块        ...        }

        http #http块        {       

          ... #http全局块

        upstream … # upstream负载均衡块        {            …        }

        server #server块              ... #server全局块

        location [PATTERN] #location块        {        ...        }

        location [PATTERN]        {        ...        }

        }

        server        {        ...        }

        ... #http全局块

        }


5-2、Nginx核心功能配置

       nginx核心功能配置主要是main和events的顶层全局配置,都是配置nginx核心模块(ngx_core_module),管理服务器级别的行为。下表包含是大部分常用的配置选项,更多配置请参考官方文档: http://nginx.org/en/docs/ngx_core_module.html 

见参考页

5-3、Nginx HTTP核心配置

       http功能核心配置主要是http块、server块和location块的配置,包括HTTP核心模块(ngx_http_core_module)和一些扩展模块(如ngx_stream_ssl_module),提供管理WEB服务器级别的行为。

       必须使用虚拟机来配置站点,每个虚拟主机使用一个server{}段来配置,非虚拟主机的配置和公共选项,需要定义在server之外,http之内。

       下表包含是大部分常用的配置选项,更多配置请参考官方文档:http://nginx.org/en/docs/

详情见参考页

5-4、配置变量

       Nginx配置文件支持使用变量,可以使用内置变量或自定义变量。用户自定义变量语法:set var_name value;http核心模块的内置变量(http://nginx.org/en/docs/varindex.html),主要有如下:

    $uri:当前请求的uri,不带参数

    $request_uri:请求的uri,带完整参数

    $host:http请求报文中host首部;如果请求中没有host首部,则以处理此请求的主机的主机名代替

    $hostname:nginx服务运行所在主机的主机名

    $remote_addr:客户端IP

    $remote_port: 客户端port

    $remote_user:使用用户认证时客户端用户输入的用户名

    $request_filename:用户请求中的URI经过本地root或alias转换后映射的本地的文件路径

    $request_method:请求方法

    $server_addr:服务器地址

    $server_name: 服务器名称

    $server_port:服务器端口

    $server_protocol:服务器向客户端发送响应时的协议,如http/1.1,http/1.0

    $scheme:在请求中使用的scheme 映射协议本身的协议

    $http_HEADER:匹配请求报文中指定的HEADER,$http_host匹配请求报文中的host首部

    $sent_http_HEADER:匹配响应报文中指定的HERDER,例如$http_content_type匹配相应报文中的content-type首部

    $document_root:当前请求映射到的root配置
5-5、if判断语句
       if是URL地址重写ngx_http_rewrite_module模块中的选项。

       在location中使用if语句可以实现条件判断,其通常有一个return语句,且一般与有着last或break标记的rewrite规则一同使用。但其也可以按需要使用在多种场景下,需要注意的是,不当的使用可能会导致不可预料的后果。if语句中的判断条件匹配用法如下:

        正则表达式匹配:

            ==: 等值比较;

            ~:与指定正则表达式模式匹配时返回"真",判断匹配与否时区分字符大小写;

            ~*:与指定正则表达式模式匹配时返回"真",判断匹配与否时不区分字符大小写;

            !~:与指定正则表达式模式不匹配时返回"真",判断匹配与否时区分字符大小写;

            !~*:与指定正则表达式模式不匹配时返回"真",判断匹配与否时不区分字符大小写;

        文件及目录匹配判断:

            -f, !-f:判断指定的路径是否为存在且为文件;

            -d, !-d:判断指定的路径是否为存在且为目录;

            -e, !-e:判断指定的路径是否存在,文件或目录均可;

            -x, !-x:判断指定路径的文件是否存在且可执行;
比如:

if ($request_method == "PUT") { #判断请求方法

}

if ($request_uri ~ "\.(jpg|gif|jpeg|png)$"){#判断URL是否是以这些结尾的图片

}

6、nginx命令行参数

       nginx 仅有数个命令行参数,完全通过配置文件来配置。通过"nginx –h"可以查看,如下:

常用选项:

-c </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的。

-t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。

-v 显示 nginx 的版本。

-V 显示 nginx 的版本,编译器版本和配置参数。
       注意,下面安装后我们为nginx提供了一个SysV init服务脚本,就是基于这些命令实现的。

7、nginx的优势 

7-1、高并发性能的并发模型:性能好、占用内存少、稳定

      前面说过,nginx的并发模型中最好设置worker进程与CPU核心数量差不多,而一个worker进程可以处理多个请求,比apache一个进程/一个线程响应一个请求的并发模型,可以大大减少进程/线程数量,减少重复的数据,所以内存使用效率较高,占用内存资源少,同时减少CPU调度和上下文切换次数,所以nginx要比apache更"轻量",且性能更好;

      一个worker进程绑定一个CPU核心,更是可以让nginx充分发挥CPU的计算能力来处理请求。

      使用IO复用机制避免阻塞,可以处理更多的任务;

      多个worker进程互不影响,不像多线程模型,一个线程出问题可能使整个进程内其他线程都崩溃,所以nginx稳定,健壮性好。

7-2、高扩展性

      Nginx的模块化设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。因此,当对某一个模块修复Bug或进行升级时,可以专注于模块自身,无须在意其他。 

      这种低耦合度的优秀设计,造就了Nginx庞大的第三方模块,当然,公开的第三方模块也如官方发布的模块一样容易使用。

7-3、功能强大,应用前景广阔

      Nginx提供大量的功能模块,支持诸多特性,应用场景多,且现今(2016)在WEB服务器应用中占有27.80%份额。

      作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,能够支持高达50000个并发连接数的响应。

      作为负载均衡服务器:Nginx既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx用C编写, 不论是系统资源开销还是 CPU 使用效率都比Perlbal要好的多。

还可作为邮件代理服务器、缓存服务器。

7-4、配置/操作简便

      Nginx安装非常的简单,配置文件非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下进行软件版本的升级。
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值