写在开头

# 系统版本 cat /etc/issue

CentOS release 6.8 (Final)

# 切换到tmp目录

cd /tmp

安装 lua

# 下载

wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz

# 解压

tar zxf LuaJIT-2.0.5.tar.gz

cd LuaJIT-2.0.5

# 编译

make PREFIX=/usr/local/LuaJIT

# 安装

make install PREFIX=/usr/local/LuaJIT

# 动态链接库

echo "/usr/local/LuaJIT/lib" > /etc/ld.so.conf.d/usr_local_luajit_lib.conf

ldconfig

# 设置环境变量

export LUAJIT_LIB=/usr/local/LuaJIT/lib

export LUAJIT_INC=/usr/local/LuaJIT/include/luajit-2.0

下载lua-nginx-module

# 下载

wget https://codeload.github.com/openresty/lua-nginx-module/tar.gz/v0.10.13

# 解压

tar zxf v0.10.13

下载ngx_devel_kit

# 下载

wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz

# 解压

tar zxf v0.3.0.tar.gz

下载lua-resty-kafka

# 下载

wget https://github.com/doujiang24/lua-resty-kafka/archive/master.zip

# 解压

unzip master.zip

# 新建目录

mkdir /usr/local/lua

# 拷贝

cp -r lua-resty-kafka-master /usr/local/lua/lua-resty-kafka

安装 pcre

# 下载

wget https://jaist.dl.sourceforge.net/project/pcre/pcre/8.42/pcre-8.42.tar.bz2

# 解压

tar -jxf pcre-8.42.tar.bz2

chmod -R 777 pcre-8.42

cd pcre-8.42

# 配置

./configure

# 安装

make

# 安装

make install

# 创建 软链

ln -s /usr/local/lib/libpcre.so.1 /lib64/

安装openresty

# http://openresty.org/cn/linux-packages.html

yum install pcre-devel openssl-devel gcc curl

sudo yum install yum-utils

sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

sudo yum install openresty

拷贝lua-resty-kafka

mkdir /usr/local/openresty/lualib/resty/kafka

cp -R /tmp/lua-resty-kafka-master/lib/resty/kafka/* /usr/local/openresty/lualib/resty/kafka/

安装nginx

# 下载

wget http://nginx.org/download/nginx-1.9.8.tar.gz

# 解压

tar zxf nginx-1.9.8.tar.gz

cd nginx-1.9.8

# 修改src/core/ngx_conf_file.c中的NGX_CONF_BUFFER为8192或者更大, 以避免"too long parameter"

# 配置

./configure --prefix=/usr/local/nginx/ --sbin-path=/usr/bin/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --add-module=/tmp/lua-nginx-module-0.10.13 --add-module=/tmp/ngx_devel_kit-0.3.0 --with-pcre=/tmp/pcre-8.42 --with-pcre-jit

# 编译

make

# 安装

make install

nginx 配置

worker_processes 1;

events {

worker_connections 1024;

}

http {

add_header Access-Control-Allow-Origin *;

add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';

add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';

default_type "application/json;charset=UTF-8";

lua_package_path "/usr/local/openresty/lualib/?.lua;;";

lua_package_cpath "/usr/local/openresty/lualib/?.so;;";

resolver 127.0.0.1;

server {

listen 8899;

# 读取请求体, 跟ngx.req.read_body()函数作用类似

lua_need_request_body on;

location / {

content_by_lua '

ngx.header.content_type = "text/plain";

if jit then

ngx.say(jit.version)

else

ngx.say(_VERSION)

end

';

}

location /api/v1/sdk/import {

content_by_lua '

local producer = require "resty.kafka.producer"

-- 返回体

function response(code, msg)

local resp = {}

resp["errcode"] = code

resp["errmsg"] = msg

ngx.say(cjson.encode(resp))

end

local broker_list = {

{ host = "192.168.1.117", port = 9092}

}

local bp = producer:new(broker_list, {producer_type="sync"})

local ok, err = bp:send("sdk-receive", nil, ngx.var.request_body)

if not ok then

response(10000, "系统错误")

else

response(0, "请求成功")

end

';

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

}

完整示例

worker_processes 1;

events {

worker_connections 1024;

}

http {

add_header Access-Control-Allow-Origin *;

add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';

add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';

default_type "application/json;charset=UTF-8";

lua_package_path "/usr/local/openresty/lualib/?.lua;;";

lua_package_cpath "/usr/local/openresty/lualib/?.so;;";

resolver 127.0.0.1;

server {

listen 8899;

# 读取请求体, 跟ngx.req.read_body()函数作用类似

lua_need_request_body on;

location /api/v1/sdk/import {

content_by_lua '

local cjson = require "cjson"

-- 返回体

function response(code, msg)

local resp = {}

resp["errcode"] = code

resp["errmsg"] = msg

ngx.say(cjson.encode(resp))

end

-- 获取secret 并校验非空

local secret = ngx.req.get_uri_args()["secret"]

if secret == nil or secret == "" then

response(10003, "缺少secret参数")

return

end

-- 获取请求参数 并校验json格式

local data

if not xpcall(

function()

-- 相当于 try

data = cjson.decode(ngx.var.request_body)

end,

function()

-- 相当于 catch

response(10001,"json数据格式化失败")

end

) then

return

end

-- 根据secret获取数据源详情

local redis = require("resty.redis")

local redis_instance = redis:new()

redis_instance:set_timeout(1000)

local ok, err = redis_instance:connect("192.168.1.117", 6379)

if not ok then

response(10006, "获取数据源信息失败")

redis_instance:close()

return

end

redis_instance:select(6)

local resp, err = redis_instance:get(string.format("sdk_auth_%s",secret))

if not err then

if type(resp) == "string" then

local _resp

if not xpcall(

function()

-- 相当于 try

_resp = cjson.decode(resp)

end,

function()

end

) then

response(10009, "获取数据源信息失败")

return

end

if not _resp["auth"] then

response(10010, "secret已失效")

return

end

data["cid"] = _resp["cid"]

data["srcId"] = _resp["sid"]

else

-- mysql中取配置信息,并写redis缓存

local mysql = require("resty.mysql")

local db, err = mysql:new()

if not db then

response(10007, "获取数据源信息失败")

return

end

db:set_timeout(1000)

local ok, err, errcode, sqlstate = db:connect{

host = "192.168.1.117",

port = 3306,

database = "database_test",

user = "root",

password = "root",

charset = "utf8"

}

if not ok then

response(10008, "获取数据源信息失败")

return

end

local res, err, errcode, sqlstate = db:query(string.format("select id,cid from sdk where del_flag=0 and secret=\'%s\'",secret))

if not res or res[1] == nil then

response(10010, "secret不存在或已失效")

db:close()

return

end

local _res = res[1]

data["srcId"] = _res["id"]

data["cid"] = _res["cid"]

local auth_data = {

auth = true,

sid = _res["id"],

cid = _res["cid"]

}

redis_instance:set(string.format("sdk_auth_%s",secret), cjson.encode(auth_data))

end

else

response(10009, "获取数据源信息失败")

db:close()

return

end

data["srcType"] = "sdk"

local producer = require "resty.kafka.producer"

local broker_list = {

{ host = "192.168.1.117", port = 9092 }

}

local bp = producer:new(broker_list, {producer_type="sync"})

local ok, err = bp:send("sdk-receive", nil, cjson.encode(data))

if not ok then

response(10000, "系统错误")

else

response(0, "请求成功")

end

';

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

}

测试

curl -X POST -d '{"type":"user","properties":{"mobile":"18355558888","sex":"男"}}' 'http://localhost:8899/api/v1/api/import?secret=6051d46e-096a-4160-b979-7598202ea23'

nginx redis mysql_Nginx + Lua + Kafka + Redis + Mysql相关推荐

  1. nginx.redis.mysql_nginx,redis_mysql和redis效率问题,nginx,redis,mysql,php - phpStudy

    mysql和redis效率问题 $redis = new redis(); $redis->connect('127.0.0.1', 6379); for ($i=0; $i <100 ; ...

  2. Nginx直接访问redis,lua访问redis

    这个需要一个模块,这个模块叫 redis2-nginx-module.下载地址是 https://github.com/openresty/redis2-nginx-module/archive/v0 ...

  3. nginx lua连接mysql_OpenResty的安装和在nginx中使用lua直接访问mysql达到数据接口的统一...

    OpenResty 它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. 如果需要nginx的第三方库的时候,可以考虑OpenResty,可以少掉很多安装的麻烦,Open ...

  4. Redis与Lua详解

    Lua Lua语法 Lua 数据类型 Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值. 值可以存储在变量中,作为参数传递或结果返回. Lua 中有 8 个基本类型分别为:nil.boole ...

  5. redis:redis与lua

    redis中为什么引入Lua脚本? 遇到的问题: redis是高性能的key-value内存数据库,在部分场景下,是对关系数据库的良好补充 redis提供了非常丰富的指令集,官网上提供了200多个命令 ...

  6. CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据

    1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Re ...

  7. canal+Kafka实现mysql与redis数据同步

    前言 上篇文章简单介绍canal概念,本文结合常见的缓存业务去讲解canal使用.在实际开发过程中,通常都会把数据往redis缓存中保存一份,做下简单的查询优化.如果这时候数据库数据发生变更操作,就不 ...

  8. Nginx+Lua脚本+Redis 实现自动封禁访问频率过高IP

    前言:由于公司前几天短信接口被一直攻击,并且攻击者不停变换IP,导致阿里云短信平台上的短信被恶意刷取了几千条,然后在Nginx上对短信接口做了一些限制 临时解决方案: 1.查看Nginx日志发现被攻击 ...

  9. Java 开发人员常用的服务配置(Nginx、Tomcat、JVM、Mysql、Redis)

    Nginx Nginx是一款由C语言编写的高性能.轻量级的HTTP和反向代理服务器,同时也是一款IMAP/POP3/SMTP服务器. nginx.conf:Nginx核心配置文件,linux下默认安装 ...

最新文章

  1. 中国科学:拟南芥二半萜类化合物调控根系微生物组
  2. Alamofire的简单封装
  3. AI公开课:19.02.20 雷鸣教授《人工智能革命与机遇》课堂笔记以及个人感悟
  4. icoding复习4 数组 十字链表
  5. linux终端lex程序运行,lex的简单使用
  6. Java学习资料汇总(JavaSE+JavaEE+数据库+框架+笔试题+面试题)
  7. 推荐周立功先生的一本书
  8. BizTalk中常用到的表达式
  9. MimeType文件格式速查表
  10. [透析] 卷积神经网络CNN究竟是怎样一步一步工作的?
  11. npm install 的--save-dev和--save(看过不会忘)
  12. 在consul中删除服务
  13. Python CSV简介
  14. RewriteBase: only valid in per-directory config files 解答:
  15. 理想浪漫主义色彩的句子
  16. studio 3t MongoDB for MAC 201903+Cracking
  17. stm32 spi nss硬件模式配置参考程序
  18. hive on spark 线上问题排查案例分享
  19. zai~~myGODDDD
  20. python使用全新环境的exec_python之os.exec*族用法简结

热门文章

  1. Java 10 var关键字详解和示例教程
  2. MFC体系结构(3)
  3. 搭建用友开发环境(基于碧桂园的nchome)
  4. (待解决!)jmx在PetClinic中的应用
  5. 命令行启动mssqlserver服务
  6. asp.net mvc View视图目录修改
  7. IP地址专题二:子网掩码入门
  8. LeetCode 134 Gas Station
  9. sklearn 数据预处理1: StandardScaler
  10. 原型和构造函数(1)