OpenResty概念讲解
OpenResty介绍
OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。
OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。
哪些公司正在用OpenResty
- OpenResty 应用的场景非常多,比如应用在 CDN 场景,典型的用户包括又拍云、CloudFlare;
- 京东主站的 API 网关,以及京东物流的第三方商家的网关层;
- 12306 应用 Openesty 主要是替代 Nginx 做负载均衡和反向代理,以及火车票在出现的时候反向最大的余票的查询等都是使用 OpenResty 来实现;
- 360 企业安全后端所有和安全相关的逻辑都是 OpenResty 实现的;
- 腾讯游戏的广告系统里面所有的业务逻辑也是使用 OpenResty 来开发的;
- KONG 开源出来的一整套解决方案(云原生 API gateway & Service Mash)也是基于 OpenResty 去做的。
OpenResty应用场景
其实官网 wiki 已经列了出来:
- 在lua中混合处理不同nginx模块输出(proxy, drizzle, postgres, redis, memcached等)。
- 在请求真正到达上游服务之前,lua中处理复杂的准入控制和安全检查。
- 比较随意的控制应答头(通过Lua)。
- 从外部存储中获取后端信息,并用这些信息来实时选择哪一个后端来完成业务访问。
- 在内容handler中随意编写复杂的web应用,同步编写异步访问后端数据库和其他存储。
- 在rewrite阶段,通过Lua完成非常复杂的处理。
- 在Nginx子查询、location调用中,通过Lua实现高级缓存机制。
- 对外暴露强劲的Lua语言,允许使用各种Nginx模块,自由拼合没有任何限制。该模块的脚本有充分的灵活性,同时提供的性能水平与本地C语言程序无论是在CPU时间方面以及内存占用差距非常小。所有这些都要求LuaJIT 2.x是启用的。其他脚本语言实现通常很难满足这一性能水平。
功能需求
仅仅是部分功能(更加详尽的不再一一列出)
- 第一个方面:在开发阶段还是有大量重复性的、非功能性的模块的开发,比如:身份验证、登陆校验、流量控制、频次控制、安全等等这样的事情要做。
- 第二个方面:就是线上运行的时候也存在大量的防刷,异常用户行为,需要进行行为控制和分析,包括防刷、秒杀、抽奖类活动的一些流量控制等干预。
API网关汇总
以下图来源于网络,能有所参考
环境变量
脚本 启动
创建lua目录
连接数据库
sql注入
https://moonbingbing.gitbooks.io/openresty-best-practices/content/openresty/safe_sql.html
乱码问题:charset utf-8; #设置编码
http {
server {
#监听端口,若你的6699端口已经被占用,则需要修改
listen 6100;
location /initProxy {
default_type text/html;
charset utf-8; #设置编码
content_by_lua_file /opt/openresty-router/lua/lua_mysql_proxy_list.lua;
}}
如何创建配置文件选项呢
由于函数定义等价于变量赋值,我们也可以把函数名替换为某个 Lua 表的某个字段,例如
function foo.bar(a, b, c)
-- body ...
end
local color={first="red", "blue", third="green", "yellow"}
print(color["first"]) --> output: red
print(color[1]) --> output: blue
print(color["third"]) --> output: green
print(color[2]) --> output: yellow
print(color[3]) --> output: nil
https://moonbingbing.gitbooks.io/openresty-best-practices/content/lua/function_before_use.html
点号与冒号操作符的区别
不要忘记了末尾的分号:
ngx.say("HelloWorld")