OpenResty® 通过 Lua 扩展 NGINX 的可扩展 Web 平台

OpenResty XRay

为 OpenResty 及更多应用打造的先进可观测性

×

限时优惠

申请 试用版 今天并获得诊断 报告
Learn more
新! OpenResty 1.25.3.2 现已发布!
新! OpenResty 1.21.4.4 现已发布!
新! 新的博客文章 OpenResty XRay 移动应用简介 已发布。
新! 新的博客文章 使用 OpenResty XRay 定位 PHP 进程中的大型内存对象 已发布。

基于 URI 参数路由 MySQL 查询

张亦春 , 2011 年 11 月 16 日 (创建于 2011 年 11 月 16 日)

本示例演示如何根据 URI 查询参数的不同组合将传入请求路由到不同的 MySQL 查询,同时保留由 Drizzle Nginx 模块Rds Json Nginx 模块 提供的流式输出功能。

本演示使用由 OpenResty 捆绑的模块 Drizzle Nginx 模块Lua Nginx 模块Rds Json Nginx 模块Set Misc Nginx 模块

以下是 nginx.conf 的完整代码清单

worker_processes  2;
error_log logs/error.log warn;

events {
    worker_connections 1024;
}

http {
    upstream backend {
        drizzle_server 127.0.0.1:3306 protocol=mysql
                       dbname=ngx_test user=ngx_test password=ngx_test;
        drizzle_keepalive max=10 overflow=ignore mode=single;
    }

    server {
        listen 8080;

        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";
        }
    }
}

然后我们使用这个配置文件启动 Nginx 服务器,并使用我们的 /cats 服务进行测试,如下所示

$ curl 'localhost:8080/cats'
{"errcode":400,"errstr":"expecting \"name\" or \"id\" query arguments"}

$ curl 'localhost:8080/cats?name=bob'
[{"id":3,"name":"bob"}]

$ curl 'localhost:8080/cats?id=2'
[{"id":2,"name":null}]

实际输出行可能会因 cats 表中的实际内容而异。