nginx 初了解

随着现代web开发的发展,restful,先后端分离,前端js框架的应用愈来愈广泛。不少web应用请求的接口可能根本就存在于不一样的服务器,相似于微信,支付宝等等。这其中就会存在跨域的问题。简单来讲,跨域就是浏览器为了防止黑客可以随意改变表单的请求地址的一种安全防御。若是黑客能够随意将一个表单的请求地址改为其控制的服务器地址,在返回一个能够获取用户填写信息的页面,就会形成用户信息泄露。这种浏览器跨域防御跟如今的开发模式又有相悖的地方。笔者最初使用nginx 就是为了解决先后端分离带来的跨域问题。前端

nginx是一个高性能的http/反向代理服务器,也能够用于邮件服务。具备反向代理/负载均衡的功能。起源于俄罗斯的一个大型网站,如今国内新浪、16三、腾讯、Discuz、豆瓣都有使用。nginx

笔者会记录学习nginx的过程,毕竟不少东西的学习光靠百度百科远远不够。web

一.  nginx为何具备高性能编程

   nginx在启动后,服务器会出现至少两个进程(具体看配置),也能够当作是两类进程,一个是master,一个是workers,两者是管理与被管理的关系。 master进程可以将接收到的http请求合理的分配到works进程中去。因此通常的http请求实际上是跟master进程通讯,master进程保证每一个请求只被一个works执行,至于master分配请求与worker处理请求的机制这里不作表述。后端

那么,nginx采用这种进程模型有什么好处呢?固然,好处确定会不少了。首先,对于每一个worker进程来讲,独立的进程,不须要加锁,因此省掉了锁带 来的开销,同时在编程以及问题查找时,也会方便不少。其次,采用独立的进程,可让互相之间不会影响,一个进程退出后,其它进程还在工做,服务不会中 断,master进程则很快启动新的worker进程。固然,worker进程的异常退出,确定是程序有bug了,异常退出,会致使当前worker上的 全部请求失败,不过不会影响到全部请求,因此下降了风险。固然,好处还有不少,你们能够慢慢体会。 跨域

nginx提供一种异步非阻塞的机制。当一个请求经过master到达worker时,操做系统 提供select/poll/epoll/kqueue这样的系统调用,当请求发现对应的接口还没有准备好(这里的未准备好有多种缘由,可能没有响应,正在初始化,正在创建链接等),这个时候请求放到内核中,不占用CPU的内存,同时 select/poll/epoll/kqueue这样的系统调用 监听该请求的目标是否准备好,这个时候该worker进程能够接收另外的请求来处理,若是前面的请求目标被监听到准备好时,worker在调用回,这样使得CPU处于一种高效的使用状态而不用开辟对于的线程占用内存空间。数组

固然,这里的并发请求,是指未处理完的请求,线程只有一个,因此同时能处理的请求固然只有一个了,只是在请求间进行不断地切换而已,切换也是由于异步事件 未准备好,而主动让出的。这里的切换是没有任何代价,你能够理解为循环处理多个准备好的事件,事实上就是这样的。与多线程相比,这种事件处理方式是有很大 的优点的,不须要建立线程,每一个请求占用的内存也不多,没有上下文切换,事件处理很是的轻量级。并发数再多也不会致使无谓的资源浪费(上下文切换)。更多 的并发数,只是会占用更多的内存而已。 我以前有对链接数进行过测试,在24G内存的机器上,处理的并发请求数达到过200万。如今的网络服务器基本都采用这种方式,这也是nginx性能高效的 主要缘由。浏览器

nginx在实现时,是经过一个链接池来管理的,每一个worker进程都有一个独立的链接池,链接池的大小是 worker_connections。这里的链接池里面保存的其实不是真实的链接,它只是一个worker_connections大小的一个 ngx_connection_t结构的数组。而且,nginx会经过一个链表free_connections来保存全部的空闲 ngx_connection_t,每次获取一个链接时,就从空闲链接链表中获取一个,用完后,再放回空闲链接链表里面。安全

在这里,不少人会误解worker_connections这个参数的意思,认为这个值就是nginx所能创建链接的最大值。其实否则,这个值是表 示每一个worker进程所能创建链接的最大值,因此,一个nginx能创建的最大链接数,应该是worker_connections * worker_processes。固然,这里说的是最大链接数,对于HTTP请求本地资源来讲,可以支持的最大并发数量是 worker_connections * worker_processes,而若是是HTTP做为反向代理来讲,最大并发数量应该是worker_connections * worker_processes/2。由于做为反向代理服务器,每一个并发会创建与客户端的链接和与后端服务的链接,会占用两个链接。服务器

 

(未完待续)

相关文章
相关标签/搜索