第1页
ApplicationofLuainNginx
Lua在Nginx中的应用
☺agentzh@gmail.com☺
章亦春(agentzh)
2015.04
第8页
☺No"callbackhell".
☺100%nonblockingIO
没有“回调地狱”。 100%非阻塞I/O.
第13页
☺openresty.org
第14页
☺qa.openresty.org
OpenResty测试集群
第16页
$./dispatcherrt170a'linuxx86_64'ngx_echongx_lua Requiresatleast5machines. bucket1:tlngx_lua(264min) bucket2:twvngx_luatwngx_luatrvngx_echothngx_echo(167min) bucket3:trvngx_luathngx_luatngx_luatvngx_echotrngx_echo(162min) bucket4:tvngx_luatlngx_echotongx_luathvngx_echotngx_echo(145min) bucket5:thvngx_luatrngx_luatwvngx_echotwngx_echotongx_echo(90min) ...
第18页
☺LuaSSL ☺LuaCDN ☺LuaWAF(LuaWeb防火墙)
第19页
☺Lightthreads
轻量级线程
第21页
localthread_A,err= ngx.thread.spawn(func1) thread_Akeepsrunningasynchronously inthebackgroundofthecurrent "lightthread".
第22页
localok,res1,res2= ngx.thread.wait(thread_A,thread_B)
第23页
localok,err=ngx.thread.kill(thread_A)
第24页
☺luarestywebsocket
WebSocket服务器和客户端
第25页
localserver=require"resty.websocket.server" localwb,err=server:new{ timeout=5000,inmilliseconds max_payload_len=65535, } localdata,typ,err=wb:recv_frame() localbytes,err=wb:send_text("Helloworld")
第26页
☺fullduplexcosockets
全双工的基于协程的套接字
第27页
☺SSL/TLScosocket
第28页
localsock=ngx.socket.tcp() localok,err=sock:connect("www.cloudflare.com", 443) ok,err=sock:sslhandshake( false,disableSSLsession "www.cloudflare.com",SNIname trueverifyeverything )
第29页
☺ssl_certificate_by_lua
纯Lua动态服务SSL证书和私钥
第31页
ssl_certificate_by_lua' localssl=require"ngx.ssl" localcert_chain,priv_key=my_load_data() assert(ssl.set_der_cert(cert_chain)) assert(ssl.set_der_priv_key(priv_key)) ';
第33页
☺ssl_balancer_by_lua
纯Lua编写Nginx全动态负载均衡器
第34页
upstream{ server0.0.0.0; balancer_by_lua' localbalancer=require"ngx.balancer" localhost,port=my_load_backend_addr() assert(balancer.set_cur_peer(host,port)) '; }
第35页
☺nginxsystemtaptoolkit
基于Systemtap的Nginx工具箱
第37页
☺stapxx(stap++)
Systemtap加上一点宏魔法……
第39页
☺HowCPUtimeisspentinsideLuaJIT
CPU时间在LuaJIT内部是如何分布的
第40页
$ljvmstates.sxxx5521argtime=60 Starttracing5521(/usr/local/nginxwaf/sbin/nginxwaf) Pleasewaitfor60seconds... Observed1203Luarunningsamplesandignored49unrelatedsamples. Compiled:64%(779samples) CCode(byinterpretedLua):14%(172samples) Interpreted:13%(158samples) GarbageCollector(compiled):3%(48samples) GarbageCollector(notcompiled):3%(42samples) Traceexiting:0%(4samples)
第41页
☺Whenannginxworker'sCPUistoohigh...
当nginxworker进程的CPU太高时……
第43页
#assumingonenginxworkerprocesshasthepid19647. $ngxrps.sxxx19647 WARNING:Tracingprocess19647. HitCtrlCtoend. [1376939543]300req/sec [1376939544]235req/sec [1376939545]235req/sec [1376939546]166req/sec [1376939547]238req/sec [1376939548]234req/sec ^C
第44页
$./samplebtp19647t20u>a.bt WARNING:Tracing19647(/opt/nginx/sbin/nginx)inuserspaceonly... WARNING:Time'sup.Quittingnow...(itmaytakeawhile)
第45页
#usingBrendanGregg'sflamegraphtools: $stackcollapsestap.pla.bt>a.cbt $flamegraph.pla.cbt>a.svg
第47页
#assumingthenginxworkerprocesspidis19647: $ljluastacks.sxxargtime=20skipbadvarsx19647>a.bt Starttracing19647(/opt/nginx/sbin/nginx) Pleasewaitfor20seconds
第48页
#usingBrendanGregg'sflamegraphtools: $stackcollapsestap.pla.bt>a.cbt $flamegraph.pla.cbt>a.svg
第50页
☺Whenannginxworker'sCPUislow andthethroughputislow...
当nginxworker进程的CPU很低, 同时吞吐量上不去的时候……
第52页
☺offCPUflamegraphs fromthesamplebtoffcputool
第56页
☺nginxgdbutils
基于GDB的Nginx工具箱
第58页
(gdb)lbt C:ngx_http_lua_socket_tcp_receive @.../lib/resty/mysql.lua:191 @.../lib/resty/mysql.lua:530 content_by_lua:10
第59页
(gdb)lbtfull C:ngx_http_lua_socket_tcp_receive @.../lib/resty/mysql.lua:191 local"self": table(0x40f181a8) local"sock": table(0x40f181b0) @.../lib/resty/mysql.lua:530 local"self": table(0x40f18148) local"opts": table(0x40f18150) ...
第60页
(gdb)lgc Thecurrentmemorysize(allocatedbyGC):898960bytes
第61页
(gdb)lgcstat 15172strobjects:max=2956,avg=51,min=18,sum=779126 987upvalobjects:max=24,avg=24,min=24,sum=23688 104threadobjects:max=1648,avg=1622,min=528,sum=168784 431protoobjects:max=226274,avg=2234,min=78,sum=963196 952funcobjects:max=144,avg=30,min=20,sum=28900 446traceobjects:max=23400,avg=1857,min=160,sum=828604 2965cdataobjects:max=4112,avg=17,min=12,sum=51576 18961tabobjects:max=24608,avg=207,min=32,sum=3943256 9udataobjects:max=176095,avg=39313,min=32,sum=353822
第62页
☺Anyquestions?☺
欢迎提问
第63页
A