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

OpenResty XRay

为 OpenResty 和更多平台打造的先进可观测性

×

限时优惠

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

基于 Redis 的动态路由

章亦春 , 2014 年 3 月 4 日(创建于 2011 年 7 月 27 日)

此示例演示如何使用 Redis 根据请求的 User-Agent 标头将传入请求路由到不同的 HTTP 后端。

此演示使用 Lua Nginx 模块Lua Resty Redis 库 组件,这两个组件在 OpenResty 中默认启用。

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

worker_processes  2;
error_log logs/error.log info;

events {
    worker_connections 1024;
}

http {
    server {
        listen 8080;

        location / {
            resolver 8.8.4.4;  # use Google's open DNS server

            set $target '';
            access_by_lua '
                local key = ngx.var.http_user_agent
                if not key then
                    ngx.log(ngx.ERR, "no user-agent found")
                    return ngx.exit(400)
                end

                local redis = require "resty.redis"
                local red = redis:new()

                red:set_timeout(1000) -- 1 second

                local ok, err = red:connect("127.0.0.1", 6379)
                if not ok then
                    ngx.log(ngx.ERR, "failed to connect to redis: ", err)
                    return ngx.exit(500)
                end

                local host, err = red:get(key)
                if not host then
                    ngx.log(ngx.ERR, "failed to get redis key: ", err)
                    return ngx.exit(500)
                end

                if host == ngx.null then
                    ngx.log(ngx.ERR, "no host found for key ", key)
                    return ngx.exit(400)
                end

                ngx.var.target = host
            ';

            proxy_pass http://$target;
        }
    }
}

然后让我们在本地主机:6379 上启动 redis 服务器

$ ./redis-server  # default port is 6379

并使用 redis-cli 工具向其中添加一些键

$ ./redis-cli
   redis> set foo apache.org
   OK
   redis> set bar nginx.org
   OK

然后让我们测试我们的 nginx 应用程序!

$ curl --user-agent foo localhost:8080
   <apache.org home page goes here>

   $ curl --user-agent bar localhost:8080
   <nginx.org home page goes here>

为了进一步优化性能,可以在 Lua Resty Redis 库 的 README 中查看文档,为 redis 连接启用连接池。

在对您在此处定义的接口进行基准测试之前,请确保您已将 nginx.conf 文件中的错误日志级别提升到 warnnotice,例如

error_log logs/error.log warn;

因为刷新错误日志是一个非常昂贵的操作,并且会严重影响性能。