|
-- 會員 / 註冊 --
|
|
|
|
Nginx Lua開發實戰 ( 簡體 字) |
作者:李明江 著 | 類別:1. -> 程式設計 -> 綜合 |
譯者: |
出版社:機械工業出版社 | 3dWoo書號: 48498 詢問書籍請說出此書號!【缺書】 NT售價: 495 元 |
出版日:1/1/2018 |
頁數:553 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787111590293 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:為什么寫這本書
在接手安防云任務之前,我做了近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。
勘誤和資源
由于時間有限,技術能力有限,雖然已經盡量客觀,在寫作過程中排除自己主觀的內容,但難免有錯誤和不準確的地方,熱忱希望你的批評和指正。
歡迎通過郵箱和我聯系。
致謝
首先需要感謝我的太太一直以來對我的信任和支持,她是我一路走來的動力。寫這本書的時候,九哥已經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 |
序: |
|