openresty(nginx)、lua、drizzle调研

一、概述:

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.cnblogs.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.cnblogs.com/yjf512/archive/2012/03/30/2424726.html

CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据

http://www.cnblogs.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.cnblogs.com/hb_cattle/archive/2011/10/22/2220907.html

 

nginx安装

http://blog.csdn.net/gaojinshan/article/details/37603157

时间: 2024-08-03 19:28:25

openresty(nginx)、lua、drizzle调研的相关文章

安装OpenResty(Nginx+Lua)开发环境

一.简介 OpenResty? 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超高并发.扩展性极高的动态 Web 应用.Web 服务和动态网关. OpenResty? 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台.这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支

【原创】大叔问题定位分享(36)openresty(nginx+lua)中获取不到post数据,ngx.req.get_body_data返回nil

openresty(nginx+lua)中获取不到post数据,ngx.req.get_body_data返回nil This function returns nil if the request body has not been read, the request body has been read into disk temporary files, or the request body has zero size. 打开nginx调试日志 error_log /var/log/ng

高频访问IP限制 --Openresty(nginx + lua) [反爬虫之旅]

嗯-.本人是从写爬虫开始编程的,不过后面做web写网站去了,好了,最近web要搞反爬虫了,哈哈哈,总算有机会把之以前做爬虫时候见识过的反爬一点点给现在的网站用上了~ 做爬虫的同志,有怪莫怪喽~还有求别打死 > < 首先要提一下AJAX,现在普天下网页几乎都是往特定的数据接口请求数据了,除了什么首屏渲染这种服务端渲染好html以外,几乎没有什么静态网页了.我看了有一些帖子说AJAX让爬虫难做,可是我觉得结合一些工具(比如chrome的开发者工具),找到AJAX所请求的后端数据接口一点也不难,而且

搭建OpenResty(Nginx+Lua)

这篇文章是一个多月前写的,当时之所以搭建这个是为了最大程度上发挥Nginx的高并发效率(主要是结合lua脚本),参考的话,主要参考张开涛先生写的跟开涛学Nginx+lua系列文章,地址为:https://jinnianshilongnian.iteye.com/blog/2190344 当时本人按照张开涛写的一步一步搭建,当然了也发现一些小问题,所以在此将其发表出去,另外强调一点,开发人员无论是平时编写代码或者是调研新技术或者实践,最好也写写文档总结一下. 我写文档的主要目的,一来让自己思路更加

OpenResty(Nginx)+Lua+GraphicsMagick实现缩略图功能

http://www.hopesoft.org/blog/?p=1188 2.用法 原始图片是input.jpg,尺寸:160×120 1)只缩小不放大 1 gm convert input.jpg -resize "500x500>" output_1.jpg 加了>,表示只有当图片的宽与高,大于给定的宽与高时,才进行“缩小”操作.生成的图片大小是:160×120,未进行操作如果不加>,会导致图片被比等放大. 2)等比缩图 (缺点:产生白边) 1 gm conver

nginx lua redis 访问频率限制(转)

1. 需求分析 Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等. 用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制的需求. Nginx处理请求的过程一共划分为11个阶段,分别是: post-read.server-rewrite.find-config.rewrite.post-rewrite. preaccess.access.post-access.try-files.content.log. 在openre

nginx+lua+redis(openresty)配置

nginx+lua+redis(openresty)配置 2014-07-18 11:10 2494人阅读 评论(1) 收藏 举报 方案一: 1.安装lua解释器 wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz (http://luajit.org/download.html) 配置lua Lib和include/luajit-$version目录为环境变量 2.下载ngx_devel_kit和lua-nginx-module https:

使用Nginx+Lua(OpenResty)开发高性能Web应用

在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开发主要是以C/C++模块的形式进行,整体学习和开发成本偏高:如果有一种简单的语言来实现Web应用的开发,那么Nginx绝对是把好的瑞士军刀:目前Nginx团队也开始意识到这个问题,开发了nginxScript:可以在Nginx中使用JavaScript进行动态配置一些变量和动态脚本执行:而目前市面上

Nginx+Lua(OpenResty)开发高性能Web应用

使用Nginx+Lua(OpenResty)开发高性能Web应用 博客分类: 跟我学Nginx+Lua开发 架构 ngx_luaopenresty 在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开发主要是以C/C++模块的形式进行,整体学习和开发成本偏高:如果有一种简单的语言来实现Web应用的开发,那么Nginx绝对是把好的瑞士军刀:目前Ngin