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