nginx lua调用redis和mongo
参考
http://blog.csdn.net/vboy1010/article/details/7892120
http://www.zhangjixuem.com.cn/2014/4/1/01037.html
https://github.com/bigplum/lua-resty-mongol
安装:
下载ngx_openresty-1.7.2.1.tar.gz
./configure --prefix=/data/nginx/openresty/resty --with-luajit
make
make install
修改nginx.conf
注意default_type text/plain;
否则浏览器触发是下载
charset utf-8,gbk;
否则可能会乱码
- worker_processes 1;
- events {
- worker_connections 1024;
- }
- http {
- include mime.types;
- charset utf-8,gbk;
- # default_type application/octet-stream;
- default_type text/plain;
- lua_package_path "/data/www/lua/?.lua;;";
- sendfile on;
- keepalive_timeout 65;
- server {
- listen 80;
- server_name localhost;
- lua_code_cache off;
- location /lua {
- content_by_lua_file /data/www/lua/test.lua;
- }
- location /lua_mongo {
- content_by_lua_file /data/www/lua/test_mongo.lua;
- }
- location /lua_get {
- content_by_lua_file /data/www/lua/test_get.lua;
- }
- location / {
- root html;
- index index.html index.htm;
- }
- #
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root html;
- }
- }
- }
- local redis = require "resty.redis"
- local cache = redis.new()
- local ok, err = cache.connect(cache, '127.0.0.1', '6379')
- cache:set_timeout(60000)
- if not ok then
- ngx.say("failed to connect:", err)
- return
- end
- res, err = cache:set("dog", "an aniaml")
- if not ok then
- ngx.say("failed to set dog: ", err)
- return
- end
- ngx.say("set result: ", res)
- local res, err = cache:get("dog")
- if not res then
- ngx.say("failed to get dog: ", err)
- return
- end
- if res == ngx.null then
- ngx.say("dog not found.")
- return
- end
- ngx.say("dog: ", res)
- local ok, err = cache:close()
- if not ok then
- ngx.say("failed to close:", err)
- return
- end
结果
- [root@VM_192_107_centos lua]# !curl
- curl http://localhost/lua
- set result: OK
- dog: an aniaml
- [root@VM_192_107_centos lua]#
#---------------mongo的基本操作--------------
http://wenku.baidu.com/link?url=K2rmB_5ypVHErZPvi1UucFXfnfEXk4IrvgSQzeSabKJx50W_gpD2cFvCEPQZm0sZgMvHGJTmZahK96Ee3n7OgZTb4gHgybQdZsQ2xGV4nZm
启动mongo
./mongod --dbpath=../data/db --logpath=../log/mongodb.log
- show dbs
- use admin
- show collections
- db.startup_log.count()
- db.startup_log.find()
- db.startup_log.find().forEach(function(doc){print(tojson(doc));});
- u={name:"haoning",age:21}
- db.haoning.insert(u)
- db.haoning.insert({name:"ningning",age:10})
- db.haoning.find({name:"haoning"});
- db.haoning.find({age:18,name:"ning"});
- db.haoning.find().sort({age:1});
- db.haoning.find().sort({age:-1});
- db.haoning.find().limit(2);
- db.haoning.find().skip(2).limit(2);
- db.haoning.find({age:{$gt:9,$lt:20},name:"ning"});
- db.haoning.find({age:{$gt:9,$lt:20}});
- $gte $lte $ne
- db.haoning.find({age:{$in:[10,18]}});
- db.haoning.find({$or:[{age:10},{age:21}]});
- db.haoning.update({name:'ning'},{$set:{age:100,sex:0}});
- db.haoning.update({name:'haohao'},{$inc:{age:10}},false,true);
- db.haoning.findOne({name:"ningning"});
- id=db.haoning.findOne({name:"ningning"})._id
- db.haoning.remove(id);
- db.haoning.ensureIndex({name:1})
- db.haoning.ensureIndex({name:1},{backgrand:true})
- db.haoning.ensureIndex({name:1},{unique:true})
- db.haoning.ensureIndex({created_at:-1})
- db.haoning.ensureIndex({name:1,created_at:-1})
- db.haoning.distinct("name");
mongo的安装
git clone https://github.com/bigplum/lua-resty-mongol.git
make PREFIX=/data/nginx/openresty/resty install
/data/nginx/openresty/resty 为已经安装的resty的安装路径
会在/data/nginx/openresty/resty/lualib/resty
下面添加mongol的一些lua脚本
mongo的test的lua脚本:
参考
http://www.zhangjixuem.com.cn/2014/4/1/01037.html
- local mongo = require "resty.mongol"
- local conn = mongo:new()
- conn:set_timeout(1000)
- local ok, err = conn:connect("127.0.0.1",27017)
- if not ok then
- ngx.say("connect failed: "..err)
- end
- local db=conn:new_db_handle("test")
- local col = db:get_col("test")
- local r = col:find_one({name="dog"},{_id=0})
- for k,v in pairs(r) do
- ngx.say(k..": "..v)
- end
mongo的测试
- [root@VM_192_107_centos lua]# mongo
- MongoDB shell version: 2.6.6
- connecting to: test
- > use test
- switched to db test
- > db.test.insert({name:"dog"})
- WriteResult({ "nInserted" : 1 })
- > ^C
- bye
- [root@VM_192_107_centos lua]# ^C
- [root@VM_192_107_centos lua]# !curl
- curl http://localhost/lua
- set result: OK
- dog: an aniaml
- [root@VM_192_107_centos lua]# curl http://localhost/lua_mongo
- name: dog
- [root@VM_192_107_centos lua]#
另外,nginx向lua传值
- local request_method = ngx.var.request_method
- local args = nil
- local param = nil
- local param2 = nil
- if "GET" == request_method then
- args = ngx.req.get_uri_args()
- elseif "POST" == request_method then
- ngx.req.read_body()
- args = ngx.req.get_post_args()
- end
- param = args["p"]
- ngx.say("request: ", param)
配置文件:
- location /lua_get {
- content_by_lua_file /data/www/lua/test_get.lua;
- }
测试
- [root@VM_192_107_centos lua]# !curl
- curl http://localhost/lua_mongo
- name: dog
- [root@VM_192_107_centos lua]#
[root@VM_192_107_centos sbin]# curl -d "p='bbb'" http://127.0.0.1/lua_get?
post
request: 'bbb'
[root@VM_192_107_centos sbin]#
参考http://www.server110.com/nginx/201310/2800.html
#-----------------使用request的 data_body,及json的参数--------
[root@VM_192_107_centos lualib]# ls
cjson.so rds redis resty
[root@VM_192_107_centos lualib]# pwd
/data/nginx/openresty/resty/lualib
看下面有个cjson.so
就是可以require cjson了哈
- local json = require("cjson")
- local request_method = ngx.var.request_method
- local args = nil
- local param = nil
- local param2 = nil
- --获取参数的值
- if "GET" == request_method then
- args = ngx.req.get_uri_args()
- elseif "POST" == request_method then
- ngx.req.read_body()
- args = ngx.req.get_post_args()
- end
- param = args["param"]
- param2 = args["param2"]
- --升级版(能处理content-type=multipart/form-data的表单):
- local function explode ( _str,seperator )
- local pos, arr = 0, {}
- for st, sp in function() return string.find( _str, seperator, pos, true ) end do
- table.insert( arr, string.sub( _str, pos, st-1 ) )
- pos = sp + 1
- end
- table.insert( arr, string.sub( _str, pos ) )
- return arr
- end
- local args = {}
- local file_args = {}
- local is_have_file_param = false
- local function init_form_args()
- local receive_headers = ngx.req.get_headers()
- local request_method = ngx.var.request_method
- if "GET" == request_method then
- args = ngx.req.get_uri_args()
- ngx.say("request get: ", args)
- elseif "POST" == request_method then
- ngx.say("request: post ")
- ngx.req.read_body()
- ngx.say(string.sub(receive_headers["content-type"],1,33))
- --if string.sub(receive_headers["content-type"],1,20) == "multipart/form-data;" then--判断是否是multipart/form-data类型的表单
- if string.sub(receive_headers["content-type"],1,33) == "application/x-www-form-urlencoded" then--判断是否是multipart/form-data类型的表单
- ngx.say("request: post 1")
- is_have_file_param = true
- content_type = receive_headers["content-type"]
- body_data = ngx.req.get_body_data()--body_data可是符合http协议的请求体,不是普通的字符串
- ngx.say("body_data:",body_data)
- value = json.encode(body_data)
- ngx.say(value)
- a = json.decode(value)
- ngx.say(a['aa'])
- --请求体的size大于nginx配置里的client_body_buffer_size,则会导致请求体被缓冲到磁盘临时文件里,client_body_buffer_size默认是8k或者16k
- if not body_data then
- local datafile = ngx.req.get_body_file()
- if not datafile then
- error_code = 1
- error_msg = "no request body found"
- else
- local fh, err = io.open(datafile, "r")
- if not fh then
- error_code = 2
- error_msg = "failed to open " .. tostring(datafile) .. "for reading: " .. tostring(err)
- else
- fh:seek("set")
- body_data = fh:read("*a")
- fh:close()
- if body_data == "" then
- error_code = 3
- error_msg = "request body is empty"
- end
- end
- end
- end
- local new_body_data = {}
- --确保取到请求体的数据
- if not error_code then
- local boundary = "--" .. string.sub(receive_headers["content-type"],31)
- local body_data_table = explode(tostring(body_data),boundary)
- local first_string = table.remove(body_data_table,1)
- local last_string = table.remove(body_data_table)
- for i,v in ipairs(body_data_table) do
- local start_pos,end_pos,capture,capture2 = string.find(v,'Content%-Disposition: form%-data; name="(.+)"; filename="(.*)"')
- if not start_pos then--普通参数
- local t = explode(v,"\r\n\r\n")
- local temp_param_name = string.sub(t[1],41,-2)
- local temp_param_value = string.sub(t[2],1,-3)
- args[temp_param_name] = temp_param_value
- else--文件类型的参数,capture是参数名称,capture2是文件名
- file_args[capture] = capture2
- table.insert(new_body_data,v)
- end
- end
- table.insert(new_body_data,1,first_string)
- table.insert(new_body_data,last_string)
- --去掉app_key,app_secret等几个参数,把业务级别的参数传给内部的API
- body_data = table.concat(new_body_data,boundary)--body_data可是符合http协议的请求体,不是普通的字符串
- end
- else
- ngx.say("request: post else")
- args = ngx.req.get_post_args()
- ngx.say("request: args ",args['p'])
- end
- end
- end
- init_form_args()
结果
- [root@VM_192_107_centos lualib]# !curl
- curl -d "{aa:'cc'}" http://localhost/lua_get_post?p=cc
- request: post
- application/x-www-form-urlencoded
- request: post 1
- body_data:{aa:'cc'}
- "{aa:'cc'}"
- nil
- [root@VM_192_107_centos lualib]#
结合mongo加cjson的例子
- [root@VM_192_107_centos lua]# cat getChannels.lua
- local mongo = require "resty.mongol"
- local json = require("cjson")
- local conn = mongo:new()
- conn:set_timeout(1000)
- local ok, err = conn:connect("127.0.0.1",27017)
- if not ok then
- ngx.say("connect failed: "..err)
- end
- local db=conn:new_db_handle("meedo-service")
- local col = db:get_col("channels")
- local r = col:find_one({_id=1})
- value = json.encode(r)
- ngx.say(value)
来源:http://haoningabc.iteye.com/blog/2165119
nginx lua调用redis和mongo相关推荐
- Nginx+Lua脚本+Redis 实现自动封禁访问频率过高IP
前言:由于公司前几天短信接口被一直攻击,并且攻击者不停变换IP,导致阿里云短信平台上的短信被恶意刷取了几千条,然后在Nginx上对短信接口做了一些限制 临时解决方案: 1.查看Nginx日志发现被攻击 ...
- Nginx Lua读取redis 进行权限认证操作
之前的csdn找不回来了,决定重新注册一个.望支持~~~ 场景:nginx读取redis存储的标识进行重定向或ip拦截 废话不多说,直接lou代码: location /{set $tomcat_ip ...
- Nginx+lua 实现调用.so文件方法
本文给大家分享的是Nginx结合lua 实现调用.so动态链接库文件的方法和示例,有需要的小伙伴可以参考下 最近在和智能硬件部门一起,做一个室内定位的服务,该服务根据手机端传过来的beacon设备列表 ...
- nginx lua redis 访问频率限制(转)
1. 需求分析 Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等. 用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制的 ...
- nginx+lua+redis 灰度发布实现方案
背景: 公司要把现有的某传统项目进行微服务化,拆分后要分批次预发布,实现某部分使用户使用微服务模块,其他用户使用传统项目.待微服务稳定.无bug后全部用户迁移至微服务系统. 以上为背景,实现此方案使用 ...
- Nginx+Lua+Redis 对请求进行限制
Nginx+Lua+Redis 对请求进行限制 一.概述 需求:所有访问/myapi/**的请求必须是POST请求,而且根据请求参数过滤不符合规则的非法请求(黑名单), 这些请求一律不转发到后端服务器 ...
- nginx+lua+redis deny ip
2019独角兽企业重金招聘Python工程师标准>>> nginx+lua+redis实现ip黑名单 1.安装LuaJIT LuaJIT LuaJIT即采用C语言写的Lua代码的解释 ...
- 利用nginx+lua+redis实现反向代理方法教程
这篇文章主要给大家介绍了利用nginx+lua+redis实现反向代理方法教程,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧. 前言 最近因为工作需要,要进行IVR的 ...
- windows下nginx+lua+redis实现短域名服务
nginx+lua+redis 环境搭建: 我使用的是大牛 ZhangYichun 提供的集成包快速安装. 非常简单,下载 ngx_openresty,该集成包中有:Nginx,Lua或Luajit, ...
最新文章
- C++字符串数组排序技巧
- 从今天开始,学习Webpack,减少对脚手架的依赖(下)
- C++、C#写的WebService相互调用
- python查看dataframe数据类型_python pandas中DataFrame类型数据操作函数的方法
- 网络编程--Address already in use 问题
- oracle9i 随机端口_修改 Oracle9i 8080端口问题
- spring-beans下的BeanUtils.copyProperties
- 两个“敢”,是销售员必须懂的心法
- maven java web项目_Maven创建JavaWeb项目
- linux resin 自动启动不了,linux下开机启动nginx+resin
- 详解: Spark 相对于MapReduce的优势(为什么MapReduce性能不理想)
- [转载] 使用selenium_一日一技:使用Selenium的浏览器自动化
- Together与Visual.Studio.NET的结合使用(一)
- java httpclient 下载_java HttpClient 下载一张图片
- 虚拟机出现entering emergency mode,使用xfs_rapair出现Device or resource busy解决
- vim编辑器 解决vim编辑异常
- 用魔法打败魔法,传染性疫苗能消灭传染病吗?
- 计划任务和周期任务mail,at,batch,atq, atrm, cron, crontab
- scrapy爬虫之凤凰网热点新闻
- lol哪个服务器能玩无限火力,《lol》2021无限火力时间表公告 无限火力什么时候开放...
热门文章
- c语言将结果原模原样输出到文件,2013年9月全国计算机二级C语言程序设计上机模考试卷1.docx...
- 分布式文档系统-document id的手动指定与自动生成两种方式解析(来自学习笔记:龙果学院ES课程)
- 10Linux服务器编程之:opendir()函数,readdir()函数,rewinddir()函数,telldir()函数和seekdir()函数,closedir()函数
- 一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式
- SQL 分组使用案例
- ResNet 残差、退化等细节解读
- 错误sudo: pip: command not found解决方案
- Rainbond v5.1.2发布,微服务架构应用便捷管理和交付
- window系统下如何查看so库的信息
- hashCode()方法(覆盖hashCode()方法)