OpenResty簡介
OpenResty 是一個(gè)基于 Nginx 與 Lua 的高性能 Web 平臺(tái)荞胡,其內(nèi)部集成了大量精良的 Lua 庫、第三方模塊以及大多數(shù)的依賴項(xiàng)了嚎。用于方便地搭建能夠處理超高并發(fā)泪漂、擴(kuò)展性極高的動(dòng)態(tài) Web 應(yīng)用、Web 服務(wù)和動(dòng)態(tài)網(wǎng)關(guān)歪泳。
Lua簡介
Lua是一個(gè)簡潔萝勤、輕量、可擴(kuò)展的程序設(shè)計(jì)語言呐伞,其設(shè)計(jì)目的是為了嵌入應(yīng)用程序中敌卓,從而為應(yīng)用程序提供靈活的擴(kuò)展和定制功能。Lua由標(biāo)準(zhǔn)C編寫而成伶氢,代碼簡潔優(yōu)美趟径,幾乎在所有操作系統(tǒng)和平臺(tái)上都可以編譯瘪吏,運(yùn)行。
OpenResty安裝
1.安裝依賴庫
yum install readline-devel pcre-devel openssl-devel gcc
2.下載及安裝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 install
激活LuaJIT
組件被用于構(gòu)建 OpenResty蜗巧。所有的組件可以被激活或禁止掌眠。 大部組件默認(rèn)是激活的,也有部件不是幕屹。 LuaJIT蓝丙、 DrizzleNginxModule、PostgresNginxModule和IconvNginxModule 默認(rèn)是沒有激活的望拖。您需要通過以下選項(xiàng)在編譯 OpenResty的時(shí)候?qū)⑺鼈兏髯约せ睿?--with-luajit渺尘、 --with-http_drizzle_module、 --with-http_postgres_module和 --with-http_iconv_module 说敏。
安裝好的OpenResty
從上圖可以看到沧烈,openresty在/usr/local目錄下
OpenResty啟動(dòng)
通過下述方式啟動(dòng)Nginx。如果沒有任何輸出像云,說明啟動(dòng)成功锌雀,-p 指定我們的項(xiàng)目目錄,-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
則可使用如下方式啟動(dòng)
/usr/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.conf
在瀏覽器中訪問:
OpenResty配置Lua
由于原生的Nginx日志沒有resp_body這一選項(xiàng)腋逆,通過在nginx.conf中添加Lua腳本的方式定義resp_body。
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format log_resp_body '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$request_time $bytes_sent $request_length "$request_body" "$resp_body"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
access_log logs/access.index.log log_resp_body;
lua_need_request_body on;
set $resp_body "";
body_filter_by_lua '
local resp_body = string.sub(ngx.arg[1], 1, 1000)
ngx.ctx.buffered = (ngx.ctx.buffered or "") .. resp_body
if ngx.arg[2] then
ngx.var.resp_body = ngx.ctx.buffered
end
';
location / {
root html;
index index.html index.htm;
}
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
檢測(cè)Nginx配置是否正確
/usr/sbin/nginx -t
重啟Nginx
/usr/sbin/nginx -s reload
驗(yàn)證Lua配置是否成功
tail -f access.log
tail -f access.index.log
參考資料:
OpenResty
OpenResty中文站
nginx-lua
lua-nginx-module
20160615更正:
實(shí)踐證明侈贷,上面body_filter_by_lua中的代碼存在bug惩歉,可通過如下方式更正:
body_filter_by_lua '
local maxlen = 1000
ngx.ctx.buffered = ngx.ctx.buffered or ""
if #ngx.ctx.buffered < maxlen then
ngx.ctx.buffered = ngx.ctx.buffered .. string.sub(ngx.arg[1], 1, maxlen - #ngx.ctx.buffered)
end
if ngx.arg[2] then
ngx.var.resp_body = ngx.ctx.buffered
end
';