├── .gitignore ├── README.md ├── assets ├── base64-filter-by-lua.png ├── base64-nginx-module.png ├── checkups-with-nginxconf.png ├── graffle │ ├── base64-filter-by-lua.graffle │ ├── checkups-with-nginxconf.graffle │ │ ├── data.plist │ │ ├── image1.tiff │ │ └── image3.png │ ├── how-ngxlua-works.graffle │ ├── metadata-shcache.graffle │ ├── nginx-architecture.graffle │ │ ├── data.plist │ │ ├── image11.png │ │ ├── image12.png │ │ ├── image13.png │ │ ├── image8.png │ │ └── image9.png │ ├── nginx-http-request.graffle │ ├── nginx-upstream.graffle │ │ ├── data.plist │ │ └── image1.png │ ├── shanks-redis.graffle │ ├── shanks-upstream-state.graffle │ │ ├── data.plist │ │ ├── image1.png │ │ └── image2.png │ ├── upyun-api-new.graffle │ ├── upyun-api-old.graffle │ ├── upyun-cdn-architecture.graffle │ ├── upyun-with-ngxlua.graffle │ └── vivi-streaming-upload.graffle ├── how-ngxlua-works.png ├── lua-resty-checkups.png ├── metadata-shcache.png ├── nginx-architecture.png ├── nginx-http-request.png ├── nginx-upstream.png ├── shanks-redis.png ├── shanks-upstream-state.png ├── upyun-api-new.png ├── upyun-api-old.png ├── upyun-cdn-architecture.png ├── upyun-with-ngxlua.png └── vivi-streaming-upload.png ├── using-ngxlua-in-upyun-2-wide.key ├── using-ngxlua-in-upyun-2-wide.pdf ├── using-ngxlua-in-upyun-2.key ├── using-ngxlua-in-upyun-2.pdf ├── using-ngxlua-in-upyun.key ├── using-ngxlua-in-upyun.pdf └── work └── conf └── nginx.conf /.gitignore: -------------------------------------------------------------------------------- 1 | work/* 2 | 3 | !work/conf 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Using ngx_lua in UPYUN 2 | 3 | * 2014.11 @ Beijing OSC: `Using ngx_lua in UPYUN` ( [slideshare](http://www.slideshare.net/timebug/using-ngxlua-in-upyun) | [speakerdeck](https://speakerdeck.com/timebug/using-ngx-lua-in-upyun) ) 4 | * 2015.11 @ Beijing OpenResty Con: `Using ngx_lua in UPYUN 2` ( [slideshare](http://www.slideshare.net/timebug/using-ngxlua-in-upyun-2) | [speakerdeck](https://speakerdeck.com/timebug/using-ngx-lua-in-upyun-2) ) 5 | * blog: 6 | 7 | ## Run the Code 8 | 9 | 1) Building and Installing [Openresty](http://openresty.org/) 10 | 11 | ``` 12 | tar xzvf ngx_openresty-VERSION.tar.gz 13 | cd ngx_openresty-VERSION/ 14 | ./configure 15 | make 16 | make install 17 | ``` 18 | 19 | 2) Start the Nginx Server 20 | 21 | ``` 22 | cd work 23 | mkdir logs 24 | 25 | export PATH=/usr/local/openresty/nginx/sbin:$PATH 26 | nginx -p `pwd`/ -c conf/nginx.conf 27 | ``` 28 | 29 | 3) Hello World 30 | 31 | ``` 32 | curl http://localhost:8080/hello 33 | ``` 34 | 35 | ## See Also 36 | 37 | * 38 | * 39 | * 40 | * 41 | * 42 | * 43 | * 44 | * 45 | * 46 | * 47 | * 48 | -------------------------------------------------------------------------------- /assets/base64-filter-by-lua.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/base64-filter-by-lua.png -------------------------------------------------------------------------------- /assets/base64-nginx-module.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/base64-nginx-module.png -------------------------------------------------------------------------------- /assets/checkups-with-nginxconf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/checkups-with-nginxconf.png -------------------------------------------------------------------------------- /assets/graffle/base64-filter-by-lua.graffle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/base64-filter-by-lua.graffle -------------------------------------------------------------------------------- /assets/graffle/checkups-with-nginxconf.graffle/data.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/checkups-with-nginxconf.graffle/data.plist -------------------------------------------------------------------------------- /assets/graffle/checkups-with-nginxconf.graffle/image1.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/checkups-with-nginxconf.graffle/image1.tiff -------------------------------------------------------------------------------- /assets/graffle/checkups-with-nginxconf.graffle/image3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/checkups-with-nginxconf.graffle/image3.png -------------------------------------------------------------------------------- /assets/graffle/how-ngxlua-works.graffle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/how-ngxlua-works.graffle -------------------------------------------------------------------------------- /assets/graffle/metadata-shcache.graffle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/metadata-shcache.graffle -------------------------------------------------------------------------------- /assets/graffle/nginx-architecture.graffle/data.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/nginx-architecture.graffle/data.plist -------------------------------------------------------------------------------- /assets/graffle/nginx-architecture.graffle/image11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/nginx-architecture.graffle/image11.png -------------------------------------------------------------------------------- /assets/graffle/nginx-architecture.graffle/image12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/nginx-architecture.graffle/image12.png -------------------------------------------------------------------------------- /assets/graffle/nginx-architecture.graffle/image13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/nginx-architecture.graffle/image13.png -------------------------------------------------------------------------------- /assets/graffle/nginx-architecture.graffle/image8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/nginx-architecture.graffle/image8.png -------------------------------------------------------------------------------- /assets/graffle/nginx-architecture.graffle/image9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/nginx-architecture.graffle/image9.png -------------------------------------------------------------------------------- /assets/graffle/nginx-http-request.graffle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/nginx-http-request.graffle -------------------------------------------------------------------------------- /assets/graffle/nginx-upstream.graffle/data.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/nginx-upstream.graffle/data.plist -------------------------------------------------------------------------------- /assets/graffle/nginx-upstream.graffle/image1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/nginx-upstream.graffle/image1.png -------------------------------------------------------------------------------- /assets/graffle/shanks-redis.graffle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/shanks-redis.graffle -------------------------------------------------------------------------------- /assets/graffle/shanks-upstream-state.graffle/data.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/shanks-upstream-state.graffle/data.plist -------------------------------------------------------------------------------- /assets/graffle/shanks-upstream-state.graffle/image1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/shanks-upstream-state.graffle/image1.png -------------------------------------------------------------------------------- /assets/graffle/shanks-upstream-state.graffle/image2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/shanks-upstream-state.graffle/image2.png -------------------------------------------------------------------------------- /assets/graffle/upyun-api-new.graffle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/upyun-api-new.graffle -------------------------------------------------------------------------------- /assets/graffle/upyun-api-old.graffle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/upyun-api-old.graffle -------------------------------------------------------------------------------- /assets/graffle/upyun-cdn-architecture.graffle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/upyun-cdn-architecture.graffle -------------------------------------------------------------------------------- /assets/graffle/upyun-with-ngxlua.graffle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/upyun-with-ngxlua.graffle -------------------------------------------------------------------------------- /assets/graffle/vivi-streaming-upload.graffle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/graffle/vivi-streaming-upload.graffle -------------------------------------------------------------------------------- /assets/how-ngxlua-works.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/how-ngxlua-works.png -------------------------------------------------------------------------------- /assets/lua-resty-checkups.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/lua-resty-checkups.png -------------------------------------------------------------------------------- /assets/metadata-shcache.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/metadata-shcache.png -------------------------------------------------------------------------------- /assets/nginx-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/nginx-architecture.png -------------------------------------------------------------------------------- /assets/nginx-http-request.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/nginx-http-request.png -------------------------------------------------------------------------------- /assets/nginx-upstream.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/nginx-upstream.png -------------------------------------------------------------------------------- /assets/shanks-redis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/shanks-redis.png -------------------------------------------------------------------------------- /assets/shanks-upstream-state.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/shanks-upstream-state.png -------------------------------------------------------------------------------- /assets/upyun-api-new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/upyun-api-new.png -------------------------------------------------------------------------------- /assets/upyun-api-old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/upyun-api-old.png -------------------------------------------------------------------------------- /assets/upyun-cdn-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/upyun-cdn-architecture.png -------------------------------------------------------------------------------- /assets/upyun-with-ngxlua.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/upyun-with-ngxlua.png -------------------------------------------------------------------------------- /assets/vivi-streaming-upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/assets/vivi-streaming-upload.png -------------------------------------------------------------------------------- /using-ngxlua-in-upyun-2-wide.key: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/using-ngxlua-in-upyun-2-wide.key -------------------------------------------------------------------------------- /using-ngxlua-in-upyun-2-wide.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/using-ngxlua-in-upyun-2-wide.pdf -------------------------------------------------------------------------------- /using-ngxlua-in-upyun-2.key: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/using-ngxlua-in-upyun-2.key -------------------------------------------------------------------------------- /using-ngxlua-in-upyun-2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/using-ngxlua-in-upyun-2.pdf -------------------------------------------------------------------------------- /using-ngxlua-in-upyun.key: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/using-ngxlua-in-upyun.key -------------------------------------------------------------------------------- /using-ngxlua-in-upyun.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timebug/using-ngxlua-in-upyun/fc3dc38abc1507923b9e97d236b373f7e366a049/using-ngxlua-in-upyun.pdf -------------------------------------------------------------------------------- /work/conf/nginx.conf: -------------------------------------------------------------------------------- 1 | # -*- mode: nginx -*- 2 | # vim: set expandtab tabstop=4 shiftwidth=4: 3 | 4 | worker_processes 1; 5 | error_log logs/error.log; 6 | 7 | events { 8 | worker_connections 1024; 9 | } 10 | 11 | http { 12 | server { 13 | listen 8080; 14 | 15 | # Hello World 16 | location /hello { 17 | set $foo "hello"; 18 | echo $foo; 19 | 20 | set $foo "world"; 21 | echo $foo; 22 | } 23 | 24 | # If is Evil 25 | location /if { 26 | set $foo 1; 27 | 28 | if ($foo = 1) { 29 | set $foo 2; 30 | echo "foo = $foo"; 31 | } 32 | 33 | set $foo 3; 34 | proxy_pass http://127.0.0.1:$server_port/$foo; 35 | } 36 | 37 | location ~ /(\d+) { 38 | echo "bar = $1"; 39 | } 40 | 41 | # Intro ngx_lua 42 | location /add { 43 | set $res ''; 44 | 45 | rewrite_by_lua ' 46 | local a = tonumber(ngx.var.arg_a) or 0 47 | local b = tonumber(ngx.var.arg_b) or 0 48 | ngx.var.res = a + b 49 | '; 50 | 51 | content_by_lua ' 52 | ngx.say(ngx.var.res) 53 | '; 54 | } 55 | 56 | # Base64 Filter by Lua 57 | location /base64 { 58 | set $b64_en ''; 59 | set $b64_e0 ''; 60 | set $b64_e1 ''; 61 | 62 | echo_duplicate 1000 hello; 63 | 64 | header_filter_by_lua ' 65 | ngx.header.content_length = nil -- ((n + 2) / 3 ) * 4 66 | ngx.header.content_type = "text/plain" 67 | ngx.header.content_transfer_encoding = "base64" 68 | '; 69 | 70 | body_filter_by_lua ' 71 | local chunk = ngx.arg[1] 72 | 73 | local e0 = ngx.var.b64_e0 or "" 74 | local e1 = ngx.var.b64_e1 or "" 75 | local en = tonumber(ngx.var.b64_en) or 0 76 | 77 | if en == 1 then 78 | chunk = e0 .. chunk 79 | elseif en == 2 then 80 | chunk = e0 .. e1 .. chunk 81 | end 82 | 83 | if not ngx.arg[2] then 84 | en = #chunk % 3 85 | if en == 1 then 86 | e0 = chunk:sub(-1) 87 | elseif en == 2 then 88 | e1 = chunk:sub(-1) 89 | e0 = chunk:sub(-2, -2) 90 | end 91 | chunk = chunk:sub(1, #chunk - en) 92 | else -- eof 93 | en = 0 94 | end 95 | 96 | ngx.var.b64_en = en 97 | ngx.var.b64_e0 = e0 98 | ngx.var.b64_e1 = e1 99 | 100 | ngx.arg[1] = ngx.encode_base64(chunk) 101 | '; 102 | } 103 | } 104 | } 105 | --------------------------------------------------------------------------------