SlideShare a Scribd company logo
Nginx+Lua!
阿⾥里实战经验谈!
阿里云-CDN事业部 卫越
2015.11!
⺫⽬目录!
第⼀一部分:阿⾥里巴巴的Nginx+Lua史!
第⼆二部分:阿⾥里巴巴Nginx+Lua的典型⽤用例!
第三部分:阿⾥里云CDN使⽤用Nginx+Lua的情况!
第四部分:阿⾥里巴巴使⽤用Nginx+Lua遇到的问题!
!
第⼀一部分!
创始!
•  创始⼈人是当时在淘宝的⺩王晓哲和章亦春!
•  量⼦子统计是淘宝第⼀一个使⽤用Nginx + Lua的应⽤用!
•  OpenResty创⽴立,章亦春将ngx_lua推向全球社区,受到社
区推崇!
尝试!
•  使⽤用Nginx + Lua代替Java!
•  等同于Java中间件功能的Lua中间件!
着陆!
•  附⾝身FastCGI的业务系统!
•  附⾝身接⼊入系统!
•  附⾝身安全系统!
•  放弃Java!
第⼆二部分!
Lua的优势!
•  内存开销⼩小:VM < 100KB!
•  LuaJIT的运⾏行效率与C、Java处于同⼀一数量级!
•  原⽣生⽀支持协程:与⾮非阻塞IO结合⾮非常好!
•  [1] https://github.com/chaoslawful/shootout!
阿⾥里巴巴的需求!
1. 快速开发,迅速完成需求迭代!
2. 快速执⾏行!
3. 运⾏行稳定!
!
!
Tengine+Lua!
•  在阿⾥里巴巴,Tengine是Lua的搭档!
•  Tengine是由阿⾥里巴巴发起的Web服务器项⺫⽬目。!
•  Tengine基于Nginx,⾼高于Nginx。!
•  Tengine的性能和稳定性已经得到了检验。!
•  Tengine的最终⺫⽬目标是⾼高效、稳定、安全、易⽤用。!
Tengine+Lua的适⽤用场景!
•  胶⽔水功能:简单的HTTP头处理功能,各类业务逻辑!
•  反向代理:HTTP、HTTPS接⼊入层路由模块!
•  数据处理层:与数据库有交互并有数据处理!
•  CPU计算型:图⽚片处理(需要加⼊入异步逻辑)!
•  安全处理:安全规则嵌⼊入,内容扫描!
取数据计算!
•  使⽤用Tengine+Lua最典型的场景!
•  简化Tengine⼦子请求的复杂性和避免不确定性!
•  核⼼心是ngx.location.capture的⽅方法!
•  capture的对象是Tengine的本地location!
•  本地location可以使⽤用proxy_pass或者fastcgi_pass获取其
他服务器上的内容!
取数据计算!
location /fetch {!
fastcgi_pass X.X.X.X:P;!
}!
location /main {!
content_by_lua "res = ngx.location.capture ('/fetch');";!
}!
取数据计算!
•  局限性:!
•  放弃了流式处理的优势!
•  内存消耗增加!
•  获取的响应⼤大⼩小有限制!
•  并发可能受到限制!
处理响应body!
•  ⼀一般使⽤用body_filter_by_lua!
•  有⼀一个奇怪的现象,使⽤用⼀一个Lua本地变量得到arg[1]中的
body内容,再对变量进⾏行处理,⽐比直接对arg[1]进⾏行处理
快得多。!
•  ngx_lua = 0.9.4,LuaJIT = 2.0。!
插⼊入处理逻辑!
•  ⺫⽬目标:在Tengine/Nginx的rewrite中插⼊入复杂逻辑!
•  背景:原⽣生的rewrite功能有限!
•  ⽅方法:有两种!
•  rewrite_by_lua!
•  set_by_lua!
rewrite_by_lua!
•  适于编写完整的rewrite逻辑!
•  不适⽤用于和已有的Tengine/Nginx的rewrite功能混⽤用!
rewrite_by_lua!
server {!
rewrite_by_lua 'ngx.return 403';!
location /test1 {!
return 200;!
}!
}!
rewrite_by_lua!
server {!
location /test1 {!
return 200;!
rewrite_by_lua 'ngx.return 403';!
}!
}!
set_by_lua!
server {!
set_by_lua $val 'return 1';!
location /test1 {!
if ($val = 1) { return 200; }!
}!
}!
第三部分!
阿⾥里云CDN动态配置!
•  阿⾥里CDN提供很多功能,⽐比如视频切⽚片,⽐比如缓存过期时
间等等!
•  这些功能有的是C模块,有的是Lua模块!
•  每个功能都有⼀一个或多个控制⼊入⼝口,⽐比如开启关闭功能,
或者控制参数。!
阿⾥里云CDN动态配置!
•  所有的控制⼊入⼝口的取值都对应到某个Tengine的变量!
•  C模块:ngx_http_get_flushed_variable!
•  Lua模块:ngx.var.VNAME!
•  使⽤用Lua更新配置,即对变量进⾏行赋值!
阿⾥里云CDN动态配置!
•  更新配置的时机!
•  更新的来源!
•  效果!
•  ⽀支持百万级的域名!
•  配置变更的时间<1分钟!
第四部分!
遇到的问题!
•  单进程内存限制,某些场景下会超出限制⽽而⽆无法⼯工作。!
•  缺乏隔离性,不同模块的全局数据需要开发者⾃自⾏行解决命
名冲突。!
•  ngx_lua提供的各种钩⼦子指令不⽀支持定义多次。!
•  调试不⽅方便。!
Lua的竞争对⼿手!
•  https://www.nginx.com/blog/launching-nginscript-and-
looking-ahead/!
!
Q&A!

More Related Content

PDF
Nginx+lua+py构建高性能处理服务
PPTX
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
PPTX
Angular 开发技巧 (2018 ngChina 开发者大会)
PDF
Gops2016 云端基于Docker的微服务与持续交付实践
PDF
Openstack nova
PPTX
SQL Server 資料庫版本控管
PPTX
lua & ngx_lua 的介绍与应用
PDF
Wot2013云计算架构师峰会 -陈轶飞2
Nginx+lua+py构建高性能处理服务
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
Angular 开发技巧 (2018 ngChina 开发者大会)
Gops2016 云端基于Docker的微服务与持续交付实践
Openstack nova
SQL Server 資料庫版本控管
lua & ngx_lua 的介绍与应用
Wot2013云计算架构师峰会 -陈轶飞2

What's hot (20)

PPTX
前端转行 DevOps 经验分享
PDF
Web server
PDF
W3CTech美团react专场-React Native 初探
PPTX
Frontend Devops at Cloudinsight
PDF
基于OpenResty的百万级长连接推送
PDF
twMVC#43 YARP
PPTX
RxJS 6 新手入門
PDF
美团点评技术沙龙06 - 滴滴移动端测试解耦工具实践
PPTX
OpenResty/Lua Practical Experience
PDF
Continuous Delivery with Ansible x GitLab CI
PPTX
Asp.net 5 新功能與變革
PDF
W3CTech美团react专场-Thinking in React
PPTX
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
PPTX
pyspider 介绍 - pycon2014@北京
PDF
從軟體開發角度
談 Docker 的應用
PDF
SMACK Dev Experience
PDF
Train.IO 【第六期-OpenStack 二三事】
PPTX
Angular 4 網站開發最佳實務 (Modern Web 2017)
PDF
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
PPTX
使用 Angular 2 與 Firebase 實現 Serverless 網站架構 (JSDC.tw 2016)
前端转行 DevOps 经验分享
Web server
W3CTech美团react专场-React Native 初探
Frontend Devops at Cloudinsight
基于OpenResty的百万级长连接推送
twMVC#43 YARP
RxJS 6 新手入門
美团点评技术沙龙06 - 滴滴移动端测试解耦工具实践
OpenResty/Lua Practical Experience
Continuous Delivery with Ansible x GitLab CI
Asp.net 5 新功能與變革
W3CTech美团react专场-Thinking in React
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
pyspider 介绍 - pycon2014@北京
從軟體開發角度
談 Docker 的應用
SMACK Dev Experience
Train.IO 【第六期-OpenStack 二三事】
Angular 4 網站開發最佳實務 (Modern Web 2017)
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
使用 Angular 2 與 Firebase 實現 Serverless 網站架構 (JSDC.tw 2016)
Ad

Viewers also liked (17)

PDF
PDF
Hacking Nginx at Taobao
PDF
Nginx Scripting - Extending Nginx Functionalities with Lua
PPTX
Script up your application with Lua! -- RyanE -- OpenWest 2014
KEY
淺入淺出 GDB
PDF
Gdb tutorial-handout
PDF
Learn C Programming Language by Using GDB
PPT
Perl在nginx里的应用
PDF
The basics and design of lua table
PPT
高性能Web服务器Nginx及相关新技术的应用实践
PDF
Using ngx_lua / lua-nginx-module in pixiv
PDF
給自己更好未來的 3 個練習:嵌入式作業系統設計、實做,與移植 (2015 年春季 ) 課程說明
PDF
Load balancing in the SRE way
PDF
Microservices & API Gateways
PDF
Making Linux do Hard Real-time
PDF
C/C++调试、跟踪及性能分析工具综述
PDF
TIP1 - Overview of C/C++ Debugging/Tracing/Profiling Tools
Hacking Nginx at Taobao
Nginx Scripting - Extending Nginx Functionalities with Lua
Script up your application with Lua! -- RyanE -- OpenWest 2014
淺入淺出 GDB
Gdb tutorial-handout
Learn C Programming Language by Using GDB
Perl在nginx里的应用
The basics and design of lua table
高性能Web服务器Nginx及相关新技术的应用实践
Using ngx_lua / lua-nginx-module in pixiv
給自己更好未來的 3 個練習:嵌入式作業系統設計、實做,與移植 (2015 年春季 ) 課程說明
Load balancing in the SRE way
Microservices & API Gateways
Making Linux do Hard Real-time
C/C++调试、跟踪及性能分析工具综述
TIP1 - Overview of C/C++ Debugging/Tracing/Profiling Tools
Ad

Similar to Nginx+lua在阿里巴巴的使用 (12)

PPTX
tengine(nginx with lua ) develop at 2013
PDF
Nginx深度開發與客制化
PPT
高性能Web服务器Nginx及相关新技术的应用实践
PPT
高性能Web服务器Nginx及相关新技术的应用实践
PPT
高性能Web服务器nginx及相关新技术的应用
PPT
ByPat博客出品-高性能Web服务器nginx及相关新技术的应用
DOC
Nginx+常见应用技术指南
PPT
使用Nginx轻松实现开源负载均衡
PPT
使用Nginx轻松实现开源负载均衡——对外版
PDF
高性能Web服务器nginx及相关新技术的应用
PPT
使用Nginx轻松实现开源负载均衡
PPT
使用Nginx轻松实现开源负载均衡
tengine(nginx with lua ) develop at 2013
Nginx深度開發與客制化
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器nginx及相关新技术的应用
ByPat博客出品-高性能Web服务器nginx及相关新技术的应用
Nginx+常见应用技术指南
使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡——对外版
高性能Web服务器nginx及相关新技术的应用
使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡

Nginx+lua在阿里巴巴的使用