nginx(一) nginx详解

  nginx是一个被普遍使用的集群架构组件,咱们有必要对它有足够的了解。下面将先认识nginx:包括应用场景、nginx基本架构、功能特性、并发模型以及配置说明,最后咱们再总结下,为何选择nginx的缘由。css

一、nginx应用

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

 

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

 

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

 

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

web

二、nginx基本架构

 

一、一个master进程生成多个worker子进程(每一个进程只有一个线程),一个worker响应多个用户请求;后端

二、非阻塞、IO复用、事件驱动:select,poll, epoll, kqueue,/dev/poll;缓存

三、支持sendfile,sendfile64;服务器

四、支持文件AIO(异步I/O);网络

五、支持mmap;架构

六、灵活的文件配置;

七、占用内存小:10,000个非活动HTTP保持链接占用大约2.5M内存。

三、nginx功能特性

3-一、基本功能

实现与服务静态文件(静态资源的web服务器),能缓存打开的文件描述符;

反向代理服务器,缓存、负载均衡、健康状态检测;

支持FastCGI;

模块化机制,非DSO机制,支持多种过滤器gzip,SSI和图像的模块完成图形大小调整等;

支持SSL;

3-二、扩展功能

基于名称和IP作虚拟主机;

支持keeplive;

支持平滑配置更新或程序版本升级;

定制访问日志,支持使用日志缓存以提升性能;

支持URL rewrite;

支持路径别名;

支持基于IP及用户的认证;

支持速率限制,并发数限制等;

四、nginx并发模型

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

4-一、master进程

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

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

4-二、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-三、并发处理

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-四、惊群问题

A、生产缘由:像上面第二步,多个worker进程等待同一个socket的链接事件,当这个事件发生时,这些进程被同时唤醒,就是惊群。

注意,在linux2.6内核上,accept系统调用已经不存在惊群,但用epoll机制来解决accept阻塞问题,epoll_wait会有惊群问题(新增 EPOLLEXCLUSIVE 选项解决了)。

B、致使后果:许多worker进程被内核从新调度唤醒,只有一个进程能够accept这个链接进行处理,其余余者皆失败,致使性能浪费。

C、nginx解决方案:使用锁机制,让抢到锁的一个worker进程去accept(epoll_wait)这个socket;若是操做系统支持原子整型,才会使用共享内存实现原子上锁,不然使用文件上锁。

https://blog.csdn.net/tjiyu/article/details/53027619

相关文章
相关标签/搜索