Nginx Lua calls Redis and MONGO

Source: Internet
Author: User
Tags curl explode findone json lua redis sort git clone

Reference
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
Installation:
Download ngx_openresty-1.7.2.1.tar.gz
./configure--prefix=/data/nginx/openresty/resty--with-luajit
Make
Make install
Modify Nginx.conf
Note Default_type Text/plain;
Otherwise the browser trigger is downloaded
CharSet UTF-8,GBK;
Otherwise it might be garbled.
Java code  

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   


Results
Java code
[root@VM_192_107_centos lua]# !curl  
curl http://localhost/lua  
set result: OK  
dog: an aniaml  
[root@VM_192_107_centos lua]# 

#---------------Basic operation of MONGO--------------
Http://wenku.baidu.com/link?url=K2rmB_5ypVHErZPvi1UucFXfnfEXk4IrvgSQzeSabKJx50W_ Gpd2cfvcepqzm0szgmvhgjtmzahk96ee3n7ogztb4ghgybqdzsq2xgv4nzm

Start MONGO
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");  

Installation of MONGO

git clone https://github.com/bigplum/lua-resty-mongol.git
Make Prefix=/data/nginx/openresty/resty Install
/data/nginx/openresty/resty the installation path for the installed Resty
will be in/data/nginx/openresty/resty/lualib/resty
Here are some Lua scripts to add Mongol

The LUA script for MONGO test:
Reference
Http://www.zhangjixuem.com.cn/2014/4/1/01037.html
Java code
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  

Test of MONGO
Java code
[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]#   



In addition, Nginx passes values to LUA
Java code
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)  

Configuration file:

Java code
location /lua_get {     
          content_by_lua_file /data/www/lua/test_get.lua;    
        }    

Test
Java code
[root@VM_192_107_centos lua]# !curl  
curl http://localhost/lua_mongo  
name: dog  
[root@VM_192_107_centos lua]# 

Post
Request: ' BBB '
[Root@vm_192_107_centos sbin]#
Reference http://www.server110.com/nginx/201310/2800.html

#-----------------Use the data_body of request and the parameters of 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
Look, there's a cjson.so down there.
Is that you can require Cjson, huh?
Java code  
local json = require ("cjson")
local request_method = ngx.var.request_method
local args = nil
local param = nil
local param2 = nil
--Get the value of the parameter
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"]
-Upgraded version (capable of processing forms with 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-- Determine whether it is a form of type multipart / form-data
                if string.sub (receive_headers ["content-type"], 1,33) == "application / x-www-form-urlencoded" then--judge whether it is a 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 is a request body conforming to the http protocol, not an ordinary string
                        ngx.say ("body_data:", body_data)
                        value = json.encode (body_data)
                        ngx.say (value)
                        a = json.decode (value)
                        ngx.say (a ['aa'])
                        --The size of the request body is larger than the client_body_buffer_size in the nginx configuration, which will cause the request body to be buffered to a temporary file on the disk. The client_body_buffer_size is 8k or 16k by default.
                        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 = ()
                        -Make sure to get the data of the request body
                        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--normal parameters
                                                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--file type parameter, capture is the parameter name, capture2 is the file name
                                                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)
                                 --Remove app_key, app_secret and other parameters, and pass business-level parameters to the internal API
                                 body_data = table.concat (new_body_data, boundary)-body_data is a request body conforming to the http protocol, not an ordinary string
                         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 ()

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.