尝试在 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を使ってる場合は
適宜パスなり置き換えてください… (あくまで自己検証用としてやってるので…)
验证环境
检验环境如下所示:
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中,并能够检索出来。

嗯,没问题。 (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-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添加记录。

嗯,没问题。