Nginx小试牛刀

一、概念

         什么是Nginx?

           Nginx——是一款自由的、开源的、高性能HTTP服务器反向代理服务器

                             也是一个IMAP、POP3、SMTP代理服务器;

        也就是说Nginx本身就可以托管网站(类似于Tomcat一样),进行Http服务处理,也可以作为【反向代理服务器】使用。

       Nginx 解决了服务器的C10K(就是在一秒之内连接客户端的数目为10k即1万)问题。

       它的设计不像【传统的服务器】那样使用【线程处理请求】

      而是一个更加高级的机制——【事件驱动】机制,是一种【异步事件驱动】结构

  虽然目前Nginx的份额在市场上只占很少部分,但是其【高性能】和【低消耗内存】的结构,使得其越来越普遍,典型的一个应用就是我们可以使用Nginx作     为【反向代 理】进行网站的【负载均衡器】。

 例如:Wordpress、GitHub等知名的网站都使用到了Nginx。

注:C10K问题可以参考: 
http://segmentfault.com/a/1190000000343620

http://www.csdn.net/article/2013-05-16/2815317-The-Secret-to-10M-Concurrent-Connections

二、正向代理和反向代理

        1)正向代理

              首先,【代理服务器】一般指:

                 局域网内部的机器通过代理服务器发送请求到互联网上的服务器,代理服务器一般作用在【客户端】。

                例如:GoAgent翻墙软件。

                我们的客户端在进行翻墙操作的时候,我们使用的正是正向代理

                通过正向代理的方式,在我们的客户端运行一个软件,将我们的HTTP请求转发到其他不同的服务器端,实现请求的分发。

                

        2)反向代理

               反向代理服务器作用在【服务器端】

             它在服务器端接收客户端的请求,然后将请求分发给具体的服务器进行处理,然后再将服务器的响应结果反馈给客户端。

          Nginx就是一个反向代理服务器软降。

从上图可以看出:

   客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。

反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。

客户端向反向代理的命名空间中的内容发送普通请求,紧接着反向代理将判断向何处(原始服务器)转交请求,并将获取的内容返回给客户端。

三、服务器的类型

  1、Web服务器:特供Http的访问

            例如:Nginx、Apache、IIS等

         虽然Tomcat也能够实现,但这并不是他的主要功能,而且性能也远远不如专门的Web服务器。

  2、应用程序服务器:能够用于应用程序的运行

  3、代理服务器:代理服务器通常是客户端访问的一种行为,在整个客户端访问服务器的过程中有着重要的作用; 

  4、反向代理

  5、后台服务器

  6、CDN缓存服务器:它是缓存服务器的角色,而且是反向代理的应用,在网站部署的时候,他算是一种策略,对于远距离访问的解决方案。

四、 Nginx的特点

     Ø 跨平台:可以在大多数Unix like 系统编译运行。而且也有Windows的移植版本。 

     Ø 配置异常简单:非常的简单,易上手。 

     Ø 非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。

         官方测试能支持5万并发连接,实际生产中能跑2~3万并发连接数(得益于Nginx采用了最新的epoll事件处理模型(消息队列)。 

     Ø Nginx代理和后端Web服务器间无需长连接; 

  Ø Nginx接收用户请求是异步的,即先将用户请求全部接收下来,再一次性发送到后端Web服务器,极大减轻后端Web服务器的压力。 

     Ø 发送响应报文时,是边接收来自后端Web服务器的数据,边发送给客户端。 

     Ø 网络依赖性低,理论上只要能够ping通就可以实施负载均衡,而且可以有效区分内网、外网流量。 

     Ø 支持内置服务器检测。Nginx能够根据应用服务器处理页面返回的状态码、超时信息等检测服务器是否出现故障,并及时返回错误的请求重新提交到其          它节点上。 

 Ø 采用Master/worker多进程工作模式 

    Ø 此外还有内存消耗小、成本低廉(比F5硬件负载均衡器廉价太多)、节省带宽、稳定性高等特点。

五、Nginx的基本功能

       1. Nginx的功能包括基本HTTP功能扩展功能

              和Apache服务器一样,Nginx服务器为了提供更多的功能并且能够有效地扩展这些功能。

              每一个模块都提供了一个功能,通过编译这些功能模块来实现功能的扩展。

          1、基本HTTP功能

                a)提供静态文件和index文件,处理静态文件,索引文件以及自动索引,打开文件描述符缓存; 

                b)使用缓存加速反向代理,反向代理加速(无缓存),简单的负载均衡和容错; 

                c)使用缓存机制加速远程FastCGI,简单的负载均衡和容错;

                d)模块化的结构。过滤器包括gzipping,byte ranges,chunked responses,以及 SSI-filter。

                      在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;

               e)支持SSL 和 TLS SNI 支持;

                f)IMAP/POP3代理服务功能;

               g)使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端;  

               h)使用外部 HTTP 认证服务器认证用户后连接重定向到内部的 SMTP 后端;

          2、其他HTTP功能

              a)基于名称和基于IP的虚拟服务器;

              b)支持Keep-alive和管道连接;

              c)灵活的配置和重新配置、在线升级的时候不用中断客户访问的处理;

              d)访问日志的格式,缓存日志写入和快速日志轮循;

              e)3xx-5xx错误代码重定向;

               f)速度限制

六、Nginx的基本模块

            Nginx的核心模块包括:

                  内核模块:CoreModule

                 事件驱动模块:EventsModule

      另外还有第三方模块: HTTP内核模块:HttpCoreModule,它是Nginx服务器的核心模块。

     CoreModule和EventsModule模块的配置相对于HttpCoreModule会少一些,但是它们的配置将会影响系统的性能,而非功能上的差异。

1、CoreModule用于控制Nginx服务器的基本功能; 

2、EventsModule用于控制Nginx如何处理连接。

         该模块的指令的一些参数会对应用系统的性能产生重要的影响; 

3、HttpCoreModule提供HTTP访问Nginx服务器,该模块是不能缺少的。

七、 内部进程模型

      

  Nginx是以【多进程】的方式来工作的,当然Nginx也是支持【多线程】的方式的,只是我们主流的方式还是【多进程】的方式,也是Nginx的默认方式。

  Nginx采用【多进程】的方式有诸多好处的。

 Nginx在启动后:

                会有一个【master进程】和多个【worker进程】。

                master进程主要用来管理worker进程,

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

                          而基本的网络事件,则是放在worker进程中来处理了。

             多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。

             一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。

           worker进程的个数是可以设置的,一般我们会设置与机器CPU核数一致,这里面的原因与Nginx的进程模型以及事件处理模型是分不开的。

八、 处理请求

           1.  首先,Nginx在启动时,会解析配置文件,得到需要监听的端口与IP地址,然后在Nginx的master进程里面,先初始化好这个监控的socket(创建                        socket,设置addrreuse等选项,绑定到指定的IP地址端口,再listen)

           2. 然后再fork(一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程 )出多个子进程出来,然后子进程会竞争accept新的                连接。

           3. 此时,客户端就可以向Nginx发起连接了。

                当客户端与Nginx进行三次握手,与Nginx建立好一个连接后,某一个子进程会accept成功,得到这个建立好的连接的socket,然后创建Nginx对连                   接的封装,即ngx_connection_t结构体。 

           4. 接着,设置读写事件处理函数并添加读写事件来与客户端进行数据的交换。

           5. 最后,Nginx或客户端来主动关掉连接,到此,一个连接就寿终正寝了。

九、 实际应用

           由于Nginx是由俄罗斯人写的,所以,Nginx 已经在俄罗斯最大的门户网站── Rambler Media(www.rambler.ru)上运行了3年时间,同时俄罗斯超过20%的虚拟主机平台采用Nginx作为反向代理服务器。

           在国内,已经有淘宝、新浪博客、新浪播客、网易新闻、六间房、56.com、Discuz!、水木社区、豆瓣、YUPOO、海内、迅雷在线等多家网站使用 Nginx 作为Web服务器或反向代理服务器。

    在近期一些项目的开发过程中,主要是使用Nginx和Tomcat来搭建高性能负载均衡集群,即使用Nginx的反向代理功能来实现请求的分发,关于Nginx和Tomcat的组合使用,不在这里重复造轮子,请参考免费文档: 
http://download.csdn.net/detail/u010870518/9261395

猜你喜欢

转载自blog.csdn.net/qq_24047659/article/details/88062490