在CentOS 6上使用openresty访问mysql

文/Zhangbingbo 2015-12-10 23:20:00

简介

OpenResty 能够使用Lua语言快速构造出足以胜任10K+并发连接响应的超高性能web应用, 构建web应用不可避免地会访问数据库,本篇介绍openresty如何访问mysql。

本教程适用于CentOS 6.x版本。

在使用Openresty访问mysql之前,您需要先建立Openresty工作环境,可以参考在CentOS 6上搭建openresty环境,参考在Centos 6上建立lnmp建立mysql环境。


建立mysql表

在mysql数据库中建立openresty数据库和user表,其中已设置mysql访问密码为'root':

$sudo mysql -uroot -proot
mysql> CREATE DATABASE IF NOT EXISTS openresty DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)
mysql> use openresty
Database changed
mysql> create table user ( id int(10) not null auto_increment, name varchar(80) not null default '', email varchar(80) not null default '', primary key(id)) DEFAULT CHARSET=UTF8;
Query OK, 0 rows affected (0.00 sec)

nginx的配置如下:

http {
    init_by_lua '
        mysql = require "resty.mysql"
        cjson = require "cjson"
        ';
    server {
        listen       80;
        server_name  localhost;
        location /insert {
            content_by_lua_file conf/user.lua;
        }
        location /delete {
            content_by_lua_file conf/user.lua;
        }
        location /query {
            content_by_lua_file conf/user.lua;
        }
    }
}

lua脚本文件user.lua如下:

function connect_mysql()
    local db, err = mysql:new()
    if not db then
        ngx.log(ngx.ERR, "failed to instantiate mysql: "..err)
        return
    end
    db:set_timeout(1000) -- 1 sec
    local ok, err, errno, sqlstate = db:connect{
                host = '127.0.0.1',
                port = 3306,
                database = 'openresty',
                user = 'root',
                password = 'root',
                max_packet_size = 1024 * 1024,
                pool = "openrestypool" }
    if not ok then
        ngx.log(ngx.ERR, "failed to connect: ", err, errno, sqlstate)
        return
    end
    return db
end

function keepalive(mydb)
    if httpdnsdb~=nil then
        local ok, err = mydb:set_keepalive(0, 1000)
        if not ok then
            ngx.log(ngx.ERR, "failed to set keepalive: ", err)
            return
        end
    end
end

function myquery(querystring)
    mydb=connect_mysql()
    if not mydb then
        ngx.say("mydb is nil.")
        return;
    end
    local res, err, errno, sqlstate = mydb:query(querystring)
    if err then
        ngx.say('"error":'..err)
    elseif res then
        ngx.say(cjson.encode(res))
    end
    keepalive(mydb)
end

ngx.req.read_body()
args=ngx.req.get_uri_args()
if (ngx.var.uri == '/insert') then
    ngx.req.set_header('Content-Type', 'text/html;charset=utf8');
    local queryString="INSERT INTO user(name, email) VALUES('".. args.name .. "','" .. args.email .. "')"
    myquery(queryString)
elseif (ngx.var.uri == '/delete') then
    ngx.req.set_header('Content-Type', 'text/html;charset=utf8');
    local queryString= "delete from user WHERE name='"..args.name.."'"
    myquery(queryString)
elseif (ngx.var.uri == '/query') then
    ngx.req.set_header('Content-Type', 'text/html;charset=utf8');
    local queryString= "select * from user WHERE name='"..args.name.."'"
    myquery(queryString)
end

启动nginx,并使用curl测试:

$ sudo /usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.conf
$ curl "http://127.0.0.1/insert?name=abc&email=abc@163.com"
{"insert_id":7,"server_status":2,"warning_count":0,"affected_rows":1}
$ curl "http://127.0.0.1/query?name=abc"
[{"email":"abc@163.com","name":"abc","id":7}]
$ curl "http://127.0.0.1/delete?name=abc"
{"insert_id":0,"server_status":34,"warning_count":0,"affected_rows":1}
$ curl "http://127.0.0.1/query?name=abc"
{}

总结

使用美团云主机,可以很方便地使用yum源获取软件,建立属于自己的openresty和lua环境,访问mysql,快速实现自己10k+的超高性能WEB应用。

知识共享许可协议
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

最新文章 全部