基于OpenResty的弹性网关实践(一)
一、介紹
1. OpenResty簡介
官方地址:http://openresty.org/cn/
github地址:https://github.com/openresty/
OpenResty最佳實踐:https://moonbingbing.gitbooks.io/openresty-best-practices/content/
?
OpenResty是一個基于 Nginx 與 Lua 的高性能 Web 平臺,其內(nèi)部集成了大量精良的 Lua 庫、第三方模塊以及大多數(shù)的依賴項。用于方便地搭建能夠處理超高并發(fā)、擴(kuò)展性極高的動態(tài) Web 應(yīng)用、Web 服務(wù)和動態(tài)網(wǎng)關(guān)。
OpenResty通過匯聚各種設(shè)計精良的 Nginx模塊,從而將 Nginx有效地變成一個強(qiáng)大的通用 Web 應(yīng)用平臺。這樣,Web 開發(fā)人員和系統(tǒng)工程師可以使用 Lua 腳本語言調(diào)動Nginx支持的各種 C 以及 Lua 模塊,快速構(gòu)造出足以勝任 10K 乃至 1000K 以上單機(jī)并發(fā)連接的高性能 Web 應(yīng)用系統(tǒng)。
OpenResty 致力于將你的服務(wù)器端應(yīng)用完全運行于 Nginx 服務(wù)器中,充分利用 Nginx 的事件模型來進(jìn)行非阻塞 I/O 通信。不僅僅是和 HTTP 客戶端間的網(wǎng)絡(luò)通信是非阻塞的,與MySQL、PostgreSQL、Memcached 以及 Redis 等眾多遠(yuǎn)方后端之間的網(wǎng)絡(luò)通信也是非阻塞的。
OpenResty創(chuàng)始人:章亦春
江湖人稱“春哥”,編程之路起于看不懂而抄書,就算如今已是罕見的編程高手,春哥依然逢人大力推薦他的抄書學(xué)編程之法。
創(chuàng)立的OpenResty開源社區(qū),獲得了錘子科技一百萬的捐贈。
個人歷程:
-
江蘇鎮(zhèn)江人,1999年,初中的章亦春第一次接觸《C 語言程序設(shè)計》靠手抄自學(xué)編程,進(jìn)入江蘇大學(xué)后,一發(fā)不可收拾的迷戀上開源世界。
-
結(jié)束淘寶量子統(tǒng)計的工作后,全心從事 OpenResty 等開源項目的工作;
-
2017年,在美國創(chuàng)辦了 OpenResty Inc. 公司。
2. Lua簡介
lua教程
Lua 是一種輕量小巧的腳本語言,用標(biāo)準(zhǔn)C語言編寫并以源代碼形式開放, 其設(shè)計目的是為了嵌入應(yīng)用程序中,從而為應(yīng)用程序提供靈活的擴(kuò)展和定制功能。
二、Centos下的安裝
nginx的安裝可以參考如下鏈接:
Centos7安裝Nginx
1.安裝依賴庫
yum install readline-devel pcre-devel openssl-devel gcc2.下載及安裝OpenResty
wget https://openresty.org/download/openresty-1.9.15.1.tar.gz tar xvf openresty-1.9.15.1.tar.gz cd openresty-1.9.15.1./configure --with-luajit && make && make install3.安裝好的OpenResty
?
從上圖可以看到,openresty默認(rèn)安裝在/usr/local目錄下
三、OpenResty啟動
通過下述方式啟動Nginx。如果沒有任何輸出,說明啟動成功,-p 指定我們的項目目錄,-c 指定配置文件。
/usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.conf /usr/local/openresty/nginx/sbin/nginx -p 'pwd' -c /usr/local/openresty/nginx/conf/nginx.conf為openresty下的nginx建立軟鏈(非必需)
ln -s /usr/local/openresty/nginx/sbin/nginx /usr/sbin/nginx則可使用如下方式啟動
/usr/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.conf在瀏覽器中訪問:
?
四、Hello World
我們先來創(chuàng)建工作目錄
mkdir study cd study mkdir logs/ conf/下面是一個最簡化的 nginx.conf,在根目錄下新增 OpenResty 的content_by_lua指令,里面嵌入了ngx.say的代碼:
events {worker_connections 1024; } ? http {server {listen 8080;location / {content_by_lua 'ngx.say("hello, world")';}} }啟動OpenResty服務(wù)
/usr/sbin/nginx -p '/data/soft/study/' -c conf/nginx.conf沒有報錯的話,OpenResty 的服務(wù)就已經(jīng)成功啟動了。你可以打開瀏覽器,或者使用 curl 命令,來查看結(jié)果的返回:
[root@VM_0_7_centos soft]# curl -i 127.0.0.1:8080 HTTP/1.1 200 OK Server: openresty/1.9.15.1 Date: Tue, 22 Sep 2020 12:58:33 GMT Content-Type: text/plain Transfer-Encoding: chunked Connection: keep-alive ? hello, world我們剛才是把 Lua 代碼寫在 Nginx 配置文件中。不過,如果代碼越來越多,那代碼的可讀性和可維護(hù)性就無法保證了。
我們可以單獨創(chuàng)建一個工作目錄來維護(hù)lua代碼:
$ mkdir lua $ cat lua/hello.lua ngx.say("hello, world")然后修改 nginx.conf 的配置,把 content_by_lua_block 改為 content_by_lua_file:
pid logs/nginx.pid; events {worker_connections 1024; } ? http {server {listen 8080;location / {content_by_lua_file lua/hello.lua;}}}最后,重啟 OpenResty 的服務(wù)就可以了:
$ /usr/sbin/nginx -p '/data/soft/study/' -c conf/nginx.conf -s reload ? # 也可以強(qiáng)制殺進(jìn)程,然后在啟動 $ sudo kill -HUP `cat logs/nginx.pid` $ sudo fuser -k -n tcp 8080 #該命令可以強(qiáng)行Kill掉某個端口你可以使用 curl ,驗證是否返回了預(yù)期的結(jié)果。至于后面 Lua 代碼的變更,你就可以直接修改 hello.lua 這個文件,而不是 nginx.conf 了。
思考:
1.content_by_lua_file lua/hello.lua; 里面寫的是相對路徑,那么 OpenResty 是如何找到這個 Lua 文件的?
如果原本給出的是相對路徑,那么 OpenResty 在啟動時,會把 OpenResty 啟動的命令行參數(shù)中的 -p PATH 作為前綴,將相對路徑拼接為絕對路徑。這樣,自然就可以順利找到 Lua 文件。
2.Lua 代碼內(nèi)容的變更,需要重啟 OpenResty 服務(wù)才會生效,這樣顯然不方便調(diào)試,那么有沒有什么即時生效的方法呢?
Lua 代碼在第一個請求時會被加載,并默認(rèn)緩存起來。所以在你每次修改 Lua 源文件后,都必須重新加載 OpenResty 才會生效。其實,在 nginx.conf 中關(guān)閉 lua_code_cache 就能避免重新加載,這一點你可以自己試試看。不過,特別需要注意的是,這種方法只能臨時用于開發(fā)和調(diào)試,如果是線上部署,一定要記得打開緩存,否則會非常影響性能。
lua_code_cache off; #關(guān)閉緩存 lua_code_cache on; ?#開啟緩存3.如何把 lua 代碼所在的文件夾,加入到 OpenResty 的查找路徑中呢?
OpenResty 提供了 lua_package_path 指令,可以設(shè)置 Lua 模塊的查找路徑。針對上面的例子,我們可以把 lua_package_path 設(shè)置為 $prefix/lua/?.lua;;
-
$prefix就是啟動參數(shù)中的 -p PATH;
-
/lua/?.lua表示 lua 目錄下所有以 .lua 作為后綴的文件;
-
最后的兩個分號,則代表內(nèi)置的代碼搜索路徑。
總結(jié)
以上是生活随笔為你收集整理的基于OpenResty的弹性网关实践(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql不同count的性能分析
- 下一篇: 基于OpenResty的弹性网关实践(二