如何基于数据库参数实现Nginx循环代理转发配置?
嘿,我来帮你搞定这个Nginx根据数据库记录做代理转发的需求!
实现Nginx根据数据库记录代理请求到对应地址
需求梳理
我手里有个数据库,存着name、http_host、http_port三个字段,执行查询语句后的结果如下:
stardb=# select name, http_host, http_port from data ; name | http_host | http_port -------+---------------+----------- user2 | 127.0.0.1 | 80 user1 | 192.x.x.x. | 80
现在想在Nginx里实现逻辑:针对每个name,把请求代理转发到对应的http://$http_host:$http_port地址。
可行的Nginx配置方案
要实现这个,得用到Nginx的ngx_http_postgres_module模块来查询数据库,再结合变量拼接完成转发。下面是完整的配置示例:
# 先配置数据库连接(替换成你的真实数据库信息) postgres database dbname=stardb user=your_db_user password=your_db_pass host=127.0.0.1 port=5432; location /getIp { default_type 'text/plain'; # 开启rds_json模块,把数据库查询结果转为Nginx可识别的变量 rds_json on; # 初始化name变量(如果需要默认值可以在这里设置) set $name ''; # 从URL参数里获取name值(比如请求/getIp?name=user1) if ($arg_name) { set $name $arg_name; } # 转发数据库查询请求 postgres_pass database; # 根据name查询对应的http_host和http_port postgres_query GET "/getIp" "SELECT http_host, http_port FROM data WHERE name = '$name'"; # 拼接代理地址并转发请求 proxy_pass http://$rds_http_host:$rds_http_port; # 传递必要的请求头,保证后端服务能正确识别请求 proxy_set_header Host $rds_http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
关键配置说明
- 首先要确认你的Nginx已经编译了
ngx_http_postgres_module和rds_json模块,如果没有的话,需要重新编译Nginx并添加这两个模块。 postgres指令用来定义数据库的连接参数,记得替换成你自己的数据库用户名、密码、地址等信息。$arg_name会自动获取URL中name参数的值,比如用户请求/getIp?name=user2,就会查询到127.0.0.1:80并转发过去。rds_json模块会把数据库返回的查询结果映射成$rds_http_host和$rds_http_port变量,直接用来拼接代理地址就行。
如果你的需求是轮询所有数据库记录(比如循环把请求转发到每个用户的地址),那可以结合split_clients或者Lua模块来实现,但这种场景相对少见,上面的配置更贴合“根据指定name转发到对应地址”的常见需求。
内容的提问来源于stack exchange,提问作者Floriane
相关产品推荐
相关产品推荐

