设为首页 收藏本站
查看: 1419|回复: 0

[经验分享] openresty(nginx)、lua、drizzle调研

[复制链接]

尚未签到

发表于 2015-7-26 13:20:19 | 显示全部楼层 |阅读模式
一、概述:
  1.研究目标:nginx中使用lua脚本,及nginx直接访问mysql,redis
  2.需要安装的内容:
  openresty,mysql,redis
  3.OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器。它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项。http://openresty.org/cn/index.html
  
  
  二、安装说明
  
  0.环境准备
  $yum install -y gcc gcc-c++ readline-devel pcre-devel openssl-devel tcl perl
  1、安装drizzle http://wiki.nginx.org/HttpDrizzleModule
  cd /usr/local/src/   
wget http://openresty.org/download/drizzle7-2011.07.21.tar.gz     
tar xzvf drizzle-2011.07.21.tar.gz     
cd drizzle-2011.07.21/     
./configure --without-server     
make libdrizzle-1.0     
make install-libdrizzle-1.0     
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
  2、安装openresty     
wget http://openresty.org/download/ngx_openresty-1.7.2.1.tar.gz     
tar xzvf ngx_openresty-1.7.2.1.tar.gz     
cd ngx_openresty-1.7.2.1/     
./configure --with-http_drizzle_module     
gmake     
gmake install
  
  三、nginx配置nginx.conf
  
  
/usr/local/openresty/nginx/conf/nginx.conf
  # 添加MySQL配置(drizzle)            
upstream backend {            
    drizzle_server 127.0.0.1:3306 dbname=test user=root password=123456 protocol=mysql;            
    drizzle_keepalive max=200 overflow=ignore mode=single;            
}
  server {            
    listen       80;            
    server_name  localhost;
  #charset koi8-r;            
    #access_log  logs/host.access.log  main;
  location / {            
        root   html;            
        index  index.html index.htm;            
    }
  location /lua {            
        default_type text/plain;            
        content_by_lua 'ngx.say("hello, lua")';            
    }
  
    location /lua_redis {            
        default_type text/plain;            
        content_by_lua_file /usr/local/lua_test/redis_test.lua;            
    }  
  location /lua_mysql {            
            default_type text/plain;            
            content_by_lua_file /usr/local/lua_test/mysql_test.lua;            
    }
  
    location @cats-by-name {            
        set_unescape_uri $name $arg_name;            
        set_quote_sql_str $name;            
        drizzle_query 'select * from cats where name=$name';            
        drizzle_pass backend;            
        rds_json on;            
    }
  location @cats-by-id {            
        set_quote_sql_str $id $arg_id;            
        drizzle_query 'select * from cats where id=$id';            
        drizzle_pass backend;            
        rds_json on;            
    }
  location = /cats {            
        access_by_lua '            
            if ngx.var.arg_name then            
                return ngx.exec("@cats-by-name")            
            end
  if ngx.var.arg_id then            
                return ngx.exec("@cats-by-id")            
            end            
        ';
  rds_json_ret 400 "expecting \"name\" or \"id\" query arguments";            
    }
  # 通过url匹配出name,并编码防止注入,最后以json格式输出结果            
    location ~ '^/mysql/(.*)' {            
        set $name $1;            
        set_quote_sql_str $quote_name $name;            
        set $sql "SELECT * FROM cats WHERE name=$quote_name";            
        drizzle_query $sql;            
        drizzle_pass backend;            
        rds_json on;            
    }
  # 查看MySQL服务状态            
    location /mysql-status {            
        drizzle_status;            
    }            
}            

      
  
  四、lua测试脚本
  
/usr/local/lua_test/redis_test.lua
         
local redis = require "resty.redis"
local cache = redis.new()
cache.connect(cache, '127.0.0.1', '6379')
local res = cache:get("foo")
if res==ngx.null then
ngx.say("This is Null")
return
end
ngx.say(res)
  

/usr/local/lua_test/mysql_test.lua



local mysql = require "resty.mysql"
local db, err = mysql:new()
if not db then
ngx.say("failed to instantiate mysql: ", err)
return
end
db:set_timeout(1000) -- 1 sec
-- or connect to a unix domain socket file listened
-- by a mysql server:
--     local ok, err, errno, sqlstate =
--           db:connect{
--              path = "/path/to/mysql.sock",
--              database = "ngx_test",
--              user = "ngx_test",
--              password = "ngx_test" }
local ok, err, errno, sqlstate = db:connect{
host = "127.0.0.1",
port = 3306,
database = "test",
user = "root",
password = "123456",
max_packet_size = 1024 * 1024 }
if not ok then
ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)
return
end
ngx.say("connected to mysql.")
local res, err, errno, sqlstate =
db:query("drop table if exists cats")
if not res then
ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")
return
end
res, err, errno, sqlstate =
db:query("create table cats "
.. "(id serial primary key, "
.. "name varchar(5))")
if not res then
ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")
return
end
ngx.say("table cats created.")
res, err, errno, sqlstate =
db:query("insert into cats (name) "
.. "values (\'Bob\'),(\'\'),(null)")
if not res then
ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")
return
end
ngx.say(res.affected_rows, " rows inserted into table cats ",
"(last insert id: ", res.insert_id, ")")
-- run a select query, expected about 10 rows in
-- the result set:
res, err, errno, sqlstate =
db:query("select * from cats order by id asc", 10)
if not res then
ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")
return
end
local cjson = require "cjson"
ngx.say("result: ", cjson.encode(res))
-- put it into the connection pool of size 100,
-- with 10 seconds max idle timeout
local ok, err = db:set_keepalive(10000, 100)
if not ok then
ngx.say("failed to set keepalive: ", err)
return
end
-- or just close the connection right away:
-- local ok, err = db:close()
-- if not ok then
--     ngx.say("failed to close: ", err)
--     return
-- end
';
  

五、验证结果

curl测试
  $ curl 'http://127.0.0.1/lua_test'
hello, lua
  $ redis-cli set foo 'hello,lua-redis'
OK
$ curl 'http://127.0.0.1/lua_redis'
hello,lua-redis
  $ curl 'http://127.0.0.1/lua_mysql'
connected to mysql.
table cats created.
3 rows inserted into table cats (last insert id: 1)
result: [{"name":"Bob","id":"1"},{"name":"","id":"2"},{"name":null,"id":"3"}]
  $ curl 'http://127.0.0.1/cats'
{"errcode":400,"errstr":"expecting \"name\" or \"id\" query arguments"}
  $ curl 'http://127.0.0.1/cats?name=bob'
[{"id":1,"name":"Bob"}]
  $ curl 'http://127.0.0.1/cats?id=2'
[{"id":2,"name":""}]
  $ curl 'http://127.0.0.1/mysql/bob'
[{"id":1,"name":"Bob"}]
  $ curl 'http://127.0.0.1/mysql-status'
worker process: 32261
  upstream backend
  active connections: 0
  connection pool capacity: 0
  servers: 1
  peers: 1

  
  
  六、参考资料
  1.openresty http://openresty.org/cn/index.html
  2.tengine  http://tengine.taobao.org/documentation_cn.html
  
  如何安装nginx_lua_module模块
http://www.iyunv.com/yjf512/archive/2012/03/27/2419577.html
  
nginx+lua 项目使用记(二)
http://blog.chinaunix.net/uid-26443921-id-3213879.html
  
nginx_lua模块基于mysql数据库动态修改网页内容
https://www.centos.bz/2012/09/nginx-lua-mysql-dynamic-modify-content/
  突破log_by_lua中限制Cosocket API的使用
http://17173ops.com/2013/11/11/resolve-cosocket-api-limiting-in-log-by-lua.shtml
  17173 Ngx_Lua使用分享
http://17173ops.com/2013/11/01/17173-ngx-lua-manual.shtml
  关于 OPENRESTY 的两三事
http://zivn.me/?p=157
  Nginx_Lua
http://www.ttlsa.com/nginx/nginx-lua/
  
Nginx 第三方模块-漫谈缘起
http://www.iyunv.com/yjf512/archive/2012/03/30/2424726.html
  CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据
http://www.iyunv.com/kgdxpr/p/3550633.html
  Nginx与Lua
http://huoding.com/2012/08/31/156
  由Lua 粘合的Nginx生态环境
http://blog.zoomquiet.org/pyblosxom/oss/openresty-intro-2012-03-06-01-13.html
  Nginx 第三方模块试用记
http://chenxiaoyu.org/2011/10/30/nginx-modules.html
  
  agentzh 的 Nginx 教程(版本 2013.07.08)
http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html
  
  CentOS下Redis 2.2.14安装配置详解
http://www.iyunv.com/hb_cattle/archive/2011/10/22/2220907.html
  
  nginx安装
http://blog.iyunv.com/gaojinshan/article/details/37603157

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-90820-1-1.html 上篇帖子: Nginx添加到windows服务 下篇帖子: Windows版本nginx
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表