其他相关文章请看这里!
OpenResty是个什么鬼?
谷歌浏览器自定义请求头之ModHeader插件
使用 redis根据请求的User-Agent标头将传入的请求路由到不同的HTTP后端
- 采用了模块Redis2 Nginx的模块, Lua的Nginx的模块,Lua的Redis的解析库,并设置其它的Nginx模块集束OpenResty
配置
创建logs 目录用于存放日志,conf 用于存放配置文件。
代码语言:javascript复制 mkdir /home/www
cd /home/www/
mkdir logs/ conf/
conf 目录下创建一个 nginx.conf 文件
代码语言:javascript复制worker_processes 1;
error_log logs/error.log info;
events {
worker_connections 1024;
}
http {
upstream apache.org {
server apache.org;
}
upstream nginx.org {
server nginx.org;
}
server {
listen 8080;
location = /redis {
#仅限内部调用
internal;
#授权
#redis2_query auth 'pwd';
#参数解释
#set_unescape_uri 解码设置参数
#$arg_key请求中的的参数名,这个变量包含GET请求中,如果有变量key时的值。即“?”后面的key=value形式的key
#$args请求中的参数值,字符串连接
set_unescape_uri $key $arg_key;
redis2_query get $key;
redis2_pass 192.168.56.2:6379;
}
location / {
set $target '';
#access_by_lua在请求访问阶段处理,用于访问控制,适用于http、server、location、location if
#content_by_lua是内容处理器,接受请求并输出响应,适用于location、location if
access_by_lua '
local key = ngx.var.http_user_agent
-- 在使用上面的方法时, 第一个参数只能是内部请求.这里的内部请求是特指nginx配置文件中的internal 路由
local res = ngx.location.capture(
"/redis", { args = { key = key } }
)
print("key: ", key)
-- 连接redis结束nginx
if res.status ~= 200 then
ngx.log(ngx.ERR, "redis server returned bad status: ",
res.status)
ngx.exit(res.status)
end
-- redis返回空结束nginx
if not res.body then
ngx.log(ngx.ERR, "redis returned empty body")
ngx.exit(500)
end
-- 此模块主要是处理redis请求和响应的
local parser = require "redis.parser"
-- redis返回结果解析判断失败结束nginx
local server, typ = parser.parse_reply(res.body)
if typ ~= parser.BULK_REPLY or not server then
ngx.log(ngx.ERR, "bad redis response: ", res.body)
ngx.exit(500)
end
print("server: ", server)
ngx.var.target = server
';
#请求转发
proxy_pass http://$target;
}
}
}
启动 (如果没有任何输出,说明启动成功,-p 指定我们的项目目录,-c 指定配置文件。)
代码语言:javascript复制nginx -p `pwd`/ -c conf/nginx.conf
#查看nginx进程是否启用
ps -ef|grep nginx|grep -v grep
测试
测试前准备
docker安装redis
代码语言:javascript复制# 命令来查看可用版本
docker search redis
# 拉取官方的最新版本的镜像
docker pull redis:latest
# 查看是否已安装了 redis
docker images
#运行redis容器
#–requirepass 设置密码
#–appendonly 开启redis 持久化
#例如 docker run -itd --name myredis -p 6379:6379 redis --requirepass "123456" --appendonly yes
docker run -itd --name konga-redis -p 6379:6379 redis
#查看容器的运行
docker ps
连接客户端写入路由
代码语言:javascript复制redis> set foo apache.org
OK
redis> set bar nginx.org
OK
linux测试访问
代码语言:javascript复制#访问到apache.org首页
curl --user-agent foo localhost:8080
#访问到nginx.org首页
curl --user-agent bar localhost:8080
- chrome浏览器测试
- 假设你已经安装好`ModHeader`插件,文章开始已经列出了安装插件的相关文章,请自行去了解。
- 设置User-Agent:foo 访问到apache.org首页,设置User-Agent:bar访问到nginx.org首页