通过nginx实现动态代理解决方案

需求:动态调整转发策略
公司最近在布署fastdfs分布式文件系统,需要根据SDK来动态获取可使用的服务器信息,并将用户请求转发给可用的服务器。
比如A用户(001)的请求转发到A服务器(192.168.1.101),B用户(002)的请求转发到B服务器(192.168.1.102),C用户(003)的请求转发到A服务器(192.168.1.103),等等。

1、服务器上下文

前端nginx服务器 + N台后端应用服务器。准备用单台服务器模拟。
前端:192.168.1.101:80
后端:192.168.1.101:81

2、技术头脑风暴

程序员们脑袋里开始有好几个方案了,有的是直觉,有的是经验,如下:

a、写nginx模块,模块里实现读数据库或nosql,根据数据值做转发。
b、找现成的模块,看能不能直接改根据或脚本就可以解决。据说ngx_lua很强大,可以考虑。
c、服务器必须保证不能有任何阻塞,模块实现时得用nginx的subrequest机制。
d、blalala…

3、程序员的脑袋里装的什么呢?

简单

任务1:web程序员A,写个http api接口,返回具体的服务器信息(ip+port)。
任务2:系统工程师B,做个nginx配置,根据A的api让nginx根据返回信息实现动态转发。

4、开始实现:

任务1:分分钟搞定,写个php脚本呗。
任务2:继续拆解
任务2.1:实现最简单转发

任务2.2:实现动态转发

看下源码proxy_pass能不能使用变量

改下配置,测试ok,继续往下走

任务2.3:根据api设置变量$url的值

好像没有现成的模块,脑袋里过滤了一遍,有的话必须是跟subrequest有关的模块,想起了 auth_request 模块,它可以配置一个http请求,根据http请求的返回结果决定给客户端是否正常访问,去看下源码先。

从源码我们掌握两个信息:1、api返回状态码要为200 2、ngx_http_auth_request_set_variables 可能有我们要的信息,继续查看:

代码逻辑很简单,遍历这个模块的配置的某个成员,肯定是跟变量有关的了,找配置信息了

整理一下,就是当接收到api的返回信息后,模块处理了设置变量。so配置为如下,测试ok,继续

任务2.4:让$url的值从api返回信息里获取

(请不要在2.3里一步搞定整个模拟,保持每步正确和简单,是不是很像代码重构的原则)

我们要解决这个:auth_request_set $url 192.168.1.101:81;

nginx有什么变量可以让我们获取请求的返回信息呢,头部信息也可以(其实这里心里已经判断肯定只能从头部信息里获取,以对nginx的代码熟悉了解程度)。去看下获取变量值的函数吧。

到这里心里已经很有数了,写php代码,并且直接访问测试正常

api.php

改nginx配置:

搞定,心情特好 ,预期半个小时验证方案,提前5分钟完成。

5、整个方案整理:

a、> ./configure –with-http_auth_request_module && make && ./objs/nginx

b、nginx.conf

c、api.php

关于稚子

你们眼中的草根
此条目发表在BS架构后台语言, CS架构后台语言, 应用工具软件, 操作系统相关分类目录,贴了, 标签。将固定链接加入收藏夹。

通过nginx实现动态代理解决方案》有2条回应

  1. onew说:

    试了一下不行啊,不是首先调用api.php啊,是不是漏了什么关键信息?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注