OpenResty 是一個基於 Nginx 與 Lua 的高性能 Web 平臺,其內部集成了大量精良的 Lua 庫、第三方模塊以及大多數的依賴項。用於方便地搭建可以處理超高併發、擴展性極高的動態 Web 應用、Web 服務和動態網關。html
Lua是一個簡潔、輕量、可擴展的程序設計語言,其設計目的是爲了嵌入應用程序中,從而爲應用程序提供靈活的擴展和定製功能。Lua由標準C編寫而成,代碼簡潔優美,幾乎在全部操做系統和平臺上均可以編譯,運行。nginx
1.安裝依賴庫git
yum install readline-devel pcre-devel openssl-devel gcc
2.下載及安裝OpenRestygithub
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瀏覽器
組件被用於構建 OpenResty。全部的組件能夠被激活或禁止。 大部組件默認是激活的,也有部件不是。 LuaJIT、 DrizzleNginxModule、PostgresNginxModule和IconvNginxModule 默認是沒有激活的。您須要經過如下選項在編譯 OpenResty的時候將它們各自激活, --with-luajit、 --with-http_drizzle_module、 --with-http_postgres_module和 --with-http_iconv_module 。併發
安裝好的OpenRestyapp
從上圖能夠看到,openresty在/usr/local目錄下高併發
經過下述方式啓動Nginx。若是沒有任何輸出,說明啓動成功,-p 指定咱們的項目目錄,-c 指定配置文件。post
/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
在瀏覽器中訪問:
因爲原生的Nginx日誌沒有resp_body這一選項,經過在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; } } }
檢測Nginx配置是否正確
/usr/sbin/nginx -t
重啓Nginx
/usr/sbin/nginx -s reload
驗證Lua配置是否成功
tail -f access.log
tail -f access.index.log
參考資料:
OpenResty
OpenResty中文站
nginx-lua
lua-nginx-module
實踐證實,上面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 ';