3. NGINX ("ENGINE-X")
High performance HTTP, POP/IMAP and reverse proxy server.
Started in 2002 by Igor Sysoev, public in 2004.
Entirely written in C.
Hosts nearly 12.18% of active sites across all domains.
Nginx.com in 2011.
5. $p ax|ge nix
s u rp gn
ro 339..nix mse poes/p/gn/bnnix
ot 12 . gn: atr rcs otnixsi/gn
ww 330..nix wre poes
w 13 . gn: okr rcs
6.
7. MASTER PROCESS
reading and validating configuration
creating, binding and closing sockets
starting, terminating and maintaining the configured number of w r e
okr
processes
re-opening log files
compiling embedded Perl scripts
8. WORKER PROCESS
Do all important stuff
Handle connection from clients
Reverse Proxy and Filtering functionalities
21. FUNCTIONAL MODULES
Read from / Write to Network and Storage
Transform Content
Outbound Filtering
Server Side Includes
Upstream Server communication
...etc
25. LUA NGINX MODULE
https://github.com/chaoslawful/lua-nginx-module/
Created by TaoBao.com Engineers
High concurrent and non-blocking request processing
Programs can be written in the plain-old sequential way
Nginx takes care of I/O operations and Lua Nginx Module restore the
context and resume the program logic
26. LUA NGINX MODULE
https://github.com/chaoslawful/lua-nginx-module
Introduces directives for running Lua inside Nginx
Exposes the Nginx environment to Lua via an Api
It's fast
Is even faster when compiled with LUA JIT(Just in Time Compiler)
28. DIRECTIVES
Configuration directives serve as gateways to the Lua API within the
nginx.conf file.
cnetb_u LASRP_TIG
otn_yla U_CITSRN
rwieb_u LASRP_TIG
ert_yla U_CITSRN
acs_ylaLASRP_TIG
cesb_u U_CITSRN
cnetb_u_iePT_OLASRP_IE
otn_ylafl AHT_U_CITFL
rwieb_u_iePT_OLASRP_IE
ert_ylafl AHT_U_CITFL
acs_ylafl PT_OLASRP_IE
cesb_u_ie AHT_U_CITFL
Unless you set l a c d _ a h to o f modules will be loaded once on the first request.
u_oecce f ,
29. NGX PACKAGE
Nginx Environment is exposed via n x
g package
nxagulag
g.r.r_r
nxvrVRAL_AE
g.a.AIBENM
nxhae.EDRATIUE
g.edrHAE_TRBT
nxcx
g.t
30. HELLO WORLD !
lcto /el-srb-u {
oain hloue-yla
dfuttp "etpan;
eal_ye tx/li"
cnetb_u '
otn_yla
nxsy"el," nxvragnm,""
g.a(Hlo , g.a.r_ae !)
';
}
lcto /el-srb-gn {
oain hloue-ynix
eh "el,$r_ae!;
co Hlo agnm "
}
$cr ht:/oahs/el-srb-u?aeDvnap
ul tp/lclothloue-ylanm=eISma
Hlo Dvnap !
el, eISma
$cr ht:/oahs/el-srb-gn?aeDvnap
ul tp/lclothloue-ynixnm=eISma
Hlo Dvnap !
el, eISma
31. NGINX VARS
lcto /csignixag {
oain aesn-gn-rs
st$is 3;
e frt 5
st$eod6;
e scn 5
stb_u $u '
e_yla sm
rtr nxvrfrt+nxvrscn
eun g.a.is g.a.eod
';
eh "h smi $u"
co Te u s sm;
}
$cr ht:/oahs/csignixag
ul tp/lclotaesn-gn-rs
Tesmi 9
h u s 9
32. NGINX SUBREQUESTS
lcto /u-urqet {
oain lasbeuss
cnetb_u '
otn_yla
lclrsos =nxlcto.atr(/el-srb-gn?ae
oa epne g.oaincpue"hloue-ynixnm=
Dvnap"
eISma)
i rsos.tts> 50te
f epnesau = 0 hn
nxei(epnesau)
g.xtrsos.tts
ed
n
nxsau =rsos.tts
g.tts epnesau
nxsyrsos.oy
g.a(epnebd)
';
}
$cr ht:/oahs/u-urqet
ul tp/lclotlasbeuss
Hlo Dvnap !
el, eISma
33. NON BLOCKING I/O SUBREQUESTS
lcto /nltc-nrmn {
oain aayisiceet
cnetb_u '
otn_yla
lclrsos =nxlcto.atr(/ei"
oa epne g.oaincpue"rds,
{rs={m ="nr,ky=nxvragln})
ag cd ic" e g.a.r_ik}
nxsy"nrmne t :,nxvragln)
g.a(Iceetd o " g.a.r_ik
';
}
lcto /ei {
oain rds
itra;
nenl
stuecp_r $e $r_e;
e_nsaeui ky agky
stuecp_r $m $r_m;
e_nsaeui cd agcd
rds_ur $m $e;
ei2qey cd ky
rds_as1700167;
ei2ps 2...:39
}
$cr ht:/oahs/nltc-nrmn?ikht:/w.eismacmb
ul tp/lclotaayisiceetln=tp/wwdvnap.o.r
Iceetdt :tp/wwdvnap.o.r
nrmne o ht:/w.eismacmb
35. HEADER FILTERS
lcto /{
oain
poyps ht:/oahs:00
rx_as tp/lclot88;
hae_itrb_u 'g.edrSre ="yLtl Sre";
edrfle_yla nxhae.evr M ite evr'
}
$cr - - HA ht:/oahs/edrfle
ul i X ED tp/lclothae-itr
HT/. 20O
TP11 0 K
Dt:Sn 0 Sp21 2:81 GT
ae u, 9 e 02 11:1 M
Sre:M Ltl Sre
evr y ite evr
CnetTp:tx/tlcastuf8
otn-ye ethm;hre=t-
CnetLnt:49
otn-egh 4
Cneto:ke-lv
oncin epaie
Sau:20O
tts 0 K
XFaeOtos smoii
-rm-pin: aergn
XXSPoeto:1 md=lc
-S-rtcin ; oebok
XCsae ps
-acd: as
XRc-ah:ms
-akCce is
36. BODY FILTERS
lcto /oyfle {
oain bd-itr
eh "ycnet;
co M otn"
bd_itrb_u '
oyfle_yla
nxag1 =srn.sbnxag1,"y,"or)
g.r[] tiggu(g.r[] M" Yu"
nxag2 =tu -stefo ls canbfe
g.r[] re -e o r at hi ufr
';
}
$cr ht:/oahs/oyfle
ul tp/lclotbd-itr
Yu cnet
or otn
37. COSOCKETS
Non Blocking, of course
Communicate via TCP or Unix domain sockets
Keepalive mechanism avoid connect/close for each request
38. COSOCKETS
lcto /ecce-rmla{
oain mmahdfo-u
cnetb_u '
otn_yla
lclsc =nxsce.onc(17001,121
oa ok g.oktcnet"2..." 11)
lclbts er=sc:ed"e fobrrn)
oa ye, r oksn(st o a"
i ntbtste
f o ye hn
nxsy"aldt sn. " er
g.a(fie o ed. n, r)
rtr
eun
ed
n
lcldt =sc:eev(
oa aa okrcie)
i ntdt te
f o aa hn
nxsy"aldt rciedt."
g.a(Fie o eev aa.n)
ed
n
nxsy"eut:" dt)
g.a(Rsl , aa
';
}
39. SOME LIBRARIES USING PURE COSOCKETS
https://github.com/agentzh/lua-resty-memcached
https://github.com/agentzh/lua-resty-redis
https://github.com/agentzh/lua-resty-mysql
40. SUMMARY
The Nginx architecture is excellent for highly scalable applications.
Nginx can do a variety of things thanks to module extensions, and one can
resuse those extensions by issuing sub-requests in Lua.
lua-nginx-module makes use of the evented architecture in Nginx,
providing a powerful and performant programming environment.
It's possible to do 100% non-blocking I/O with readable code.