Nginx Lua Redis 实现灰度发布
2023-09-14 09:16:40 时间
1、安装
2、用docker 启动 2个 nginx容器
[root@node3 conf]# docker ps
CONTAINER ID IMAGE COMMAND PORTS NAMES
b040478a0ab9 nginx "/docker-entrypoint.…" 0.0.0.0:82->80/tcp nginx82
95a82189cc81 nginx "/docker-entrypoint.…" 0.0.0.0:81->80/tcp nginx
3、访问 nginx 容器 prd 生产环境
访问 nginx82 容器 pre-prd 预发布环境
4、配置 nginx
http {
include mime.types;
default_type application/octet-stream;
lua_package_path "/usr/local/nginx/lua/redis.lua";
...
upstream prd {
server 192.168.2.103:81;
}
upstream pre-prd {
server 192.168.2.103:82;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
default_type 'text/html';
content_by_lua_file /usr/local/nginx/conf/conf.d/gray.lua;
}
location @prd {
proxy_pass http://prd;
}
location @pre-prd {
proxy_pass http://pre-prd;
}
...
5、创建 lua 脚本
vim /usr/local/nginx/conf/conf.d/gray.lua
# 脚本
local redis = require "resty.redis"
local cache = redis.new()
cache:set_timeout(60000)
local ok, err = cache.connect(cache, '127.0.0.1', 6379)
if not ok then
ngx.exec("@prd")
return
end
local local_ip = ngx.req.get_headers()["X-Real-IP"]
if local_ip == nil then
local_ip = ngx.req.get_headers()["x_forwarded_for"]
end
if local_ip == nil then
local_ip = ngx.var.remote_addr
end
-- 在 redis 中根据客户端 ip 获取是否存在值
local res, err = cache:get(local_ip)
-- 如果存在则转发到 @pre-prd
if res == "1" then
ngx.exec("@pre-prd")
return
end
-- 如果不存在,则转发到 @prd
ngx.exec("@prd")
local ok, err = cache:close()
if not ok then
ngx.say("failed to close:", err)
return
end
6、重启
nginx -t
nginx -s reload
7、测试
(1)现在 redis 里面还没有值,第一次访问,成功显示 prd 生产环境
(2)往 redis 插入 值,我本机 IP 为 192.168.2.199
(3)再次访问,成功显示 pre-prd 预发环境
相关文章
- 秒级消息推送:Redis实现(redis实现消息推送)
- Redis缓存实现实例解析(redis缓存例子)
- Redis集群实现安全同步(redis集群同步)
- 高效实现消息处理: Redis队列与PHP的并发技巧(redis队列并发php)
- 使用Redis优化Java开发的关键技巧(redis与java开发)
- 借助 Redis 实现应急容灾管理(redis 容灾)
- 部署Redis,收获快乐(怎么部署redis)
- 记录Redis操作前后变化,实现精准日志管理(记录redis操作日志)
- 查看Redis数据库实现的端口信息(查看redis数据库端口)
- 清空Redis服务器完全清除所有命令(清空所有redis命令)
- 测试结果Redis是否联通(测试redis是否联通)
- 无法解决的Redis连接问题(无法连接redis)
- 使用Redis管理数据从编码到实现(写程序用redis存数据)
- 秒杀火花飞舞实现方案Redis(如何用redis实现秒杀)
- 时间利用Redis实现过期时间设置功能(使用redis设置过期)
- Redis实现高并发写入(redis 高频写入)
- 精通Redis集群模式完整文档指南(redis集群模式文档)
- Redis阻塞工作机制剖析(redis阻塞工作原理)
- 利用Redis实现高效队列处理(redis队列处理机制)
- 使用Redis队列实现可视化(redis队列可视化)
- 重新缓存数据Redis利器(redis重新缓存数据)
- 速度飞快使用Redis获得最佳体验(redis 速度快)
- 基于 Redis 的连接审计系统构建(redis连接审计)
- Redis读写分离面试指南(redis读写分离面试题)
- 安装Redis集群仅需单台部署,尽享高效便捷(redis集群单数台)
- Redis实现计算坐标间距离有快有精(redis 计算坐标距离)
- 使用Redis缓解抢购压力(redis解决抢购问题)