前言
在学习和使用过程中,我们发现网上其实有很多资料,但是很散,缺乏完整性。虽然技术本身讲的很清晰,也很容易上手,但是对于刚接触这门技术的开发者来说,如果想有条不紊、系统地学习这些知识,可能会走一些弯路。
因为很多资料已经过时,需要花费很多时间和精力去识别和调试,查阅英文文档也需要时间。所以我有了把自己的学习过程和心得汇编成书的想法。
在接下来的一段时间里,我总结整理了自己学习Nginx下Lua开发的思路,以及这个过程中的资料,最终写下了这篇文章。
希望本文能够帮助与我有同样需求的研发工程师快速了解和掌握Nginx下的Lua开发技术。
首先我们来看一下目录
其次,介绍主要内容
本文分为五个部分:
第一部分(1至5章)介绍了Nginx的基本操作,同时也讲解了MySQL、Redis、、的基本操作。通过学习这部分内容,可以掌握这些服务的安装和使用,一般用于搭建研发环境。这里还讲解了Nginx的核心技术和工作流程,帮助读者进一步掌握Nginx的架构和流程。各个层次的读者都可以从这部分开始学习。
第 1 章 Nginx 高效服务器,Nginx 采用了大量高并发低内存占用技术,并且使用了高可靠性技术,访问能力高出不止一个数量级。因为强大的并发能力,Nginx 在中国互联网公司得到了广泛的应用。中国各大互联网公司都使用 Nginx 来应对中国网民数量庞大、各类购物狂欢节(如“双十一”)、世界杯等热点事件。在这种大量流量涌入,需要分流、引导、逆转的场合,Nginx 被广泛使用。
第2章 数据库基本操作。Nginx应用系统以ginx为核心,合理搭配MySQL、SQL、Mongo等服务器,起到数据内存缓存、内存数据库、关系型数据库、NoSQL数据库等的作用。互联网系统中有各种关系型数据需要存储,就需要关系型数据库。互联网需要处理大量的高并发请求,所以需要高速处理TTP请求,以及各种数据缓存、页面缓存、操作缓存等。同时互联网上还有大量的结构化非关系型数据需要存储,还有各种音/视频、图片需要缓存,这就需要各种内存数据库、NoSQ数据库等才能组成完整的应用。因此本章会从分析这些数据库和缓存产品的功能、特点、安装方式、常用命令和配置文件开始。
第3章,典型的互联网系统或者云计算系统会使用大量的关系型数据库、非关系型数据库、缓存、内存数据库等来提供高速、高扩展性的服务,通常都是以集群的方式。以前协调这些系统的开发非常麻烦。现在Nginx+Lua+的机制给我们提供了快速开发,让开发者可以专注于应用,使用同一种语言进行开发。在这个架构的应用领域,它的效率是其他语言和技术无法比拟的。
本章介绍其组成、安装及配置方法。
第4章 Nginx核心技术,在开发Nginx的时候,它已经是一个成熟的Web服务器,性能良好,功能丰富,应用广泛。Nginx从设计之初就定位为高性能、高可靠、高扩展、高并发的Web服务器,性能比较好。Nginx是基于HTTP协议实现的Web服务器,由于HTTP协议的制约,有些问题很难解决,所以就用了一系列的技术来解决这些问题。
本章对这些特色技术进行介绍,以便大家能够更好的理解Nginx以及Lua开发的工作机制,并且将这些技术和思想运用到我们的项目中。
第 5 章 Nginx 工作流程,详细了解 Nginx 的主要工作流程可以帮助我们更好的理解 Nginx,从而更好的使用 Nginx,同时也可以帮助我们更好的掌握 Lua 在 Nginx 中的工作流程。通过对 Nginx 核心技术和架构的了解,我们知道了管理进程 1 工作流程机制,以及 HTTP 核心模块和配置对 Nginx 的重要性。也知道了 Nginx 的框架代码很少,只负责环境管理。本章将对这些部分的工作流程进行介绍。
第二部分(第6-7章)详细讲解了Lua脚本语言和Lua通用库,初学者想学习Lua语言或者查阅Lua语法可以直接阅读该部分相应章节。
第六章 Lua 教程,Lua 是一种轻量级、紧凑的脚本语言,用标准 C 语言编写,以源代码形式开放。它被设计为嵌入到应用程序中,为应用程序提供灵活的扩展和定制能力。目前,Lua 广泛应用于 Nginx、嵌入式设备、游戏逻辑开发等。
在Nginx中,Lua中的套路机制可以和Nginx的全异步非阻塞多阶段处理机制很好的结合起来,让开发者可以使用同步模式开发全异步的应用,而不需要考虑异步处理机制。
本章介绍Lua的基本语法知识。
第 7 章 Lua 通用库,Lua 提供了一些通用库,用户可以直接在 Lua 中进行字符串操作、表格操作、文件操作、访问操作系统、进行科学计算等。本章对这些常用的函数和操作进行了归纳,方便读者在使用过程中找到它们。
第三部分(第8-10章)讲解了Nginx开发中经常用到的一些技术,如JSON数据交换格式、nginx.conf配置方法及配置说明;还讲解了Nginx下Lua开发的实现机制。想要学习Nginx配置以及学习查阅JSON的读者可以直接阅读本部分相应章节,或者跳过其他章节,直接学习Nginx下Lua的实现机制。
第 8 章 JSON 数据交换格式,JSON 是( )的缩写,JSON 是一种用于存储和交换文本信息的语法,类似于 XML。JSON 比 XML 更小、更快、更易于解析,并且是内部使用的格式。由于 JSON 的特性,JSON 在互联网应用和嵌入式应用中得到了广泛的应用。我们在 Nginx 下的 Lua 开发中,也使用 JSON 进行数据交换。本章介绍一种常用的数据交换格式 JSON。
第九章 nginx.conf文件配置,nginx.conf是Nginx的配置文件。Nginx的工作流程是:在编译阶段选择需要使用的模块,并编译到整体项目中。模块和服务的使用都是通过nginx.conf配置文件中的配置指令来控制和实现的。复杂的服务和定制化的业务逻辑都是使用Lua脚本来实现的。因此,nginx.conf是我们开始开发和调整服务行为的第一个途径。
一个正确配置的nginx.conf为我们提供了一个正常、高效的服务框架,我们可以在框架内选择我们想要引入的HTTP请求处理阶段,并编写Lua代码来提供具体的实现。
第 10 章 Nginx 下的 Lua 实现机制。Nginx 中的大部分功能都是以模块的方式提供的,这种方式使得 Nginx 的开发和扩展非常方便。模块可以串在一起形成一个过滤器,一个模块的故障不会影响到其他部分,这是 Nginx 可扩展性和可靠性的保证。系统提供了 http、
邮件模块、事件模块等,根据业务需要,可以通过配置或者编译的方式将不同的模块组合起来,形成业务专用的Web服务器,实现一些特定的功能。Nginx经常被用作反向代理,在前端使用Nginx做登录验证、JS合并、数据库访问、访问认证等,具体业务通过反向代理来实现,充分发挥Nginx业务拓展灵活、大并发访问、会话保持能力强的优势。
第四部分(第11至26章)详细介绍了常用Lua库和数据库组件的使用方法,包括Redis、MySQL、、、Bit、lfs、.http、leurl、FFI、cjson、、。想要了解和学习这些内容的读者可以直接阅读相应章节。这里还给出了两个Lua编程示例代码。想要大致了解这门编程技术的读者可以直接阅读相应章节。
第11章 Redis操作:Redis在系统中经常被用作数据缓存和内存数据库,在大型系统中起着非常重要的作用。在Nginx核心系统中,Redis是常备的组件。本章主要介绍常用的Redis操作。
第十二章 MySQL 操作,MySQL 是一个广泛使用的关系型数据库,用于存储关系型数据。根据应用的不同,MySQL 可以很大,也可以很小。大型系统可以是一个读写分离的大型集群。
在中,MySQL有两种访问模式:
1)使用ngx._lua模块与lua-resty-mysql模块:安装时默认安装这两个模块。
2)使用。()模块:需要单独安装,此库目前不可用。
本章分别介绍这两种MySQL操作方法。
第十三章 操作,有两种访问方式:mem-nginx-访问和lua-resty-访问。lua--是实现的,另外还包含mem-nginx-。可以直接使用这两种方式访问。如果自行安装Nginx,需要添加这两个模块才可以使用。
第十四章 操作,使用ngx_与数据库进行通信,响应包为RDS格式,可以配合rds-json-nginx模块的nginx-使用。
此模块默认不启用,需要在编译时使用 -with- 选项启用。此模块要求首先在系统上安装 libpq。
第十五章 操作,在Nginx下使用lua-resty-进行访问,但是lua-resty-没有打包,需要单独安装,也就是把对应的脚本文件拷贝到目录下。lua-resty库提供了良好的性能和灵活性,内存占用低。
第十六章:位库的使用。Lua提供了位库,可以对变量数据进行位运算。在某些应用场景中,我们需要在Lua中对数据进行移位,或者进行“与、或、非”等运算,以及进制转换等。
例如用32位整数来表示RGB颜色,32位整数被分成4部分,每部分8位,8位能表示的十进制数范围是0~255。
第十七章:lfs库的使用,Ifs-file()用于补充标准Lua发行版的文件操作函数,提供了便捷的方法来访问底层目录的文件属性,Lua系统库中的文件函数只能打开文件和读写文件,Ifs库提供了操作文件和目录的方法。
第18章使用了resty.http库,resty.http用于访问外部HTTP资源,比如访问非本地、外部的Web服务、Web等,resty.http是一个轻量级的HTTP库。
第十九章:lcurl库的使用。lcurl库对函数进行了封装,并提供了Lua使用curl的接口。
主要作用就是用来连接不同的协议,和不同的服务器进行通信,相当于一个封装好的sock。
目前支持 http、https、ftp、、、dict、file、ldap 协议。还支持
HTTPS证书授权,支持HTTP POST、HTTP PUT、FTP上传、HTTP基本表单上传、代理、用户认证。
lcurl功能强大,可以为Lua提供便捷、强大的网络访问能力。
第20章 FFI 扩展 C 库,FFI 库是 Lua 中最重要的扩展库,允许在纯 Lua 代码中调用扩展的 C 示例或使用 C 数据结构。FFI 库用于扩展 Lua 的功能,使 Lua 成为一种纯“胶水”语言,可以集成丰富的 C/C++ 库来实现高性能功能。使用 FFI 库,可以将代码从 C 项目头文件复制到 Lua 代码中,将开发人员从开发 Lua 扩展 C(语言 1 函数绑定库)的繁重工作中解放出来。
FFI 与 JIT 编译器紧密集成,为 Lua 代码生成直接访问 C 数据结构的适配代码,相当于 C 编译器生成的代码。在 JIT 编译的代码中,对 C 函数的调用被视为内联函数,这与基于 Lua/C API 的函数调用不同。
第 21 章使用 cjson 库,该库为 Lua 提供了 JSON 处理功能。它是一个快速 JSON 处理库,包含在内,可以使用编译开关打开或关闭。默认情况下,它是打开的。
Lua cjson模块的特点如下:
●速度快,支持标准编码、解码操作。
●完全支持UTF-8。
●可选的运行时 JSON 异常支持。
●不支持UTF-16和UTF-32。
第22章:lua-resty-class的使用。web开发中经常会用到动态网页开发技术,比如淘宝商品页、详情页的展示就非常复杂,逻辑也非常复杂,一般都是使用动态页面技术实现的。常见的web端动态页面技术有PHP、JSP等。但是商品详情页的变化没有那么快,使用PHP、JSP等就不完全合适了。需要搭建复杂的系统,使用CGI缓存等技术来提高系统整体的并发量,这时候就可以使用模板技术了,Lua中有很多模板引擎,这里介绍一下团队提供的lua-resty-,可以渲染非常复杂的页面,并且性能上表现不错。
第23章使用了HTTP,这是HTML5中新增加的协议,实现了浏览器与服务器之间的全双工通信,初始握手需要借助HTTP请求来完成。
在 RT 出现之前,网站都是采用轮询技术来实现即时通讯的。轮询就是浏览器每隔一定的时间间隔(比如每 1 秒)向服务器发送一次请求,服务器再将最新的数据返回给客户端的浏览器。这种传统模式的弊端很明显:浏览器需要不断向服务器发送请求,但请求很长,其中包含的有用数据可能只是一个很小的值,这会占用大量的带宽。
第24章 TCP私服示例,本章介绍了使用Nginx架构实现私服TCP服务器的示例,该服务器用于实现使用私有协议的物联网网关设备的接入功能,系统基于JSON格式定义交互协议。
采用TCP作为传输层协议,服务端采用模块方式实现TCP服务的功能,由于整体架构还是Nginx,所以整个系统并发处理能力较高,访问容量以w为单位。
模块采用例程机制,让每个请求都有一个独立的例程。由于网关设备需要具备双向通讯能力,所以它们长期与服务器相连,服务器会时不时地将客户端请求转发给网关设备,也会时不时地发送各种通知和消息。每个连接都会在 VM 中维护一个例程,一个例程处理一个连接。编程时我们只需要考虑单个例程的工作流程,而不需要考虑自己编写服务器时需要考虑的异步机制和状态机。 实现的服务器是完全非阻塞异步的,代码只以同步风格编写。
第25章 访问服务器实践,该例子实现了一个供客户端调用的通用Web接口,并且利用协议实现了客户端长连接访问机制,客户端与服务器之间可以随时进行各种数据的交换,完全相当于自己用C\C++编写的访问业务服务器。
服务器启动后监听9512端口,接收客户端的连接。因为HTML5支持该协议,所以Nginx也支持该协议。客户端与服务器之间的连接为长连接,双方可以随时主动发起通信。通信协议为JSON格式。
第 26 章:Nginx 应用简介。Nginx 是典型的 HTTP 环境中使用的高速 Web 服务器。本章主要讲述以 Nginx 为核心的小型、中型、大型系统的演进过程,为刚接触 Nginx 应用开发的用户提供一种思路,全面考虑或了解系统后期会遇到的问题,更有利于系统设计和后续开发。
以Nginx为核心的系统演进类型有四种,下面会详细讨论。
第五部分(27-28章)详细介绍了ngx._lua及ngx.的配置说明,旨在帮助读者在工作中快速检索配置说明和API。
第27章 ngx lua模块配置说明详解。(简称ngx.lua_)是Nginx内嵌的Lua模块,并不包含在Nginx发布的源代码中。目前Nginx下比较流行的Lua开发方式是将Nginx、.等进行封装,方便用户使用。具体请参考第3章。
由两部分组成:配置指令和API。本章详细介绍了的配置指令。
第 28 章 API 详解。Nginx API 包括方法、常量、状态码、变量等,它们为方法提供服务。各种 *.、*.block 和 *..file 命令是 nginx.conf 到 Lua API 的桥梁和网关。本章介绍的 API 只能在这些命令内编写和运行。
这篇由阿里巴巴P9专家整理总结的【开发实践】一共有582页,由于文章篇幅限制,只能为大家介绍部分内容,每一节都有更详细的内容,需要完整版的朋友可以转发关注小编,私信小编【技术】即可获取!!!
总结
Nginx 上的 Lua 技术是华人张亦春近几年整合的架构,将高效轻量级的 Lua 脚本语言与 Nginx 结合起来,可以快速方便的开发应用系统。利用同步编程习惯实现高效的异步非阻塞模式,可以让新入行的工程师快速开发出高性能的应用。根据前辈互联网大牛的描述以及我自己的经验,在典型的应用中,使用 Lua 可以减少 90% 左右的代码量,带来的经济效益和市场机会不言而喻。对于工程师本身来说,减少加班,有更多的时间喝一杯咖啡也是非常有吸引力的。
传统分布式平台升级为云平台,就是将现有的分布式平台改造成云服务,部署在互联网上,这往往需要多名资深的服务端开发工程师花费大量时间共同提供支持。而Nginx+Lua+Redis架构的出现,从根本上简化了这种方式,少数工程师用比原有系统更少的工作时间就能完成业务服务的搭建。
Nginx+Lua架构不仅节省了时间和成本,而且从大型系统的角度来看还有很多优势:
希望大家能够学以致用,增加自己的知识储备,增加技能的深度和广度。
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。