- 浏览: 1482924 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (691)
- linux (207)
- shell (33)
- java (42)
- 其他 (22)
- javascript (33)
- cloud (16)
- python (33)
- c (48)
- sql (12)
- 工具 (6)
- 缓存 (16)
- ubuntu (7)
- perl (3)
- lua (2)
- 超级有用 (2)
- 服务器 (2)
- mac (22)
- nginx (34)
- php (2)
- 内核 (2)
- gdb (13)
- ICTCLAS (2)
- mac android (0)
- unix (1)
- android (1)
- vim (1)
- epoll (1)
- ios (21)
- mysql (3)
- systemtap (1)
- 算法 (2)
- 汇编 (2)
- arm (3)
- 我的数据结构 (8)
- websocket (12)
- hadoop (5)
- thrift (2)
- hbase (1)
- graphviz (1)
- redis (1)
- raspberry (2)
- qemu (31)
- opencv (4)
- socket (1)
- opengl (1)
- ibeacons (1)
- emacs (6)
- openstack (24)
- docker (1)
- webrtc (11)
- angularjs (2)
- neutron (23)
- jslinux (18)
- 网络 (13)
- tap (9)
- tensorflow (8)
- nlu (4)
- asm.js (5)
- sip (3)
- xl2tp (5)
- conda (1)
- emscripten (6)
- ffmpeg (10)
- srt (1)
- wasm (5)
- bert (3)
- kaldi (4)
- 知识图谱 (1)
最新评论
-
wahahachuang8:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
websocket的helloworld -
q114687576:
http://www.blue-zero.com/WebSoc ...
websocket的helloworld -
zhaoyanzimm:
感谢您的分享,给我提供了很大的帮助,在使用过程中发现了一个问题 ...
nginx的helloworld模块的helloworld -
haoningabc:
leebyte 写道太NB了,期待早日用上Killinux!么 ...
qemu+emacs+gdb调试内核 -
leebyte:
太NB了,期待早日用上Killinux!
qemu+emacs+gdb调试内核
参考
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;
否则可能会乱码
结果
#---------------mongo的基本操作--------------
http://wenku.baidu.com/link?url=K2rmB_5ypVHErZPvi1UucFXfnfEXk4IrvgSQzeSabKJx50W_gpD2cFvCEPQZm0sZgMvHGJTmZahK96Ee3n7OgZTb4gHgybQdZsQ2xGV4nZm
启动mongo
./mongod --dbpath=../data/db --logpath=../log/mongodb.log
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
mongo的测试
另外,nginx向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了哈
结果
结合mongo加cjson的例子
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)
发表评论
-
xl2tp 备份
2019-09-24 16:25 7332019年9月24日更新: 注意,需要开启firewall ... -
sdl笔记
2019-01-31 17:19 741sdl教程教程 https://github.com/Twin ... -
tinyemu
2019-01-24 17:59 1441参考https://bellard.org/jslinux/t ... -
aws搭建xl2tp给iphone使用
2018-12-26 21:37 19022019年12月26日 可以参考原来的配置 https:// ... -
consul的基本使用
2017-06-27 11:13 1409### 安装 [centos7上consul的安装](ht ... -
lvs的helloworld
2017-06-13 20:36 601###################lvs######### ... -
系统调用的helloworld
2017-05-04 16:14 660《2.6内核标准教程》 p293 #include < ... -
bitcoin和cgminer的安装
2017-04-05 22:45 1964参考 http://blog.csdn.net/rion_ch ... -
ceph安装和常用命令
2017-03-21 21:55 965/etc/hosts ssh-keygen ssh-copy- ... -
mobile terminal 笔记
2016-12-02 15:35 649找出旧的iphone4 越狱之后可以变个小操作系统 mobi ... -
socket基础和select(python)
2016-06-14 17:21 1807上接 c语言的socket基础ht ... -
socket基础(c语言)
2016-06-14 16:45 1007不使用select 普通的基础socket连接,对多个客户端的 ... -
ffmpeg+nginx 的直播(2,直播摄像头和麦克风)
2016-05-28 20:21 4385假设我的服务器是centos7 192.168.139.117 ... -
ffmpeg+nginx 的直播(1,直播播放的视频文件)
2016-05-26 17:11 661964位操作系统centos7 ############ 1.一 ... -
socat和netcat(nc)
2016-04-29 22:36 1756转 原文链接: http://www.wenquan.name ... -
neutron基础九(qemu nat网络)
2016-02-06 17:21 1631接上基础八,kvm透传nested忽略 1.在主机ce ... -
neutron基础八(qemu 桥接网络)
2016-02-06 13:13 1550qemu的桥接和nat的qemu启动命令是一样的,但是后续的脚 ... -
neutron基础七(qemu tap)
2016-02-02 17:02 1034使用qemu 建立个虚拟机 然后用tap设备, 根据基础六,t ... -
neutron基础六(bridge fdb)
2016-01-28 18:30 2281转发表 在三台机器上建立三个namespace 192.16 ... -
南北流量
2016-01-23 23:26 1837一、三层网络架构: 接入层:负责服务器的接入和隔离 汇聚层:汇 ...
相关推荐
在构建高性能、高可用性的Web服务时,常常会利用到Nginx作为反向代理和负载均衡器,Lua作为扩展Nginx功能的脚本语言,而Redis则作为内存数据存储,提供快速的数据访问。本资源包“nginx+lua+redis集群 连接插件和...
本文将讲述如何使用nginx、lua和redis来实现灰度发布,通过匹配客户端IP来实现灰度发布。灰度发布是一种常见的软件发布方式,它允许开发者在生产环境中发布新的版本,同时仍然保留旧版本,以便在出现问题时快速回退...
`lua`作为轻量级的脚本语言,可以增强`nginx`的功能,而`redis`则常用于高速缓存和分布式数据存储。本文将深入探讨如何利用`nginx+lua+redis`来实现`token`验证,以确保只有经过授权的用户才能访问受保护的资源。 ...
"Nginx、Lua、Redis 和 Json 的结合应用" Nginx 是一个高性能的 Web 服务器, Lua 是一种轻量级的脚本语言,而 Redis 是一个高性能的 NoSQL 数据库, Json 是一种轻量级的数据交换格式。通过结合使用这些技术,可以...
最近有个需求是需要用nginx播放服务器的视频,考虑安全问题,需要在nginx加个lua去取redis...1、内部含有liunx下安装nginx和lua环境所需的安装包 2、有本人亲自验证过的安装步骤。 3、替换里面jq_uat.lua的redis配置。
部署此类系统需要对Nginx、lua、PHP和Redis的配置有深入理解。开发者需要根据具体环境调整各项参数,确保系统的稳定性和高效性。 通过以上介绍,我们可以看出ngx_lua_php_queue是一个利用现有技术栈构建的灵活且可...
在构建高性能Web应用程序时,Nginx、Lua和Redis的组合提供了一种高效且灵活的解决方案。这种架构允许处理高并发请求,同时减轻服务器压力,提高响应速度。下面将详细介绍如何利用这三种技术来构建这样的系统。 首先...
综上所述,"nginx+lua+redis黑名单加载"是一种有效的网络安全策略,通过利用`nginx`的高性能和`lua`的灵活性,结合`redis`的快速存取能力,能够实时阻止黑名单中的IP进行访问,保护服务器资源和用户数据的安全。...
在现代Web服务的构建中,Nginx、Lua和Redis已经成为一种高效的组合,它们各自承担着不同的角色,共同构建出高并发、低延迟的系统。Nginx作为前端服务器,负责处理HTTP请求,Lua则用于提供灵活的脚本语言支持,而...
本文给大家介绍的是Nginx利用Lua+Redis实现动态封禁IP的方法,下面话不多说了,来一起看看详细的介绍吧 二、架构 实现 IP 黑名单的功能有很多途径: 1、在操作系统层面,配置 iptables,拒绝指定 IP 的网络请求; 2...
在构建高性能服务器架构时,`Lua`、`Redis` 和 `Nginx` 的结合使用是一种常见的技术方案。本文将详细探讨这三个组件及其在构建高效系统中的作用。 首先,`Lua` 是一种轻量级的脚本语言,以其简洁的语法、高效的执行...
**lua版WAF Web防火墙**是针对Web应用程序的安全防护系统,...总之,lua版WAF Web防火墙结合Redis和OpenResty Nginx,提供了一种高效且灵活的Web安全解决方案,能够有效地保护网站免受恶意攻击,同时便于管理和扩展。
在 Nginx 配置文件中,我们需要添加一个 Location 块来调用 Lua 脚本: ```nginx location /content_update { content_by_lua_file /root/lua/content_update.lua; } ``` 最后,我们需要重新启动 Nginx 并测试我们...
Nginx以其高性能、反向代理和负载均衡能力而闻名,而Lua则是一种轻量级的脚本语言,两者结合可以实现强大的服务器端功能。 一、Nginx基础 Nginx是一款开源的HTTP服务器,采用事件驱动的异步非阻塞模型,具有高并发...
在IT行业中,尤其是在Web...总结来说,整合Nginx、Redis和Lua是一种高效的方法,可以充分利用各自的优势,构建高性能、可扩展的Web服务架构。通过使用上述工具和模块,开发者可以创建出更灵活、更强大的Web应用程序。
lua-redis lua reis nginx 配制 及 redis.lua 脚本 redis.lua 脚本 支持 get, post redis 的hash, 及 集合 命令 开启redis的密码认证...nginxlua.conf 配制 lua地址: 示列: redis_lib.php 为PHP类包 redis_lua 类
【Redis开发】lua脚本开发nginx 与 redis 模块 (Lua script development nginx and Redis modules) 文件列表: lua_files (0, 2017-05-21) lua_files\access_control.lua (1813, 2017-05-21) lua_files\app_redis_...
- **可视化**:SkyWalking 提供了直观的 UI,可以显示请求流图和调用关系图。 **2. 使用方法** 安装 Nginx Lua 插件并配置 SkyWalking 需要以下步骤: 1. **下载插件**:获取 `nginx-skywalking-plugin-{Version}...
总的来说,"nginx+redis负载均衡、session共享"的架构提高了Web服务的可扩展性和可靠性,确保了用户在多台服务器间的会话一致性。在实际部署时,还需要考虑如容错处理、性能监控、安全策略等更多细节,以构建更健壮...