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 ()