在实际需求中,我们遇到了这样一个需求:在研发环境
和测试环境
使用相同的域名,期望根据访问者IP
将访问请求转发到对应环境,并能对IP
与环境
的绑定关系进行管理。基于此我们调研最后实现这个需求。方案核心点:OpenResty方案: Nginx+lua + redis 实现根据访问者IP
将访问请求转发到对应环境,并能对IP
与环境
的绑定关系进行管理,redis用于管理用户Client IP和环境的绑定关系。
1 需求调研
在研发环境
和测试环境
使用相同的域名,期望根据访问者IP
将访问请求转发到对应环境,并能对IP
与环境
的绑定关系进行管理。
2 方案概述
- 使用
OpenResty
(集成了 Nginx 和 Lua )对用户请求进行转发 - 使用
Redis
来存储用户 IP 与环境的绑定关系数据 - 使用禅道操作
Redis
来管理用户 IP 与环境的绑定关系
3 部署实践
3.1 OpenResty 部署
3.1.1 OpenResty 安装
1 | sudo yum install -y yum-utils |
3.1.2 OpenResty 配置
3.1.2.1 nginx 配置
路径:/usr/local/openresty/nginx/conf/nginx.conf
- 配置文件路径根据 openresty 安装目录变化
- 配置文件中
lua_package_path
字段值也要根据 openresty 安装目录变化
配置样例:
1 | user root root; |
3.1.2.2 代理域名配置
路径:/usr/local/openresty/nginx/conf/conf.d/domain.conf
- 配置文件路径根据 openresty 安装目录变化
- 配置文件中
access_log、error_log、rewrite_by_lua_file
字段值也要根据 openresty 安装目录变化
配置样例:
1 | server { |
3.1.2.3 Lua脚本
路径:/usr/local/openresty/nginx/conf/proxy.lua
- 配置文件路径根据 openresty 安装目录变化
- 配置文件中
file_err
字段值也要根据 openresty 安装目录变化
配置样例:
1 | -- 日志文件 |
注意事项:
- redis connect
- redis auth
- redis db
3.2 Redis 数据结构
键 | 键备注 | 值 | 值备注 |
---|---|---|---|
domain:<request_domain>:clientip:<client_ip>:domain | 字符串类型 <request_domain>为客户端请求的域名 <client_ip>为客户端IP 示例:domain:demo.com:clientip:172.17.18.237:domain |
<target_domain> | 字符串类型 <target_domain>为绑定的目标域名 示例:st2-demo.com |
domain:<request_domain>:clientip:<client_ip>:host | 字符串类型 <request_domain>为客户端请求的域名 <client_ip>为客户端IP 示例:domain:demo:clientip:172.17.18.237:host |
<target_host>:<target_port> | 字符串类型 <target_host>为绑定的目标服务器IP <target_port>为绑定的目标服务器端口 示例:172.16.0.221:80 |
3.3 禅道操作
3.3.1 新增代理域名
- 新增一份该域名的代理域名配置到对应目录
- 禅道生成文件到指定目录下
- 通过rsync同步改目录到OpenResty的对应目录
- 重现加载 OpenResty Nginx模块
- openresty/nginx/sbin/nginx -s reload
- 在Redis中设置一个键值,作为重新加载的标志
- OpenResty部署服务器设置一个定时任务,检测Redis中的标志,决定是否重新加载启动Nginx
3.3.2 修改用户绑定
- 按照 Redis 数据结构,修改上述2个键对应的值(新增、更新、删除)