TOP
0
0
【13悅讀日】4/13~4/17 消費滿699送100元E-coupon
OpenResty完全開發指南:構建百萬級別併發的Web應用(簡體書)
滿額折
OpenResty完全開發指南:構建百萬級別併發的Web應用(簡體書)
OpenResty完全開發指南:構建百萬級別併發的Web應用(簡體書)
OpenResty完全開發指南:構建百萬級別併發的Web應用(簡體書)
OpenResty完全開發指南:構建百萬級別併發的Web應用(簡體書)
OpenResty完全開發指南:構建百萬級別併發的Web應用(簡體書)
OpenResty完全開發指南:構建百萬級別併發的Web應用(簡體書)
OpenResty完全開發指南:構建百萬級別併發的Web應用(簡體書)
OpenResty完全開發指南:構建百萬級別併發的Web應用(簡體書)
OpenResty完全開發指南:構建百萬級別併發的Web應用(簡體書)
OpenResty完全開發指南:構建百萬級別併發的Web應用(簡體書)
OpenResty完全開發指南:構建百萬級別併發的Web應用(簡體書)
OpenResty完全開發指南:構建百萬級別併發的Web應用(簡體書)
OpenResty完全開發指南:構建百萬級別併發的Web應用(簡體書)

OpenResty完全開發指南:構建百萬級別併發的Web應用(簡體書)

人民幣定價:69 元
定  價:NT$ 414 元
優惠價:87360
領券後再享88折
海外經銷商無庫存,到貨日平均30天至45天
可得紅利積點:10 點
相關商品
商品簡介
作者簡介
目次
書摘/試閱

商品簡介

OpenResty是一個基於Nginx的高性能Web平臺,能夠方便地搭建處理超高併發的動態Web應用、Web服務和動態網關。與現有的其他開發語言/環境相比,OpenResty有著高性能、高靈活性、易於學習和擴展等許多優點,近年來得到了越來越多開發者的關注,也有了很多成功的應用範例,如Adobe、Dropbox、GitHub等知名公司都基於OpenResty構建了自己的後端業務應用。OpenResty自帶完善的幫助文檔,開發社區也很活躍,但相關的學習資料――特別是中文資料較少。本書基於作者多年使用OpenResty的經驗,系統地闡述了OpenResty相關的各方面知識和要點,幫助讀者快速掌握這個高效易用的Web開發平臺,進而實現HTTP/HTTPS/TCP/UDP等多種網絡應用。本書結構嚴謹、詳略得當,具有較強的實用性,適合廣大軟件開發工程師、系統運維工程師、編程愛好者和計算機專業學生閱讀參考。

作者簡介

羅劍鋒(網名Chrono) 1996年就讀于東北財經大學 1997年開始接觸C/C++ 1998年參加計算機軟件專業技術資格和水平考試,獲高級程序員資質 2003年畢業於北京理工大學,獲計算機專業碩士學位主要研究方向為C/C++、設計模式、高性能網絡服務器開發業餘愛好是閱讀、旅遊、欣賞音樂和電影。

隨感
本書肇始於三年多前我的《Nginx模塊開發指南》一書。最初是以書末的附錄形式出現,只有短短的幾頁,粗略地介紹了OpenResty的核心組件ngx_lua。連我自己也沒有想到,幾年後的今天它竟然“脫胎換骨”,進化成了一本頗具規模的正式圖書。
寫作本書還是有感於目前國內技術書刊市場的現狀。
十幾二十幾年前只有少數資深專家掌握核心技術,通過著書立說的方式來分享知識,普惠大眾。但隨著互聯網的高速發展,知識的獲取方式變得越來越簡單了,任何人都可以在網上輕鬆地查找到所需的資料,也可以在網上很容易地發表文章。書――曾經被譽為“進步的階梯”“精神的食糧”――已經不是那麼重要了。
另一方面,互聯網的普及也降低了書的嚴肅性和出版門檻。個人“惡意推測”,也許是為了“圖省事”或者“賺快錢”,有相當多的人只是把若干博客文章集合在一起,再加以少量修改就“攢”成了一本書。這種“亂燉”“雜燴”形式的書籍拼湊的痕跡十分明顯,缺乏內在的邏輯和連貫性,不過憑藉著網絡上積累的“人氣”也能夠獲得不錯的銷量,但在我看來實在是對讀者的不尊重和不負責。
一個極端的例子是前段時間偶然遇到的名為《□□開發實戰》的書,其粗製濫造程度簡直是“超乎想像”,“不料,也不信竟會兇殘到這地步” [ 原文出自魯迅《記念劉和珍君》。]――幾乎90%的內容都是原封不動地拷貝網絡上現成的材料,再有就是直接複製數十頁全無注釋的雜亂代碼,通篇看下來可能只有前言是“原創”,著實是“欽佩”該書作者厚顏無恥的“功力”。
單純地感慨“世風日下”“人心不古”是沒有用的,我所能做的,就是盡自己“微茫”的努力,寫出一些無愧於己於人的文字。
關於OpenResty
有這樣一種說法:“Nginx是網絡世界裡的操作系統,而OpenResty則是Nginx上的Web服務器”。
Nginx在Web Server業內的領軍地位早已經得到了公認,是高性能服務器的傑出代表。它採用C語言開發,能夠跨平臺運行,把性能挖掘優化技術發揮到了極致。正因為如此,Nginx也很自然地成為了一個超越原生操作系統的開發平臺,程序員可以完全無視底層系統之間的差異,在Nginx的框架裡調用豐富的數據結構和功能接口,開發出高性能高可移植的各種應用程序。[ 通常來說Nginx適合運行單線程的I/O密集型應用,但實際上它也可以使用多線程技術運行CPU密集型應用。]
但基於Nginx開發主要使用的語言是C/C++,開發難度高週期長,雖然沒有達到“望而生畏”的程度但亦不遠矣。好在OpenResty應運而生,在Nginx裡嵌入了LuaJIT環境和Lua語言,就如同給裸系統添加了一個高效易用的Shell,瞬間就讓Nginx開發的難度直線下降,降低到了普通的心智模型可以理解掌握的水平。
早期OpenResty對於自身的定位主要還是HTTP Server(其實也是受到Nginx的限制),可以利用“膠水語言”Lua來操縱Nginx,靈活定制業務邏輯,方便快捷地搭建出超高併發的各種Web服務,從而節約時間和人力成本。多年來的實踐證明,這方面它的確工作得非常出色。
近兩年OpenResty的發展開始加速,支持了TCP/UDP協議,擴充了眾多的專用庫、應用框架以及外圍工具,逐漸形成了一個比較獨立自洽的生態體系。雖然Nginx仍然是核心,但看得出OpenResty有淡化自身“Nginx Bundle”色彩的趨勢,力圖成為一個更偉大的存在。
隨著軟件基金會和商業公司的成立,OpenResty獲得了前所未有的成長動力。“路遠,正未有窮期”,在此借本書送上誠摯的祝福與期待。
致謝
首先要感謝Nginx的作者Igor Sysoev和OpenResty的作者agentzh,正是因為他們多年來持續無私的奉獻,我們才能夠擁有如此強大易用的Web Server。
接下來我要感謝父母多年來的養育之恩,感謝妻子和兩個可愛的女兒(“點心”組合)在生活中的陪伴,願你們能夠永遠幸福快樂。
我也要感謝讀者選擇本書,希望讀者能從中汲取有用的知識,讓OpenResty成為工作中的得力助手。

您的朋友 羅劍鋒
2018年7月18日 於 北京 798園區

目次

第0章 導讀 1
0.1 關於本書 1
0.2 讀者對象 1
0.3 讀者要求 3
0.4 運行環境 3
0.5 本書的結構 3
0.6 如何閱讀本書 5
0.7 本書的源碼 5
第1章 總論 7
1.1 簡介 7
1.2 歷史 8
1.3 組成 9
1.4 版本 11
1.5 安裝 12
1.5.1 直接安裝 12
1.5.2 源碼安裝 13
1.5.3 定制安裝 13
1.6 目錄結構 14
1.7 啟停服務 15
1.8 組件管理工具 15
1.9 命令行工具 16
1.10 參考手冊 18
1.11 性能對比 18
1.12 應用架構 21
1.13 總結 22
第2章 Nginx平臺 23
2.1 簡介 23
2.2 進程模型 24
2.3 配置文件 25
2.4 變量 26
2.5 HTTP服務 27
2.5.1 server配置 28
2.5.2 location配置 28
2.6 TCP/UDP服務 29
2.7 反向代理 29
2.7.1 上游集群 30
2.7.2 代理轉發 31
2.8運行日誌 31
2.8.1 訪問日誌 32
2.8.2 錯誤日誌 32
2.9 總結 32
第3章 Lua語言 35
3.1 簡介 35
3.2 注釋 36
3.3 數據類型 36
3.4 字符串 37
3.5 變量 38
3.6 運算 39
3.6.1 算術運算 39
3.6.2 關係運算 39
3.6.3 邏輯運算 40
3.6.4 字符串運算 40
3.6.5 注意事項 41
3.7 控制語句 41
3.7.1 語句塊 41
3.7.2 賦值語句 41
3.7.3 分支語句 42
3.7.4 循環語句 43
3.8 函數 44
3.8.1 定義函數 44
3.8.2 參數和返回值 45
3.9 表 46
3.9.1 定義表 46
3.9.2 操作表 46
3.9.3 範圍循環 47
3.9.4 作為函數的參數 48
3.10 模塊 48
3.11 面向對象 49
3.11.1 基本特性 49
3.11.2 原型模式 50
3.11.3 self參數 51
3.12 標準庫 51
3.12.1 base庫 52
3.12.2 package庫 52
3.12.3 string庫 53
3.12.4 table庫 54
3.12.5 math庫 55
3.12.6 io庫 56
3.12.7 os庫 57
3.12.8 debug庫 57
3.12.9 使用技巧 57
3.13 高級特性 58
3.13.1 閉包 58
3.13.2 保護調用 58
3.13.3 可變參數 59
3.14 總結 59
第4章 LuaJIT環境 61
4.1 簡介 61
4.2 goto語句 62
4.3 jit庫 62
4.4 table庫 63
4.5 bit庫 63
4.6 ffi庫 65
4.7 編譯為字節碼 67
4.8 編譯為機器碼 68
4.9 總結 68
第5章 開發概述 71
5.1 應用示例 71
5.1.1 編碼實現 71
5.1.2 測試驗證 73
5.2 運行命令 74
5.3 目錄結構 75
5.4 配置指令 76
5.5 運行機制 77
5.5.1 處理階段 77
5.5.2 執行程序 79
5.5.3 定時任務 81
5.5.4 流程圖 81
5.6 功能接口 83
5.7 核心庫 83
5.8 應用開發流程 84
5.9 總結 85
第6章 基礎功能 87
6.1 系統信息 87
6.2 運行日誌 88
6.3 時間日期 89
6.3.1 當前時間 90
6.3.2 時間戳 90
6.3.3 格式化時間戳 90
6.3.4 更新時間 91
6.3.5 睡眠 91
6.4 數據編碼 92
6.4.1 Base64 92
6.4.2 JSON 92
6.4.3 MessagePack 94
6.5 正則表達式 95
6.5.1 配置指令 95
6.5.2 匹配選項 96
6.5.3 匹配 96
6.5.4 查找 98
6.5.5 替換 99
6.5.6 切分 100
6.6 高速緩存 101
6.6.1 創建緩存 101
6.6.2 使用緩存 102
6.7 總結 103
第7章 HTTP服務 105
7.1 簡介 105
7.2 配置指令 106
7.3 常量 107
7.3.1 狀態碼 107
7.3.2 請求方法 108
7.4 變量 108
7.4.1 讀變量 108
7.4.2 寫變量 109
7.5 基本信息 110
7.5.1 請求來源 110
7.5.2 起始時間 110
7.5.3 請求頭 110
7.5.4 暫存數據 111
7.6 請求行 111
7.6.1 版本 112
7.6.2 方法 112
7.6.3 地址 112
7.6.4 參數 113
7.7 請求頭 114
7.7.1 讀取數據 114
7.7.2 改寫數據 115
7.8 請求體 115
7.8.1 丟棄數據 115
7.8.2 讀取數據 115
7.8.3 改寫數據 116
7.9 響應頭 117
7.9.1 改寫數據 117
7.9.2 發送數據 118
7.9.3 過濾數據 118
7.10 響應體 118
7.10.1 發送數據 118
7.10.2 過濾數據 119
7.11 手動收發數據 120
7.12 流程控制 121
7.12.1 重定向請求 121
7.12.2 終止請求 121
7.13 檢測斷連 122
7.14 綜合示例 123
7.15 總結 126
第8章 訪問後端 127
8.1 簡介 127
8.2 子請求 128
8.2.1 接口說明 128
8.2.2 應用示例 129
8.2.3 使用建議 130
8.3 協程套接字 131
8.3.1 配置指令 131
8.3.2 創建對象 132
8.3.3 超時設置 133
8.3.4 建立連接 133
8.3.5 複用連接 134
8.3.6 關閉連接 134
8.3.7 發送數據 135
8.3.8 接收數據 135
8.3.9 應用示例 136
8.4 DNS客戶端 137
8.4.1 創建對象 138
8.4.2 查詢地址 138
8.4.3 緩存地址 139
8.5 HTTP客戶端 140
8.5.1 創建對象 140
8.5.2 發送請求 140
8.6 WebSocket客戶端 142
8.6.1 創建對象 142
8.6.2 建立連接 143
8.6.3 關閉連接 143
8.6.4 複用連接 143
8.6.5 發送數據 144
8.6.6 接收數據 144
8.7 Redis客戶端 145
8.7.1 創建對象 145
8.7.2 建立連接 145
8.7.3 關閉連接 146
8.7.4 複用連接 146
8.7.5 執行命令 146
8.7.6 管道 147
8.7.7 腳本 148
8.8 MySQL客戶端 148
8.8.1 創建對象 149
8.8.2 建立連接 149
8.8.3 服務器版本號 150
8.8.4 關閉連接 150
8.8.5 複用連接 150
8.8.6 簡單查詢 150
8.8.7 高級查詢 152
8.8.8 防止SQL注入 152
8.9 總結 153
第9章 反向代理 155
9.1 簡介 155
9.2 上游集群 156
9.2.1 靜態服務器信息 157
9.2.2 動態服務器信息 158
9.2.3 服務器下線 159
9.2.4 當前上游集群 159
9.3 負載均衡 160
9.3.1 使用方式 160
9.3.2 功能接口 161
9.4 總結 162
第10章 高級功能 163
10.1 共享內存 163
10.1.1 配置指令 163
10.1.2 寫操作 164
10.1.3 讀操作 165
10.1.4 刪除操作 166
10.1.5 計數操作 166
10.1.6 隊列操作 166
10.1.7 過期操作 167
10.1.8 其他操作 168
10.2 定時器 168
10.2.1 配置指令 168
10.2.2 單次任務 169
10.2.3 週期任務 170
10.3 進程管理 171
10.3.1 進程類型 171
10.3.2 工作進程 172
10.3.3 監控進程 173
10.3.4 特權進程 173
10.4 輕量級線程 174
10.4.1 啟動線程 175
10.4.2 等待線程 175
10.4.3 掛起線程 176
10.4.4 停止線程 177
10.4.5 信號量 178
10.5 總結 179
第11章 HTTPS服務 181
11.1 簡介 181
11.1.1 密碼學 181
11.1.2 網絡協議 182
11.2 服務配置 184
11.3 應用開發 185
11.4 基本信息 185
11.4.1 協議版本號 185
11.4.2 主機名 186
11.4.3 地址 186
11.5 加載證書 187
11.5.1 清除證書 187
11.5.2 設置證書 187
11.5.3 設置私鑰 188

書摘/試閱

開發概述
由於Nginx的模塊化架構具有良好的擴展性,OpenResty實現了ngx_lua和stream_ lua等模塊,把Lua/LuaJIT完美地整合進了Nginx,從而讓我們能夠在Nginx內部的多個關鍵節點裡嵌入Lua腳本,用Lua這種便捷的語言來實現複雜的HTTP/TCP/UDP業務邏輯,同時依然保持著高度的併發服務能力。
本章將先從一個簡單的應用服務例子開始,從宏觀的層次介紹開發OpenResty應用的基本流程、配置指令、運行機制等重要知識。
5.1 應用示例
在第3章和第4章我們學習了OpenResty裡使用的Lua語言,也編寫了一些Lua程序,但它們都是使用resty-cli命令行工具運行的,並不能對外提供服務。
本節將使用OpenResty開發出一個簡單的Web服務:“Hello World”。
5.1.1 編碼實現
與其他的編程語言不同,使用OpenResty開發服務應用首先要做的並不是編寫程序代碼,而是要編寫配置文件。這是因為OpenResty使用了Nginx作為運行平臺,Nginx本身需要使用配置文件來定義Web服務。這裡我們將配置文件命名為“hello.conf”。
基本配置
作為Web服務,我們應該依據實際情況決定應用的服務能力,例如開多少個worker進程、可能的最大併發數量等。
“Hello World”應用的功能很簡單,所以我們只開啟一個worker進程,併發連接最多512個,其他的都使用默認配置。
在配置文件hello.conf裡要使用的指令是“worker_processes”和“worker_ connections”,如下:[ 其實worker_processes和worker_connections都可以不寫,默認值就是1個worker進程和最多512個連接,但配置塊events{}不能省略。]
worker_processes 1; #設置worker進程的數量為1
events { #設置併發連接需要在events塊裡
worker_connections 512; #單個worker的最大併發連接數
}
服務配置
接下來需要決定Web服務的協議和端口號,我們使用最常用的HTTP協議,端口80,域名任意。
配置HTTP服務需要編寫http{}配置塊,並在裡面使用指令server、listen、server_ name依次定義端口號和域名:
http { #定義HTTP服務
server { #server塊,定義Web服務
listen 80; #服務使用的是80端口
server_name *.*; #HTTP服務對應任意域名
} #server塊結束
} #http塊結束
處理請求
有了Web服務,我們還要有處理請求時的URI入口。因為“Hello World”應用總是返回唯一的結果,所以應當使用“location /”來匹配所有的URI:
http { #定義HTTP服務
server { #server塊,定義Web服務
listen 80; #服務使用的是80端口
server_name *.*; #HTTP服務對應任意域名

location / {} #location塊,匹配任意URI
} #server塊結束
} #http塊結束
應用程序
經過前面的三個步驟,現在Web服務的基本框架已經建立起來了,缺的只是服務的內容,這是要真正編寫Lua代碼的地方。
OpenResty提供一個專用指令“content_by_lua_block”,可以在配置文件裡書寫Lua代碼,產生響應內容:
content_by_lua_block { -- 我們的第一個OpenResty應用
ngx.print("hello, world") -- 打印經典的“hello, world”
} #Lua代碼結束
指令裡調用了OpenResty的功能接口ngx.print,向客戶端輸出了“hello, world”字符串。
完整代碼
這樣,我們的第一個OpenResty應用就完成了,完整的代碼如下:
worker_processes 1; #設置worker進程的數量為1
events { #設置併發連接需要在events塊裡
worker_connections 512; #單個worker的最大連接數
}

http { #定義HTTP服務
server { #server塊,定義Web服務
listen 80; #服務使用的是80端口
server_name *.*; #HTTP服務對應任意域名

location / { #location塊,匹配任意URI
content_by_lua_block { -- 我們的第一個OpenResty應用
ngx.print("hello, world") -- 打印經典的“hello, world”
} #Lua代碼結束
} #location塊結束
} #server塊結束
} #http塊結束
5.1.2 測試驗證
OpenResty應用開發完成之後不需要編譯,可以部署後直接運行對外提供Web服務。但注意不能簡單地執行“bin/openresty”,那將會使用OpenResty默認的配置文件而不是我們剛編寫的配置文件。
啟動應用需要使用“-c”參數,讓OpenResty以指定的配置文件運行:
/usr/local/openresty/bin/openresty -c "`pwd`/hello.conf"
現在就可以使用curl來驗證“Hello World”應用的運行情況了:
curl -v 127.0.0.1 #curl命令發送HTTP請求
curl -v 127.0.0.1/hello #總會得到“hello, world”
停止應用時同樣需要加上“-c”參數:
/usr/local/openresty/bin/openresty -c "`pwd`/hello.conf" -s stop

您曾經瀏覽過的商品

購物須知

大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。

特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。

無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。

為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。

若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。

優惠價:87 360
海外經銷商無庫存,到貨日平均30天至45天

暢銷榜

客服中心

收藏

會員專區