openresty- nginx by lua
关于 http,作为一个后端工程师,很有必要看下这个的,边补习http边学lua也顺便弄下openresty。
刚开始肯定参照这个官方教程弄,把其中遇到的问题记录下来,把疑问也顺便记下来,一遍加深印象, https://openresty.org/cn/getting-started.html。
1、关于openresty
OpenResty ™ 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
听着就很牛x,是不哈。插句题外话,当初找nginx的资料偶然间看到春哥的nginx教程,瞬间就被圈粉了。http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html#00-Foreword01 感兴趣的可以去看下。
接下来看openresty怎么实现上面的功能,OpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。
openresty的目标:让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。貌似最近春哥已经出来
自己干了 ,开公司了,哈哈。也提供企业级的服务哦。其实春哥在之前也写了不少开源的组件,https://openresty.org/cn/components.html。
2、上面说了openresty的一些大致是干什么的,接下来,让我们一步一步的走近openresty。
2.1 关于nginx的非阻塞 i/o,有必要说一下。
同步与异步(node.js是典型的异步)关注的是消息通信机制 (synchronous communication/ asynchronous communication),阻塞与非阻塞关注的是,程序在等待调用结果(消息,返回值)时的状态.阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。顾名思义,非阻塞就是当请求到nginx,后端还没处理完,但是可以先告诉请求者,等我处理完就告诉你,你可以先做别的事情,如果是同步的模型必须等待后端处理完成再返回给请求者。否则当前线程就一直挂起,可想而知服务器的资源会有多大的浪费 。
2.2 关于i/o模型,由于进程是不可直接访问外部设备的,所以只能调用内核去调用外部的设备(上下文切换),然后外部设备比如磁盘,读出存储在设备自身的数据传送给内核缓冲区,内核缓冲区在copy数据到用户进程的缓冲区。在外部设备响应的给到用户进程过程中,包含了两个阶段;由于数据响应方式的不同,所以就有了不同的I/O模型。
第一种,阻塞式I/O模型,所有套接字都是阻塞的。进程挂起,内核等待外部IO响应,IO完成传送数据到kernel buffer,数据再从buffer复制到用户的进程空间.
第二种,非阻塞式I/O:在内核请求IO设备响应指令发出后,数据就开始准备,在此期间用户进程没有阻塞,也就是没有挂起,它一值在询问或者check数据有没有传送到kernel buffer中,忙等…。但是第二个阶段(数据从kernel buffer复制到用户进程空间)依然是阻塞的。但这种IO模型会大量的占用CPU的时间,效率很低效,很少使用
第三种,I/O多路复用(select,poll,epoll...):在内核请求IO设备响应指令发出后,数据就开始准备,在此期间用户进程是阻塞的。数据从kernel buffer复制到用户进程的过程也是阻塞的。但是和阻塞I/O所不同的是,它可以同时阻塞多个I/O操作,而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数,也就是说一个线程可以响应多个请求。
第四种,信号驱动式I/O(事件驱动)第一阶段是非阻塞的,当数据传送的kernel buffer后,直接用信号的方式通知线程。
第五种,异步I/O:在整个操作(包括将数据从内核拷贝到用户空间)完成后才通知用户进程。
详细连接参考:
http://www.cnblogs.com/wxl-dede/p/5134636.html
http://www.ibm.com/developerworks/cn/linux/l-async/
web一般请求流程
1、首先我们客户端发送一个请求到Web服务器,请求首先是到网卡。
2、网卡将请求交由内核空间的内核处理,其实就是拆包了,发现请求的是80端口。
3、内核便将请求发给了在用户空间的Web服务器,Web服务器解包发现客户端请求的index.html页面、
4、Web服务器便进行系统调用将请求发给内核
5、内核发现在请求的是一页面,便调用磁盘的驱动程序,连接磁盘
6、内核通过驱动调用磁盘取得的页面文件
7、内核将取得的页面文件保存在自己的缓存区域中便通知Web进程或线程来取相应的页面文件
8、Web服务器通过系统调用将内核缓存中的页面文件复制到进程缓存区域中
9、Web服务器取得页面文件来响应用户,再次通过系统调用将页面文件发给内核
10、内核进程页面文件的封装并通过网卡发送出去
11、当报文到达网卡时通过网络响应给客户端
并行处理的方式有多进程、多线程、异步三种方式。 apache 与nginx的区别,nginx比较适合做前端代理,或者处理静态文件(尤其高并发情况下),而apache适合做后端的应用服务器,功能强大[php, rewrite…],稳定性高
事件驱动适合于IO密集型服务,多进程或线程适合于CPU密集型服务
浙公网安备 33010602011771号