首页>参考读物>计算机科学与技术>软件与程序设计

Nginx Lua开发实战
作者 : 李明江 著
丛书名 : Web开发技术丛书
出版日期 : 2018-01-30
ISBN : 978-7-111-59029-3
定价 : 99.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 578
开本 : 16
原书名 :
原出版社:
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

本书围绕Nginx下Lua开发语言、Nginx核心工作机制、Nginx配置方法、核心数据组件和配置及API指令等:
1. Lua语言基本语法以及常用库,Lua是基础脚本语言。
2. Nginx分布式异步架构和核心技术,用于让开发者更好了解Nginx的架构和工作流程,在开发中更好地利用Nginx的特性,实现高性能业务系统。
3. Nginx和常用的各种数据库、缓冲工具的配置和使用方法。方便读者学习时安装、操作对应的开发环境。同时介绍各组件主要的应用场景,方便初学者迅速了解和定位系统分工和职责。
4. 常用各组件的访问方法。介绍各种数据库和缓存组件的使用方法和完备的配置指令、API及参数,使读者可快速入门,同时使中高级用户在工作中可以方便查阅指令和API。
5. 配置指令和API手册。详细罗列官方API和配置指令,方便中高级用户在工作中查阅。
6. 在各个章节中穿插应用实例。使初学者可以快速形成整体概念,同时在自己的工程中可以使用部分代码,构架程序框架。
使初学者可以对Nginx下Lua开发所有技术有个概貌性认识,并可参照书中介绍和示例代码开始学习每一个技术点;中级用户可以将各种技术和Nginx框架有一个贯通性认识,同时更深入了解各功能或API在系统中的一些隐藏特性,可以发掘深入的应用;高级用户可以把本书当成一本手册,用于工作中对API和配置指令的查阅。

图书特色

Nginx上的Lua技术是近些年来由中国人章亦春整合出来的架构,将高效、轻量级的Lua脚本语言和Nginx结合起来,可以快捷、方便地开发应用系统。使用同步式的编程习惯实现异步非阻塞的高效模式,使新上手的工程师也可以快速开发高性能应用。据资深互联网专家描述以及本人亲身体会,在典型应用下,使用Lua可以使代码量减少90%左右,带来的经济效益和抢得的市场先机自不待言。对于工程师本身来讲,减少加班、多点时间喝杯咖啡也是极具吸引力的。
传统分布式平台要升级为云平台都是通过将已有的分布式平台改造成云服务,进行互联网部署,往往需要多位资深服务器开发工程师花费大量时间共同提供支持,而Nginx+Lua+Redis架构的出现,从根本上简化了这种方式,少量工程师花费少于原有体系的工作时间即可完成业务服务搭建。
Nginx+Lua架构不仅可以节约时间和成本,从做大型系统的角度来看,它还具有诸多优势:
调试方便:不需要编译代码,相关访问模块是成熟稳定的,只需要调试新加的业务代码即可。大型系统,特别是分布式系统,一个功能或代码的调试链条很长,非常容易出错。
降低耦合:因为架构的限制,Lua代码只能在必须的阶段管理器中开发,代码是一个一个.lua文件,耦合性大幅降低。
框架良好:先进的异步式多进程架构,可以充分利用系统资源。而如果自行开发并维护这样一个框架,则需要大量的人力、物力。
上手容易:Lua代码具有良好的结构和可读性,上手速度更快。团队成员经过快速培训就可以上手。

图书前言

为什么写这本书
在接手安防云任务之前,我做了近10年传统安防分布式平台的工作。安防云任务是基于云计算平台和P2P技术向用户提供SaaS服务。最初我的方案是将我们熟悉的分布式平台改造成云服务,进行互联网部署。
针对消费级摄像机的应用,我们对服务进行了裁剪,只留下几个服务器。但是需要几个资深的C++服务器开发工程师提供技术支持。后来,新来的架构师经过一段时间的消化后,提出了Nginx+Lua+Redis架构。他一个人只花费一个多月的时间就把业务服务写好了。这件事情让我感受到了Nginx+Lua的魅力。
Nginx+Lua架构带来的改变还远不止节约时间和成本。从做大型系统的角度来看,它还会带来更多的东西:
调试方便:因为它不需要编译代码,相关访问模块是成熟稳定的,只需要调试新加的业务代码即可。大型系统特别是分布式系统,调试一个功能或代码的链条太长了,非常容易出错。
降低耦合:因为架构的限制,代码只能在必需的阶段管理器中开发,代码是一个个.lua文件,耦合性大大降低。
框架良好:因为先进的异步式多进程架构,可以充分利用系统资源。如果自行开发并维护这样一个框架,需要大量的人力、物力。
上手容易:Lua代码良好的结构和可读性,使其上手速度更快。团队成员经过快速培训就可以上手。
在学习和使用ngx_lua的过程中我发现,网络上资料其实非常多,但是非常零散,没有整体性。虽然技术本身是很清晰和易用的,但是对于刚接触这门技术的开发者来说,想要有条理、系统地把这些知识学完,可能会走一些弯路。因为很多资料已经过时了,甄别和调试会耗费很多时间和精力,同时查阅英文文档也比较花时间。于是,我就有了把自己的学习过程和心得整理成书的想法。
随后的时间里,我将自己学习Nginx下Lua开发的思路,以及这个过程中的资料一点点总结出来加以整理,终成本书。希望本书可以帮助跟我有一样需求的研发工程师快速了解并掌握Nginx下Lua开发技术。
本书的主要内容和特色
通常我们学习一门语言、一门技术的时候,都是这样一个过程:初学这项技术时,我们通常需要知道Lua语言的细节,需要知道Nginx的结构;当我们着手学习时,首先需要搭建一个学习环境,以便了解系统的结构和运行机制,同时用于编写测试代码;运行第一个测试代码的时候,需要对Nginx进行配置,但是并不熟悉Nginx的配置,对于nginx.conf里的内容比较头疼;等到我们掌握了这项开发技术,开始业务系统开发了,又往往需要针对具体问题查找配置指令的用法和参数,以及查阅API的详细用法。
所以,本书按照这样的不同需求,对Nginx下Lua开发技术的不同关注点做了描述。
Nginx的基本知识,包含Nginx的使用、配置、安装、技术架构、技术特点、主要工作流程等。
外围关系型数据库、NoSQL数据库、缓存等的使用范围、安装、使用方法、配置,如MySQL、PostgreSQL、MongoDB、Redis、Memcached。
Lua语法详解,包含Lua系统库。
Lua常用库,包含Redis、MySQL、Memcached、PostgreSQL、MongoDB、Bit、lfs、restry.http、lcurl、FFI、cjson、Template、WebSocket。
两个相对完整的Lua实例,结合实例以巩固涉及的知识点。
ngx_lua的配置指令和API,详细介绍了每一个官方指令和API。
我希望无论是对于Nginx Lua的初学者,还是对于经验丰富的开发者,都可以通过本书学到基础知识,找到常用库的API说明,而不用查阅其他资料及官方英文文档。
本书面向的读者
本书适合初学Nginx下Lua开发的工程师使用。通过本书可以比较系统地学习Lua语言,学习框架下经常用到的各组件使用方法,学习Nginx下Lua程序开发;可以参照本书的内容搭建学习环境,逐一测试各组件访问代码,并可通过后面的例子编写自己的访问代码和访问库。
本书适合有经验的Nginx和Lua开发工程师使用。通过本书可以快速查阅相关数据库、缓存、库的使用方法;可以查阅Nginx配置指令;还可以查阅ngx_lua配置指令和API。
本书同样适合做服务器端开发的资深工程师使用。书中讲解了Nginx的核心架构和主要的工作流程,也讲解了Nginx为了提高性能和并发所使用的一些关键技术,这些技术和算法对我们开发自己的高性能服务器有重要指导意义。
如何阅读本书
本书主要分五部分:
第一部分(第1~5章)介绍Nginx的基本操作,同时讲解了MySQL、PostgreSQL、Redis、Memcached、MongoDB、OpenResty的基本操作。通过对本部分的学习可以掌握这些服务的安装和使用方法,一般用于研发环境的搭建。这里还讲解了Nginx核心技术和工作流程,用于帮助读者进一步掌握Nginx的架构和流程。各个层次的读者都可以从本部分读起。
第二部分(第6~7章)详细讲解了Lua脚本语言和Lua通用库。学习Lua语言或查阅Lua语法的初学者可以直接阅读该部分相应章节。
第三部分(第8~10章)讲解了在Nginx开发中经常使用的一些技术,如JSON数据交换格式、nginx.conf配置方法和配置指令;还讲解了Nginx下Lua开发的实现机制。学习Nginx配置的读者,学习和查阅JSON的读者可以直接阅读该部分相应章节,也可以跳过其他章节,直接学习Nginx下Lua的实现机制。
第四部分(第11~26章)详细介绍了常用Lua库和数据库等组件的使用方法,包括Redis、MySQL、Memcached、PostgreSQL、MongoDB、Bit、lfs、restry.http、lcurl、FFI、cjson、Template、WebSocket。要了解和学习这些内容的读者,可以直接阅读对应章节。这里同时给出了两个Lua编程实例代码,要总体了解这项编程技术的读者可直接翻阅相应章节。
第五部分(第27~28章)详细介绍了ngx_lua的配置指令和ngx_lua API,目的是帮助读者在工作中快速检索配置指令和API。
勘误和资源
由于时间有限,技术能力有限,虽然已经尽量客观,在写作过程中排除自己主观的内容,但难免有错误和不准确的地方,热忱希望你的批评和指正。
欢迎通过邮箱和我联系:13067722617@163.com。
致谢
首先需要感谢我的太太一直以来对我的信任和支持,她是我一路走来的动力。写这本书的时候,九哥已经10岁了,他已经知道我在做什么了,他以我为荣,我也以他为傲。感谢我的丈人、丈母娘对我们的爱和一直以来的帮助。
写这本书的时候,我的父母又来到了我们的身边,为了和我们年轻人相处得更融洽,他们做出了巨大的改变。
最后要感谢出版社的杨福川和李艺,没有你们的努力是不会见到这本书的。感谢你们的支持和信任!

上架指导

计算机\程序设计

封底文字

Nginx上的Lua技术是近些年来由中国人章亦春整合出来的架构,将高效、轻量级的Lua脚本语言和Nginx结合起来,可以快捷、方便地开发应用系统。使用同步式的编程习惯实现异步非阻塞的高效模式,使新上手的工程师也可以快速开发高性能应用。据资深互联网专家描述以及本人亲身体会,在典型应用下,使用Lua可以使代码量减少90%左右,带来的经济效益和抢得的市场先机自不待言。对于工程师本身来讲,减少加班、多点时间喝杯咖啡也是极具吸引力的。
传统分布式平台要升级为云平台都是通过将已有的分布式平台改造成云服务,进行互联网部署,往往需要多位资深服务器开发工程师花费大量时间共同提供支持,而Nginx+Lua+Redis架构的出现,从根本上简化了这种方式,少量工程师花费少于原有体系的工作时间即可完成业务服务搭建。
Nginx+Lua架构不仅可以节约时间和成本,从做大型系统的角度来看,它还具有诸多优势:
 调试方便:不需要编译代码,相关访问模块是成熟稳定的,只需要调试新加的业务代码即可。大型系统,特别是分布式系统,一个功能或代码的调试链条太长了,非常容易出错。
 降低耦合:因为架构的限制,Lua代码只能在必须的阶段管理器中开发,代码是一个一个.lua文件,耦合性大为降低。
 框架良好:因为先进的异步式多进程架构,可以充份利用系统资源。如果自行开发并维护这样一个框架,需要大量的人力、物力。
 上手容易:Lua代码良好的结构和可读性,上手速度更快。团队成员经过快速培训就可以上手。

图书目录

前言
第一部分 Nginx操作基础
第1章 Nginx高效服务器 2
1.1 Nginx的特点 2
1.2 Nginx的安装 3
1.3 configure命令参数 7
1.4 小结 12
第2章 数据库的基本操作 13
2.1 Nginx应用中的数据库 13
2.2 MySQL关系型数据库 15
2.2.1 yum安装方法 16
2.2.2 使用mysql测试服务 18
2.2.3 MySQL文件分布 19
2.2.4 数据库操作 19
2.3 Redis内存数据库 22
2.3.1 Redis安装 22
2.3.2 启动Redis服务 23
2.3.3 Redis 配置 23
2.3.4 参数说明 26
2.3.5 数据类型 29
2.4 PostgreSQL关系型数据库 31
2.5 Memcached内存数据库 33
2.5.1 Memcached安装 34
2.5.2 连接编辑 34
2.5.3 管理Memcached服务 35
2.5.4 Memcached命令 37
2.6 MongoDB分布式NoSQL数据库 42
2.6.1 MongoDB安装 43
2.6.2 mongod.conf配置说明 45
2.7 小结 48
第3章 OpenResty 49
3.1 OpenResty:概述 49
3.2 OpenResty的组成 50
3.3 OpenResty的安装 52
3.4 Nginx多实例 54
3.5 小结 54
第4章 Nginx核心技术 55
4.1 Nginx设计目标 55
4.2 Nginx架构 57
4.2.1 事件驱动 57
4.2.2 异步多阶段处理 59
4.2.3 模块化设计 61
4.2.4 管理进程、工作进程设计 63
4.2.5 内存池 65
4.2.6 连接池 66
4.2.7 时间缓存 66
4.2.8 延迟关闭 67
4.2.9 跨平台 67
4.2.10 HTTP模块管道过滤模式 67
4.2.11 keepalive 68
4.2.12 pipeline 69
4.3 小结 69
第5章 Nginx的工作流程 70
5.1 Nginx的启动流程 70
5.2 管理进程的工作流程 72
5.3 工作进程的工作流程 75
5.4 配置加载流程 76
5.5 HTTP框架初始化流程 79
5.6 HTTP模块调用流程 81
5.7 HTTP请求处理流程 82
5.8 小结 83
第二部分 Lua脚本语言
第6章 Lua教程 86
6.1 Lua基础 86
6.1.1 Lua的特性 86
6.1.2 Lua的应用场景 87
6.1.3 安装Lua环境 87
6.2 Lua基本语法 88
6.2.1 第一个Lua程序 88
6.2.2 注释 89
6.2.3 标识符 90
6.2.4 关键词 90
6.2.5 全局变量 90
6.3 Lua的数据类型 90
6.4 Lua变量 96
6.4.1 赋值语句 96
6.4.2 索引 97
6.5 Lua循环 98
6.6 Lua流程控制 98
6.7 Lua函数 99
6.7.1 函数的定义 99
6.7.2 多返回值 100
6.7.3 可变参数 101
6.8 Lua运算符 101
6.8.1 算术运算符 102
6.8.2 关系运算符 102
6.8.3 逻辑运算符 103
6.8.4 其他运算符 104
6.8.5 运算符的优先级 105
6.9 Lua字符串 106
6.10 Lua数组 107
6.10.1 一维数组 107
6.10.2 多维数组 108
6.11 Lua迭代器 109
6.11.1 泛型for迭代器 109
6.11.2 无状态的迭代器 110
6.11.3 多状态的迭代器 111
6.12 Lua表 112
6.13 Lua模块与包 113
6.13.1 require函数 114
6.13.2 加载机制 115
6.13.3 C包 115
6.14 Lua元表 116
6.14.1 _index元方法 117
6.14.2 _newindex元方法 118
6.14.3 为表添加运算符 119
6.14.4 _call元方法 119
6.14.5 _tostring元方法 120
6.15 Lua协同程序 121
6.15.1 基本语法 121
6.15.2 生产者–消费者问题 124
6.16 Lua错误处理 125
6.16.1 语法错误 125
6.16.2 运行错误 125
6.16.3 错误处理 126
6.16.4 error函数 126
6.16.5 pcall、xpcall、debug 127
6.17 Lua调试 128
6.18 Lua垃圾回收 130
6.19 Lua面向对象 131
6.19.1 Lua中面向对象 132
6.19.2 Lua继承 134
6.20 Lua数据库访问 136
6.21 小结 137
第7章 Lua通用库 138
7.1 字符串库 138
7.2 表库 141
7.3 文件I/O库 143
7.3.1 简单模式 144
7.3.2 完全模式 145
7.3.3 其他方法 146
7.4 数学库 147
7.5 操作系统库 150
7.6 小结 151
第三部分 Nginx开发技术
第8章 JSON数据交换格式 154
8.1 什么是JSON 154
8.2 JSON转换为JavaScript对象 155
8.3 JSON与XML的比较 155
8.4 JSON语法规则 156
8.5 格式化 157
8.6 小结 158
第9章 nginx.conf文件配置 159
9.1 默认nginx.conf文件 159
9.2 nginx.conf示例 162
9.3 全局配置与顶层配置块 166
9.3.1 main全局配置 166
9.3.2 events配置块 170
9.3.3 http服务器配置块 172
9.3.4 ngx_http_core_module变量 194
9.3.5 stream 195
9.4 中文版nginx.conf 201
9.5 小结 204
第10章 Nginx下Lua实现机制 206
10.1 ngx_lua原理 206
10.2 HTTP请求的处理阶段 209
10.3 ngx_lua的处理阶段 210
10.4 Lua阶段解析 212
10.4.1 init_by_lua 212
10.4.2 init_worker_by_lua 213
10.4.3 set_by_lua 214
10.4.4 rewrite_by_lua 216
10.4.5 access_by_lua 217
10.4.6 content_by_lua 218
10.4.7 header_filter_by_lua 220
10.4.8 body_filter_by_lua 220
10.4.9 log_by_lua 220
10.4.10 balancer_by_lua_block 221
10.5 小结 222
第四部分 Nginx Lua开发实战
第11章 Redis操作 224
11.1 Redis操作方法概述 224
11.2 HttpRedis访问方法 225
11.2.1 示例 225
11.2.2 HttpRedis API 226
11.2.3 HttpRedis变量 228
11.3 HttpRedis2Module访问方法 229
11.3.1 示例 229
11.3.2 nginx.conf配置 230
11.3.3 常用指令 231
11.3.4 技术点 234
11.3.5 应答包解析 238
11.4 lua-resty-redis访问方法 239
11.4.1 示例 239
11.4.2 API函数 240
11.4.3 技术点 244
11.4.4 问题列表 246
11.4.5 限制 247
11.4.6 安装 247
11.5 小结 247
第12章 MySQL操作 248
12.1 lua-restry-mysql访问方式 248
12.1.1 示例 248
12.1.2 安装 250
12.1.3 方法与函数 251
12.1.4 多结果集返回示例 254
12.1.5 其他注意事项 255
12.1.6 限制 255
12.2 HttpDrizzleModule访问方式 255
12.2.1 示例 256
12.2.2 安装 257
12.2.3 技术点 258
12.2.4 配置指令 259
12.2.5 变量 263
12.2.6 输出格式 264
12.3 HttpDrizzleModule完整示例 265
12.4 小结 272
第13章 Memcached操作 273
13.1 mem-nginx-module访问方式 273
13.1.1 概述 273
13.1.2 命令 276
13.1.3 指令 279
13.1.4 安装 281
13.1.5 说明 281
13.1.6 示例 282
13.2 lua-resty-memcached 访问方式 285
13.2.1 概述 285
13.2.2 API 286
13.2.3 自动日志 291
13.2.4 限制 291
13.3 小结 291
第14章 PostgreSQL操作 292
14.1 概述 292
14.2 配置指令 293
14.3 配置变量 295
14.4 示例 296
14.5 小结 298
第15章 MongoDB操作 299
15.1 安装 299
15.2 配置 299
15.3 操作函数 300
15.3.1 连接对象方法 300
15.3.2 数据库对象方法 301
15.3.3 列对象方法 301
15.4 示例 302
15.5 小结 303
第16章 bit库的使用 304
16.1 示例 304
16.2 安装 305
16.3 函数 305
16.4 说明 307
16.5 小结 308
第17章 lfs库的使用 309
17.1 目录迭代示例 309
17.2 安装 310
17.3 LuaFileSystem函数 310
17.4 小结 312
第18章 resty.http库的使用 313
18.1 安装 313
18.2 概述 314
18.3 函数 315
18.3.1 连接类 315
18.3.2 应答类 318
18.3.3 代理类 319
18.3.4 工具类 319
18.4 小结 320
第19章 lcurl库的使用 321
19.1 安装 321
19.1.1 安装libcurl 321
19.1.2 安装lcurl 322
19.2 示例 322
19.3 函数 324
19.3.1 httpform类 325
19.3.2 easy类 327
19.3.3 multi类 331
19.3.4 error类 333
19.3.5 share类 333
19.4 常用变量 334
19.4.1 字符串数组类选项 334
19.4.2 字符串选项 334
19.4.3 数值型选项 336
19.4.4 布尔型选项 337
19.5 完整示例 338
19.6 小结 340
第20章 FFI扩展C库 341
20.1 示例 341
20.1.1 调用外部C函数 341
20.1.2 使用C结构体数据 342
20.2 FFI库的使用 344
20.2.1 载入FFI库 344
20.2.2 访问标准系统函数 344
20.2.3 访问zlib压缩库 345
20.2.4 为一个C类型定义元方法 346
20.2.5 转换C语法 347
20.3 FFI API 348
20.3.1 声明和访问外部符号 348
20.3.2 创建cdata对象 349
20.3.3 C类型信息 349
20.3.4 功能函数 350
20.3.5 特定目标信息 351
20.3.6 方法回调 351
20.3.7 扩展标准库函数 351
20.4 调用curl库的完整示例 352
20.5 小结 352
第21章 cjson库的使用 353
21.1 示例 353
21.2 函数 354
21.3 变量 358
21.4 小结 358
第22章 lua-resty-template类的使用 359
22.1 示例 359
22.2 模板符号 360
22.2.1 短转义符号 361
22.2.2 上下文表中的复杂key 361
22.2.3 HTML转义 361
22.2.4 保留的上下文key和评论 362
22.3 安装 363
22.3.1 Nginx/OpenResty配置 363
22.3.2 使用document_root 363
22.3.3 使用template_root 364
22.3.4 使用template_location 364
22.4 Lua API 364
22.5 模板预编译 368
22.6 模板助手 368
22.7 用法示例 369
22.7.1 引用模板 369
22.7.2 Layouts的views 370
22.7.3 使用Blocks 371
22.7.4 继承 373
22.7.5 Macros 374
22.7.6 调用模板中的方法 375
22.7.7 模板内嵌的Angular或其他标签/模板 376
22.7.8 模板内嵌的Markdown 376
22.7.9 LSP 377
22.8 FAQ 378
22.9 小结 379
第23章 WebSocket的使用 380
23.1 示例 381
23.2 安装 383
23.3 resty.websocket.server 383
23.4 resty.websocket.client 386
23.5 resty.websocket.protocol 389
23.6 使用注意事项 390
23.7 小结 390
第24章 TCP私有服务器实例 391
24.1 协议 391
24.1.1 协议总体要求 391
24.1.2 包头定义 392
24.1.3 协议命令 393
24.2 DDP系统架构 394
24.3 DDP服务实现 395
24.3.1 nginx.conf配置 395
24.3.2 init.lua 398
24.3.3 ddp.lua 399
24.3.4 DDP代码解析 405
24.3.5 Redis和MySQL的
location 407
24.3.6 管理页面REST操作 411
24.4 小结 412
第25章 WebSocket接入服务器实战 413
25.1 nginx.conf内容 413
25.2 ws_svr.lua内容 421
25.3 update_alarts代码 436
25.4 小结 438
第26章 Nginx应用简述 439
26.1 简单系统 439
26.2 读写分离系统 439
26.3 引入缓存系统 440
26.4 缓存主从系统 441
26.5 小结 442
第五部分 开发手册
第27章 ngx_lua_module模块配置指令详解 444
27.1 概述 444
27.2 Lua配置顺序 456
27.3 配置指令 457
27.4 小结 487
第28章 ngx_lua API详解 488
28.1 概述 488
28.2 API与常量 491
28.3 小结 565

教学资源推荐
作者: (美)Harold Abelson,Gerald Jay Sussman,Julie Sussman
作者: 郑阿奇,梁敬东
参考读物推荐