最初是在开发者头条看到一篇文章:京东老司机:巧用Nginx+Lua解决数据托底大痛点
uri:http://dbaplus.cn/news-21-678-1.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io
受到了很大启发,但是作者并没有开源其实现。所以我就决定学习下OpenResty+lua 自己实现试试看
主要的实现流程是:
在nginx.conf 配置2个location
将原本访问后端服务的location改成调用lua脚本完成任务,在lua脚本里面访问/backend/red-packet
配置里面有一些openresty的参数
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http{
lua_package_path '$prefix/lua/?.lua;/blah/?.lua;;'; #lua脚本位置
lua_shared_dict bottom 20m; #设置一个lua dict 用于在nginx所有worker共享
lua_code_cache off; #测试环境关闭lua脚本缓存
server {
listen 80;
#对外的location,请求实际上通过request_proxy.lua处理
location ^~ /red-packet/ {
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers Authorization,token,Accept,Content-Type,app_key,secret_key,timestamp,sessionId,version,X-Requested-With;
add_header 'Access-Control-Max-Age' 3600;
return 200;
}
content_by_lua_file lua/redpacket/request_proxy.lua;
header_filter_by_lua_block {
ngx.header["Content-Type"] = 'application/json'
}
}
location ^~ /backend/red-packet/ { #这里是访问后端服务的location
internal; #只允许内部访问
proxy_connect_timeout 3; #超时时间设置为3秒
proxy_pass http://192.168.198.164:6678/red-packet/;
}
}
}
配置完ng就是撸代码了,代码结构图
image.pngrequest_proxy.lua 作为核心脚本主要做如下的事情:
image.png其实很简单。。
github:https://github.com/augustusChou/openresty-proxy-request
网友评论