OpenResty - 第一章 | OpenResty 介绍/編譯安裝
前言
公司在對一些項目進行重構,使用了很多的平台、技術、架構、語言,而在使用開發上就會遇到很多環境安裝上的問題;當然這一切還是歸咎於不熟悉。
原先透過官方介紹的Mac OS X (macOS)
用户安裝OpenResty
,可以簡單的啟用,但是遇到的問題是不知道如何指定其讀取專案中的nginx.conf
檔和其他目錄位置(預設會讀取/usr/local/etc/openresty/
)。故產生了此篇文章,針對Mac OS X (macOS)
環境透過編譯的方式安裝,並且透過指令動專案。
註:對
OpenRestry
不熟悉固使用編譯的方式解決,相信一定有很多大神也更多簡單的方法,敬請不吝賜教。
介紹
OpenResty
是基於nginx
的Web
平台,可以使用其LuaJIT
引擎運行Lua
腳本。該軟件由張一春創建。它最初是在2011
年前由Taobao.com
贊助的,在2012
年至2016
年期間主要由Cloudflare
支持。自2017
年以來,它主要受到OpenResty
軟件基金會和OpenResty Inc.
的支持。
OpenResty
是一個強大的Web
應用服務器,Web
開發人員可以使用Lua
腳本語言調動nginx
支持的各種C
以及Lua
模塊,更主要的是在性能方面,OpenResty
可以快速構造出足以勝任10K
以上並發連接響應的超高性能Web
應用系統。
360
、UPYUN
、阿里雲、新浪、騰訊網、去哪兒網、酷狗音樂等都是OpenResty
的深度用戶。
問題描述
透過Homebrew
安裝的OpenRestry
,預設會去參考原始目錄和設定檔(類似:/usr/local/etc/openresty/nginx.conf
),這樣的情況下,自己的專案程式、設定檔須要複製一份至該目錄下,啟動後才可正確抓取設定和程式,雖然還是可以使用,但是在開發上並沒有這麼直覺方便。
解決方案
官方有提到可以透過編譯的方式構建一份OpenRestry。
但是這篇文章並沒有真的手把手教學(Mac OS X (macOS)),例如--with-ld-opt='-L/lib'
,下方將會有完整的安裝過程教學。
構建 OpenResty
以下是針對Mac OS
環境的教學:
- 安裝Homebrew。
- 註:如已經安裝可跳過此步驟。
- 使用
Homebrew
將這些庫perl
、pcre
、openssl
安裝在你的電腦之中。
- 檢查
perl
是否有安裝1
2
3
4
5
6
7
8
9
10
11
12$ perl -v
This is perl 5, version 32, subversion 0 (v5.32.0) built for darwin-thread-multi-2level
Copyright 1987-2020, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page. - 檢查
pcre
是否有安裝1
2$ ls -l /usr/local/opt/pcre
lrwxr-xr-x 1 morose admin 19 10 21 11:00 /usr/local/opt/pcre -> ../Cellar/pcre/8.44 - 檢查
openssl
是否有安裝1
2$ openssl version
LibreSSL 2.8.3 - 檢查
lua
是否有安裝1
2$ lua -v
Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio - 如未安裝可透過此指令安裝(已安裝請忽略)
1
2
3
4
5$ brew update
$ brew install perl
$ brew install pcre
$ brew install openssl
$ brew install lua
- 使用
- 下載
OpenResty
原始碼1
2Download page:https://openresty.org/cn/download.html
Downlaod link:https://openresty.org/download/openresty-1.19.3.1.tar.gz註:文章撰寫時最新版為:
openresty-1.19.3.1
- 下載
- 解壓縮[
openresty-1.19.3.1.tar.gz
]1
$ tar -xzvf openresty-1.19.3.1.tar.gz
註:
openresty-1.19.3.1.tar.gz
解壓縮路徑自己選擇即可,不影響過程,這邊解壓縮至/Users/morose/Documents/Temp/tutorial/openresty-1.19.3.1
。
- 解壓縮[
- 準備構建
OpenResty
的目錄1
$ mkdir /Users/morose/Documents/Temp/tutorial/openresty
註:該目錄會是構建和執行
OpenResty
的主要目錄,建議放在自己規劃好的路徑。
- 準備構建
- 進入到步驟
4
,解壓縮後的目錄下。1
$ cd /Users/morose/Documents/Temp/tutorial/openresty-1.19.3.1
- 進入到步驟
- ./configure (配置)
註:/Users/morose/Documents/Temp/tutorial/openresty 為定義編譯位置,對應第
5
步驟建立的目錄。
因為是使用Homebrew安裝pcre、openssl,在沒有設定環境變數的情況下,需要指定–with-cc-opt和–with-ld-opt。
說明:–with-cc-opt=parameters — 設置將會添加額外參數到CFLAGS變量中;–with-ld-opt=parameters — 設置將會在鏈接(linking)過程中使用的額外參數。output:1
2
3
4
5
6
7$ ./configure --prefix=/Users/morose/Documents/Temp/tutorial/openresty \
--with-cc-opt="-I/usr/local/opt/openssl/include/ -I/usr/local/opt/pcre/include/" \
--with-ld-opt="-L/usr/local/opt/openssl/lib/ -L/usr/local/opt/pcre/lib/" \
--with-pcre-jit \
--with-ipv6 \
--without-http_redis2_module \
--with-http_iconv_module1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25# 以上省略
Configuration summary
+ using system PCRE library
+ using system OpenSSL library
+ using system zlib library
nginx path prefix: "/Users/morose/Documents/Temp/tutorial/openresty/nginx"
nginx binary file: "/Users/morose/Documents/Temp/tutorial/openresty/nginx/sbin/nginx"
nginx modules path: "/Users/morose/Documents/Temp/tutorial/openresty/nginx/modules"
nginx configuration prefix: "/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf"
nginx configuration file: "/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf/nginx.conf"
nginx pid file: "/Users/morose/Documents/Temp/tutorial/openresty/nginx/logs/nginx.pid"
nginx error log file: "/Users/morose/Documents/Temp/tutorial/openresty/nginx/logs/error.log"
nginx http access log file: "/Users/morose/Documents/Temp/tutorial/openresty/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
./configure: warning: the "--with-ipv6" option is deprecated
cd ../..
Type the following commands to build and install:
make
make install註:輸出過長僅放最後部分訊息。完整輸出configure-output.txt.zip
- ./configure (配置)
- make (製作)output:
1
$ make
1
2
3
4
5
6
7# 以上省略
-L/Users/morose/Documents/Temp/tutorial/openresty-1.19.3.1/build/luajit-root/Users/morose/Documents/Temp/tutorial/openresty/luajit/lib -L/Users/morose/Documents/Temp/tutorial/openresty-1.19.3.1/build/luajit-root/Users/morose/Documents/Temp/tutorial/openresty/luajit/lib -Wl,-rpath,/Users/morose/Documents/Temp/tutorial/openresty/luajit/lib -L/usr/local/opt/openssl/lib/ -L/usr/local/opt/pcre/lib/ -Wl,-u,_pcre_version -liconv -L/Users/morose/Documents/Temp/tutorial/openresty-1.19.3.1/build/luajit-root/Users/morose/Documents/Temp/tutorial/openresty/luajit/lib -lluajit-5.1 -lm -ldl -pagezero_size 10000 -image_base 100000000 -L/Users/morose/Documents/Temp/tutorial/openresty-1.19.3.1/build/luajit-root/Users/morose/Documents/Temp/tutorial/openresty/luajit/lib -lluajit-5.1 -lm -ldl -pagezero_size 10000 -image_base 100000000 -lpcre -lssl -lcrypto -lz
sed -e "s|%%PREFIX%%|/Users/morose/Documents/Temp/tutorial/openresty/nginx|" \
-e "s|%%PID_PATH%%|/Users/morose/Documents/Temp/tutorial/openresty/nginx/logs/nginx.pid|" \
-e "s|%%CONF_PATH%%|/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf/nginx.conf|" \
-e "s|%%ERROR_LOG_PATH%%|/Users/morose/Documents/Temp/tutorial/openresty/nginx/logs/error.log|" \
< docs/man/nginx.8 > objs/nginx.8註:輸出過長僅放最後部分訊息。完整輸出make-output.txt.zip
註:2023/05/22 補充。
警告問題:<因為 macOS 版本升級後產生的警告>1
2ld: warning: Linking with PIE, -image_base will be ignored
ld: warning: dylib (/Users/morose/Downloads/openresty-1.21.4.1/build/luajit-root/Users/morose/Documents/opt/openresty/luajit/lib/libluajit-5.1.dylib) was built for newer macOS version (12.6) than being linked (12.0)註:該警告目前判定不影響,可以忽略。
可能解決的方式:<自己試驗過無效果,但是可以參考>
使用以下指令觀看InstalledDir
位置,可以看到這邊指定CommandLineTools
。可以透過以下指令變更為:1
2
3
4
5$ gcc -v
Apple clang version 14.0.0 (clang-1400.0.29.202)
Target: x86_64-apple-darwin21.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin1
2
3
4
5
6$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
$ gcc -v
Apple clang version 14.0.0 (clang-1400.0.29.202)
Target: x86_64-apple-darwin21.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin參考:https://blog.arturofm.com/solve-warning-was-built-for-newer-macos-version-xcode/
- make (製作)
- make install (安裝)output:
1
$ make install
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
41
42
43# 以上省略
test -d '/Users/morose/Documents/Temp/tutorial/openresty/nginx/sbin' \
|| mkdir -p '/Users/morose/Documents/Temp/tutorial/openresty/nginx/sbin'
test ! -f '/Users/morose/Documents/Temp/tutorial/openresty/nginx/sbin/nginx' \
|| mv '/Users/morose/Documents/Temp/tutorial/openresty/nginx/sbin/nginx' \
'/Users/morose/Documents/Temp/tutorial/openresty/nginx/sbin/nginx.old'
cp objs/nginx '/Users/morose/Documents/Temp/tutorial/openresty/nginx/sbin/nginx'
test -d '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf' \
|| mkdir -p '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf'
cp conf/koi-win '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf'
cp conf/koi-utf '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf'
cp conf/win-utf '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf'
test -f '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf/mime.types' \
|| cp conf/mime.types '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf'
cp conf/mime.types '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf/mime.types.default'
test -f '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf/fastcgi_params' \
|| cp conf/fastcgi_params '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf'
cp conf/fastcgi_params \
'/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf/fastcgi_params.default'
test -f '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf/fastcgi.conf' \
|| cp conf/fastcgi.conf '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf'
cp conf/fastcgi.conf '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf/fastcgi.conf.default'
test -f '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf/uwsgi_params' \
|| cp conf/uwsgi_params '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf'
cp conf/uwsgi_params \
'/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf/uwsgi_params.default'
test -f '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf/scgi_params' \
|| cp conf/scgi_params '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf'
cp conf/scgi_params \
'/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf/scgi_params.default'
test -f '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf/nginx.conf' \
|| cp conf/nginx.conf '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf/nginx.conf'
cp conf/nginx.conf '/Users/morose/Documents/Temp/tutorial/openresty/nginx/conf/nginx.conf.default'
test -d '/Users/morose/Documents/Temp/tutorial/openresty/nginx/logs' \
|| mkdir -p '/Users/morose/Documents/Temp/tutorial/openresty/nginx/logs'
test -d '/Users/morose/Documents/Temp/tutorial/openresty/nginx/logs' \
|| mkdir -p '/Users/morose/Documents/Temp/tutorial/openresty/nginx/logs'
test -d '/Users/morose/Documents/Temp/tutorial/openresty/nginx/html' \
|| cp -R docs/html '/Users/morose/Documents/Temp/tutorial/openresty/nginx'
test -d '/Users/morose/Documents/Temp/tutorial/openresty/nginx/logs' \
|| mkdir -p '/Users/morose/Documents/Temp/tutorial/openresty/nginx/logs'
mkdir -p /Users/morose/Documents/Temp/tutorial/openresty/site/lualib /Users/morose/Documents/Temp/tutorial/openresty/site/pod /Users/morose/Documents/Temp/tutorial/openresty/site/manifest
ln -sf /Users/morose/Documents/Temp/tutorial/openresty/nginx/sbin/nginx /Users/morose/Documents/Temp/tutorial/openresty/bin/openresty註:輸出過長僅放最後部分訊息。完整輸出makeInstall-output.txt.zip
- make install (安裝)
- 完成後
OpenResty
目錄結構註:主要會使用的是
/Users/morose/Documents/Temp/tutorial/openresty/bin/openresty
檔。1
2
3
4
5
6
7
8
9
10
11/Users/morose/Documents/Temp/tutorial/openresty
├── COPYRIGHT
├── bin
│ ├── md2pod.pl
│ ├── nginx-xml2pod
│ ├── openresty -> /Users/morose/Documents/Temp/tutorial/openresty/nginx/sbin/nginx
│ ├── opm
│ ├── resty
│ ├── restydoc
│ └── restydoc-index
# 以下省略註:輸出過長僅放最後部分訊息。完整輸出openresty-tree.txt.zip
- 完成後
啟動/關閉
這邊簡單的示範使用OpenResty
指定專案做啟動和關閉。
首先會先建立一個簡單的HelloWorld
專案。
- 建立
openrest-test
目錄1
$ mkdir /Users/morose/Documents/Temp/tutorial/demo
- 建立
- 建立
conf
和logs
目錄1
2$ mkdir /Users/morose/Documents/Temp/tutorial/demo/conf/
$ mkdir /Users/morose/Documents/Temp/tutorial/demo/logs/
- 建立
- 建立
nginx.conf
設定檔於conf
目錄下1
$ touch /Users/morose/Documents/Temp/tutorial/demo/conf/nginx.conf
- 建立
- 編輯
nginx.conf
,將下方設定貼入並儲存1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19worker_processes 1; #nginx worker 數量
error_log logs/error.log; #指定錯誤日誌文件路徑
events {
worker_connections 1024;
}
http {
server {
#監聽端口,若你的6699端口已經被佔用,則需要修改
listen 6699;
location / {
default_type text/html;
content_by_lua_block {
ngx.say("HelloWorld")
}
}
}
}註:至此簡單的project已經準備完畢。
- 編輯
- 至編譯後的
OpenResty
的bin
目錄1
$ cd /Users/morose/Documents/Temp/tutorial/openresty/bin
- 至編譯後的
- 啟動
OpenResty
並指定啟動專案路徑1
$ ./openresty -p /Users/morose/Documents/Temp/tutorial/demo
註:
/Users/morose/Documents/Temp/tutorial/demo
為專案目錄。
提示:在啟動過OpenResty
後,可以再去看看demo
目錄下的變化。
- 啟動
- 確認是否已啟動output:
1
$ ps -ef | grep openresty
1
2501 29498 1 0 12:20下午 ?? 0:00.00 nginx: master process ./openresty -p /Users/morose/Documents/Temp/tutorial/demo
501 29518 29204 0 12:20下午 ttys008 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox openresty註:可以看到
nginx: master process ./openresty -p /Users/morose/Documents/Temp/tutorial/demo
啟動,且-p 到指定目錄。
- 確認是否已啟動
- 瀏覽器瀏覽
http://127.0.0.1:6699
output:1
HelloWorld
註:表示成功連接到location /,且輸出”HelloWorld”
- 瀏覽器瀏覽
- 關閉
OpenResty
指定的專案路徑1
$ ./openresty -s stop -p /Users/morose/Documents/Temp/tutorial/demo
- 關閉
結語
在這盡量依照手把手教學的想法寫完這篇文章,希望在使用OpenResty
上遇到有這方面需求的人可以得到幫助。原創文章撰寫不易,還請多多支持,謝謝。
註:以上參考了
OpenResty