OpenResty - 第二章 | OpenResty 整合 lua zlib
前言
在開始之前建議先看完OpenResty - 第一章 | OpenResty 介绍/編譯安裝,下面的整合安裝會比較清楚。
因為專案的gatway
與service
之間是透過gzip
壓縮,而gatway
所使用的是OpenResty
,所以需要openresty lua zlib
整合安裝,讓lua
支援解壓服務端壓縮過的資料。
OpenResty
在編譯安裝的時候就加入了lua
支援,所以無需再對nginx
進行改造。但lua
下對gzip
進行解壓,需要藉助一個庫:
lua- zlib,lua
是一個和C
語言結合緊密的指令碼語言,實際上lua-zlib
就是一個C
語言編寫的庫,我們現在需要做的就是將其編譯成一個動態連結庫zlib.so
,讓lua
來引用。
- HTTP壓縮介紹
HTTP
壓縮是一種內建到網頁伺服器和網頁客戶端中以改進傳輸速度和頻寬利用率的方式。HTTP
資料在從伺服器傳送前就已壓縮:相容的瀏覽器將在下載所需的格式前宣告支援何種方法給伺服器;不支援壓縮方法的瀏覽器將下載未經壓縮的資料。最常見的壓縮方案包括gzip
和Deflate
,但可用方案的完整列表由IANA
維護。此外,第三方可能開發新的方法並納入到其自身的產品,例如Google
的面向HTTP
共享字典壓縮(SDCH
)方案就實現在Google Chrome
瀏覽器和使用在Google
的伺服器上。
Example Headers:
1 | Accept-Encoding: gzip, deflate, br |
安裝問題
透過網路上的教學openresty lua zlib整合安裝
在安裝的過程中發生了一些錯誤;
錯誤訊息:
1 | $ make && make install |
解決
- Mac OS X (macOS) 用户
- 準備&檢查,確保
gcc
,git
,make
,cmake
皆已安裝
- 檢查
gcc
是否有安裝1
2
3
4
5
6$ gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.3 (clang-1103.0.32.62)
Target: x86_64-apple-darwin19.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin - 檢查
git
是否有安裝1
2$ git --version
git version 2.24.3 (Apple Git-128) - 檢查
make
是否有安裝1
2
3
4
5
6
7
8$ make -v
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for i386-apple-darwin11.3.0 - 檢查
cmake
是否有安裝1
2
3
4$ cmake -version
cmake version 3.19.1
CMake suite maintained and supported by Kitware (kitware.com/cmake).註:如有缺少,可使用Homebrew做安裝。
- 準備&檢查,確保
- 下載
zlib
原始碼1
2Download page:https://zlib.net/
Downlaod link:https://zlib.net/zlib-1.2.11.tar.gz註:文章撰寫時最新版為:
zlib-1.2.11
- 下載
- 解壓縮[
zlib-1.2.11.tar.gz
]1
$ tar -xzvf zlib-1.2.11.tar.gz
註:
zlib-1.2.11.tar.gz
解壓縮路徑自己選擇即可,不影響過程,這邊解壓縮至/Users/morose/Documents/Temp/tutorial/zlib-1.2.11
。
- 解壓縮[
- 進入到步驟
3
,zlib-1.2.11
解壓縮後的目錄下。當前zlib-1.2.11目錄列表:1
$ cd /Users/morose/Documents/Temp/tutorial/zlib-1.2.11
- 進入到步驟
- ./configure (配置)output:
1
$ ./configure
當前zlib-1.2.11目錄列表:1
2
3
4
5
6
7
8
9
10
11
12
13Checking for gcc...
Checking for shared library support...
Building shared library libz.1.2.11.dylib with gcc.
Checking for size_t... Yes.
Checking for off64_t... No.
Checking for fseeko... Yes.
Checking for strerror... Yes.
Checking for unistd.h... Yes.
Checking for stdarg.h... Yes.
Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf().
Checking for vsnprintf() in stdio.h... Yes.
Checking for return value of vsnprintf()... Yes.
Checking for attribute(visibility) support... Yes.
- ./configure (配置)
- make (製作)output:
1
$ make
當前zlib-1.2.11目錄列表:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41gcc -O3 -DHAVE_HIDDEN -I. -c -o example.o test/example.c
gcc -O3 -DHAVE_HIDDEN -c -o adler32.o adler32.c
gcc -O3 -DHAVE_HIDDEN -c -o crc32.o crc32.c
gcc -O3 -DHAVE_HIDDEN -c -o deflate.o deflate.c
gcc -O3 -DHAVE_HIDDEN -c -o infback.o infback.c
gcc -O3 -DHAVE_HIDDEN -c -o inffast.o inffast.c
gcc -O3 -DHAVE_HIDDEN -c -o inflate.o inflate.c
gcc -O3 -DHAVE_HIDDEN -c -o inftrees.o inftrees.c
gcc -O3 -DHAVE_HIDDEN -c -o trees.o trees.c
gcc -O3 -DHAVE_HIDDEN -c -o zutil.o zutil.c
gcc -O3 -DHAVE_HIDDEN -c -o compress.o compress.c
gcc -O3 -DHAVE_HIDDEN -c -o uncompr.o uncompr.c
gcc -O3 -DHAVE_HIDDEN -c -o gzclose.o gzclose.c
gcc -O3 -DHAVE_HIDDEN -c -o gzlib.o gzlib.c
gcc -O3 -DHAVE_HIDDEN -c -o gzread.o gzread.c
gcc -O3 -DHAVE_HIDDEN -c -o gzwrite.o gzwrite.c
libtool -o libz.a adler32.o crc32.o deflate.o infback.o inffast.o inflate.o inftrees.o trees.o zutil.o compress.o uncompr.o gzclose.o gzlib.o gzread.o gzwrite.o
gcc -O3 -DHAVE_HIDDEN -o example example.o -L. libz.a
gcc -O3 -DHAVE_HIDDEN -I. -c -o minigzip.o test/minigzip.c
gcc -O3 -DHAVE_HIDDEN -o minigzip minigzip.o -L. libz.a
gcc -O3 -fPIC -DHAVE_HIDDEN -DPIC -c -o objs/adler32.o adler32.c
gcc -O3 -fPIC -DHAVE_HIDDEN -DPIC -c -o objs/crc32.o crc32.c
gcc -O3 -fPIC -DHAVE_HIDDEN -DPIC -c -o objs/deflate.o deflate.c
gcc -O3 -fPIC -DHAVE_HIDDEN -DPIC -c -o objs/infback.o infback.c
gcc -O3 -fPIC -DHAVE_HIDDEN -DPIC -c -o objs/inffast.o inffast.c
gcc -O3 -fPIC -DHAVE_HIDDEN -DPIC -c -o objs/inflate.o inflate.c
gcc -O3 -fPIC -DHAVE_HIDDEN -DPIC -c -o objs/inftrees.o inftrees.c
gcc -O3 -fPIC -DHAVE_HIDDEN -DPIC -c -o objs/trees.o trees.c
gcc -O3 -fPIC -DHAVE_HIDDEN -DPIC -c -o objs/zutil.o zutil.c
gcc -O3 -fPIC -DHAVE_HIDDEN -DPIC -c -o objs/compress.o compress.c
gcc -O3 -fPIC -DHAVE_HIDDEN -DPIC -c -o objs/uncompr.o uncompr.c
gcc -O3 -fPIC -DHAVE_HIDDEN -DPIC -c -o objs/gzclose.o gzclose.c
gcc -O3 -fPIC -DHAVE_HIDDEN -DPIC -c -o objs/gzlib.o gzlib.c
gcc -O3 -fPIC -DHAVE_HIDDEN -DPIC -c -o objs/gzread.o gzread.c
gcc -O3 -fPIC -DHAVE_HIDDEN -DPIC -c -o objs/gzwrite.o gzwrite.c
gcc -dynamiclib -install_name /usr/local/lib/libz.1.dylib -compatibility_version 1 -current_version 1.2.11 -O3 -fPIC -DHAVE_HIDDEN -o libz.1.2.11.dylib adler32.lo crc32.lo deflate.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo zutil.lo compress.lo uncompr.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo -lc
rm -f libz.dylib libz.1.dylib
ln -s libz.1.2.11.dylib libz.dylib
ln -s libz.1.2.11.dylib libz.1.dylib
gcc -O3 -DHAVE_HIDDEN -o examplesh example.o -L. libz.1.2.11.dylib
gcc -O3 -DHAVE_HIDDEN -o minigzipsh minigzip.o -L. libz.1.2.11.dylib註:執行後應會產生出
libz.a
檔
- make (製作)
- 下載
zlib
原始碼1
2Download page:https://github.com/brimworks/lua-zlib
Downlaod link:https://github.com/brimworks/lua-zlib/archive/master.zip
- 下載
- 解壓縮[
lua-zlib-master.zip
]1
$ unzip lua-zlib-master.zip
註:
lua-zlib-master.zip
解壓縮路徑自己選擇即可,不影響過程,這邊解壓縮至/Users/morose/Documents/Temp/tutorial/lua-zlib-master
。
- 解壓縮[
- 將第6步驟產生的
libz.a
複製至lua-zlib-master
目錄下。1
$ cp /Users/morose/Documents/Temp/tutorial/zlib-1.2.11/libz.a /Users/morose/Documents/Temp/tutorial/lua-zlib-master
- 將第6步驟產生的
- 進入到步驟
8
,lua-zlib-master
解壓縮後的目錄下。1
$ cd /Users/morose/Documents/Temp/tutorial/lua-zlib-master
- 進入到步驟
- 執行
gcc
編譯lua_zlib.o
檔1
$ gcc -O2 -c -o lua_zlib.o lua_zlib.c -I${luajit-2.1} -I${zlib-1.2.11}
註:${luajit-2.1} = 當初所編譯後的
openresty
的路徑下的/luajit/include/luajit-2.1
檔路徑;${zlib-1.2.11} =zlib-1.2.11
解壓縮的路徑。1
2# Command sample
$ gcc -O2 -c -o lua_zlib.o lua_zlib.c -I/Users/morose/Documents/Temp/tutorial/openresty/luajit/include/luajit-2.1 -I/Users/morose/Documents/Temp/tutorial/zlib-1.2.11註:執行後應會產生出
lua_zlib.o
檔
- 執行
- 執行
gcc
編譯zlib.so
1
$ gcc -shared -o zlib.so lua_zlib.o libz.a ${libluajit-5.1.a}
註:${libluajit-5.1.a} = 當初所編譯後的
openresty
的路徑下的/luajit/lib/libluajit-5.1.a
檔路徑1
2# Command sample
$ gcc -shared -o zlib.so lua_zlib.o libz.a /Users/morose/Documents/Temp/tutorial/openresty/luajit/lib/libluajit-5.1.a註:執行後應會產生出
zlib.so
檔
- 執行
- 將
zlib.so
複製進當初所編譯後的openresty/lualib/
下。1
$ cp /Users/morose/Documents/Temp/tutorial/lua-zlib-master/zlib.so /Users/morose/Documents/Temp/tutorial/openresty/lualib
- 將
- 恭喜已經整合完畢。
Windwos 用户
因文獻甚少這邊補上Windwos的相關文獻。
1 | windows上安裝lua-zlib |
補充
如果沒有整合zlib
在使用的時候Server
端有正常回應給gatway
,但是無法解壓回來,會顯示status 500 Internal Server Error
。
這補一張Postman
示範:
- Status 500
- Status 200
結語
這盡量依照手把手教學的想法寫完這篇文章,希望在使用OpenResty
整合lua zlib
上遇到有這方面需求的人可以得到幫助。原創文章撰寫不易,還請多多支持,謝謝。