nginx_lua能做什么

lua是一個(gè)巴西人設(shè)計(jì)的小巧的腳本語言,它的設(shè)計(jì)目的是為了能夠嵌入到應(yīng)用程序中,從而為應(yīng)用程序提供靈活的擴(kuò)展和定制功能。

nginx_lua能做什么

淘寶的agentzh和chaoslawful開發(fā)的ngx_lua模塊通過將lua解釋器集成進(jìn)nginx。這個(gè)模塊會(huì)在每個(gè)nginx的worker_process中啟動(dòng)一個(gè)lua解釋器,在nginx處理http請(qǐng)求的11個(gè)階段中,你可以在其中的多個(gè)階段用lua代碼處理請(qǐng)求。能夠采用lua腳本實(shí)現(xiàn)業(yè)務(wù)邏輯,因?yàn)閘ua的緊湊、高速以及內(nèi)建協(xié)程,所以在保證高并發(fā)服務(wù)能力的同一時(shí)候極大地減少了業(yè)務(wù)邏輯實(shí)現(xiàn)成本。

實(shí)例:解決服務(wù)穩(wěn)定性

這里的思路很簡單,我們會(huì)在error_page指令被執(zhí)行后,用lua代碼來接受參數(shù),處理邏輯部分,最終會(huì)返回前端和用php處理看起來一致的內(nèi)容。

部分代碼如下:

nginx_conf:

location ~* ^/api/.+/.+$ {     error_page 500 502 503 504 =200 @jump_to_error_page_api;      rewrite ^/api/(.+)/(.+)$ /index.php?_c=$1&_a=$2 break;     root /home/ligang/demo/src/api/;      fastcgi_pass 127.0.0.1:9000;     include fastcgi.conf;     fastcgi_connect_timeout 5s;     fastcgi_send_timeout 5s;     fastcgi_read_timeout 5s;     fastcgi_intercept_errors on; }  location @jump_to_error_page_api {     lua_code_cache on;    set $prj_home " /home/ligang/demo";      content_by_lua_file  /home/ligang/demo/src/glue/error_page_api.lua; }

這里大家看到,當(dāng)請(qǐng)求出現(xiàn)50x錯(cuò)誤時(shí),會(huì)跳到location jump_to_error_page_api中,在這里面,content_by_lua_file指令會(huì)在content處理階段啟動(dòng)指定好的lua腳本(這里是error_page_api.lua)來處理請(qǐng)求。

我們?cè)倏聪耹ua腳本中都做了什么:

lua示例代碼:

ngx.header['Content-Type'] = 'text/html' prj_home     = ngx.var.prj_home request_args = ngx.req.get_uri_args()  local controller = request_args['_c'] local action     = request_args['_a']  if 'demo' == controller then     processErrorPageApiDemo(action) else     ngx.print('invalid controller') end ......

這里大家可以看到,我們可以在lua腳本中接受請(qǐng)求參數(shù),做和php一樣的邏輯,最終輸出前端需要的正確的內(nèi)容。

目前這套機(jī)制我們已經(jīng)用在我們這邊的一個(gè)重要用戶頁面上,目前都沒有收到用戶反饋說頁面打不開,出現(xiàn)錯(cuò)誤頁這種,效果很是明顯。

更多Nginx相關(guān)技術(shù)文章,請(qǐng)?jiān)L問Nginx使用教程欄目進(jìn)行學(xué)習(xí)!?

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊12 分享