尝试在 lua-nginx-module 中使用适用于存储(memcache,MySQL,redis)的适配器

既然如此,我想使用nginx+lua-nginx-module的Storage适配器。

nginx (+ lua-nginx-module) で利用できるStorage向けのアダプタについては
lua-nginx-moduleのREADME.mdに書かれている。

そのうち、リポジトリからgit cloneして、nginx.confにlua_package_pathを書いて
ライブラリまでのパスさえ指定してあげれば使えるものは以下の通り。

    • lua-resty-memcached

 

    • lua-resty-redis

 

    lua-resty-mysql

Memcached, Redis, MySQL向け。Postgres向けのはlua-restyではなく
別途となり、ちょっと使うのめんどくさそうなので割愛。

一つ一つ使って行ってみよう。

准备 lua-nginx-module。

nginx + lua-nginx-moduleのビルド、インストールについてはこちらを参照してください。
Mac OS X向けの解説になってるので、他のOSを使ってる場合は
適宜パスなり置き換えてください… (あくまで自己検証用としてやってるので…)

验证环境

检验环境如下所示:

説明バージョンOSMac OS X 10.8.3nginx1.4.0lua-nginx-modulev0.8.1

lua-resty-memcached是一个用于访问Memcached的Lua库。

这个适配器是专为memcached而设计的,正如它的名字所示。

安装memcached

首先让我们来设置memcached。可以使用Homebrew轻松地进行设置。
然后启动它,让它待机。

> brew install memcahced
> memcached -vv

使用命令安装lua-resty-memcached。

lua-resty-memcachedを使うため、リポジトリからgit cloneしよう。

> cd /usr/local/nginx-1.4.0/lua-lib/
> git://github.com/agentzh/lua-resty-memcached.git
> cd lua-resty-memcached
> git checkout -b v0.11 v0.11  

nginx.confの設定

nginx.confを以下の形に書き換えて試しに使おう。

worker_processes  1;

error_log  logs/error.log;
pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {

    include       mime.types;
    default_type  text/plain;

    access_log  logs/access.log;

    sendfile        on;
    keepalive_timeout  65;

    gzip  on;

    lua_package_path "/usr/local/nginx-1.4.0/lua-lib/lua-resty-string/lib/?.lua;/usr/local/nginx-1.4.0/lua-lib/lua-resty-memcached/lib/?.lua;;";

    server {
        listen       8080;
        server_name  localhost;

        access_log  logs/host.access.log;

        location /get {
            content_by_lua '
                local memcached = require "resty.memcached"
                local client, err = memcached:new()
                client:connect("127.0.0.1", 11211)

                local val, flags, err = client:get("bucket")
                ngx.say("Value is: ", val)
            ';
        }

        location /set {
            content_by_lua '
                local memcached = require "resty.memcached"
                local client, err = memcached:new()
                client:connect("127.0.0.1", 11211)

                local args = ngx.req.get_uri_args()
                client:set("bucket", args.value)

                ngx.say("Saved!")
            ';
        }
    }
}

确认行动

使用curl命令来访问路径,并验证是否可以将值存储到memcached中,并能够检索出来。

lua-resty-memcached

嗯,没问题。 (Mm, .)

Lua-resty-redis

安装Redis

使用 Homebrew 快速安装 Redis,然后启动它。

> brew install redis
> redis-server --loglevel verbose 

安装lua-resty-redis

为了使用lua-resty-redis,你应该从代码仓库中克隆git并保存下来。

> cd /usr/local/nginx-1.4.0/lua-lib/
> git://github.com/agentzh/lua-resty-redis.git
> cd lua-resty-redis
> git checkout -b v0.15 v0.15 

nginx.conf文件的配置

将nginx.conf文件进行如下修改。

worker_processes 1;

error_log  logs/error.log;
pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {

    include       mime.types;
    default_type  text/plain;

    access_log  logs/access.log;

    sendfile        on;
    keepalive_timeout  65;

    gzip  on;

    lua_package_path "/usr/local/nginx-1.4.0/lua-lib/lua-resty-string/lib/?.lua;/usr/local/nginx-1.4.0/lua-lib/lua-resty-redis/lib/?.lua;;";

    server {
        listen       8080;
        server_name  localhost;

        access_log  logs/host.access.log;

        location /get {
            content_by_lua '
                local redis = require "resty.redis"
                local client = redis:new()
                client:connect("127.0.0.1", 6379)

                local args = ngx.req.get_uri_args()
                local key, field = args.key, args.field

                local result, err = client:hmget(key, field)
                ngx.say(result)
            ';
        }

        location /set {
            content_by_lua '
                local redis = require "resty.redis"
                local client = redis:new()
                client:connect("127.0.0.1", 6379)

                local args = ngx.req.get_uri_args()
                local key, field, val = args.key, args.field, args.value

                client:hmset(key, field, val)
                ngx.say("Saved!")
            ';
        }
    }
}

确认操作

curlでパスにアクセスしredisに対し
特定のハッシュフィールドに値を保存できたり引き出せたりできるか確認する。

lua-resty-redis

嗯,没事的。

lua-resty-mysql

MySQL的安装

使用Homebrew快速安装MySQL。

> brew install mysql
> mysql.server start

创建数据库、表和访问用户

使用MySQL客户端访问MySQL数据库。

mysql -h localhost -u root -p

创建用于nginx的测试数据库、表格和用户等。

> create database nginx_test;
> use nginx_test;
> create table nginx_test_table (   
      id int not null primary key auto_increment,   
      comment text not null 
    )Engine=InnoDB Default charset=utf8;
> grant all on nginx_test.* to 'nginx_test'@'localhost' identified by 'nginx_test';
> exit;

我要确认一下是否能够访问到这个表。

> mysql -h localhost -u nginx_test --password="nginx_test" -A nginx_test; 
> show tables;

安装 lua-resty-mysql

为了使用 lua-resty-mysql,在代码仓库中进行 git clone。

> cd /usr/local/nginx-1.4.0/lua-lib/
> git://github.com/agentzh/lua-resty-mysql.git
> cd lua-resty-mysql
> git checkout -b v0.13 v0.13 

将nginx.conf文件的配置内容翻译为中文。

将nginx.conf配置文件进行如下修改。

worker_processes  1;

error_log  logs/error.log;
pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {

    include       mime.types;
    default_type  text/plain;

    charset utf8;

    access_log  logs/access.log;

    sendfile        on;
    keepalive_timeout  65;

    gzip  on;

    lua_package_path "/usr/local/nginx-1.4.0/lua-lib/lua-resty-string/lib/?.lua;/usr/local/nginx-1.4.0/lua-lib/lua-resty-mysql/lib/?.lua;;";

    server {
        listen       8080;
        server_name  localhost;

        access_log  logs/host.access.log;

        location /get {
            content_by_lua '
                local mysql = require "resty.mysql"
                local db, err = mysql:new()

                db:connect{
                    host = "127.0.0.1",
                    port = 3306,
                    database = "nginx_test",
                    user = "nginx_test",
                    password = "nginx_test"
                }

                local result, err, errno, sqlstate =
                    db:query("SELECT `comment` FROM `nginx_test_table` ORDER BY `id` DESC")

                for idx, records in pairs(result) do
                    for key, record in pairs(records) do
                        ngx.say(record)
                    end
                end

                db:close()
            ';
        }

        location /set {
            content_by_lua '
                local mysql = require "resty.mysql"
                local db, err = mysql:new()

                db:connect{
                    host = "127.0.0.1",
                    port = 3306,
                    database = "nginx_test",
                    user = "nginx_test",
                    password = "nginx_test"
                }

                local args = ngx.req.get_uri_args()
                local comment = ngx.quote_sql_str(args.comment)

                db:query(
                  "INSERT INTO `nginx_test_table` (`comment`) VALUES (" .. comment .. ")"
                )

                ngx.say("Saved!")

                db:close()
            ';
        }
    }
}

核实动作

使用curl访问路径,验证是否可以向mysql添加记录。

lua-resty-mysql

嗯,没问题。

bannerAds