如何在 K8s 环境中自动管理网关服务器(使用 OpenResty Edge)
基于 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
文件中的错误日志级别提升到 warn
或 notice
,例如
error_log logs/error.log warn;
因为刷新错误日志是一个非常昂贵的操作,并且会严重影响性能。