利用Nginx的resolver实现动态upstream
2017-09-15 00:01
337 查看
之前写了篇文章用openresty实现了一个动态路由,虽然说是动态的,但是实际上还是需要将upstream在配置文件中写好,还是相当于静态的。
最近工作中有这方面的需求,upstream是完全动态,由客户端来指定,开始的时候有一些错误,最后通过
当我发送这种请求:
报了如下错误:
很明显这个问题说明没有指定
这下请求都正常200了:
可以配置多个dns服务,nginx会采用轮询的方式去访问dns服务,nginx会缓存dns对域名解析的结果,缓存的时间由
最近工作中有这方面的需求,upstream是完全动态,由客户端来指定,开始的时候有一些错误,最后通过
resolver指定dns服务来完成,具体流程如下。
1. 开始踩坑
nginx的配置如下:worker_processes 1; events { worker_connections 1024; } http { server { listen 8001; server_name localhost; location / { set $upstream_host $http_upstream_host; echo $http_upstream_host; proxy_pass http://$upstream_host; } } }
当我发送这种请求:
curl "127.0.0.1:8001/" -H "upstream-host:www.baidu.com" -v
报了如下错误:
access.log: 127.0.0.1 - - [14/Sep/2017:23:37:10 +0800] "GET / HTTP/1.1" 502 179 "-" "curl/7.29.0" error.log: 2017/09/14 23:38:31 [error] 25307#25307: *48 no resolver defined to resolve www.baidu.com, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", host: "127.0.0.1:8001"
很明显这个问题说明没有指定
resolver导致自定义upstream
www.baidu.com。
2. 使用resolver定义域名解析
修改之后的nginx配置如下:worker_processes 1; events { worker_connections 1024; } http { resolver 114.114.114.114; server { listen 8001; server_name localhost; location / { set $upstream_host $http_upstream_host; echo $http_upstream_host; proxy_pass http://$upstream_host; } } }
这下请求都正常200了:
req: curl "127.0.0.1:8001/" -H "upstream-host:www.baidu.com" -voa curl "127.0.0.1:8001/" -H "upstream-host:www.qq.com" -voa access.log: 127.0.0.1 - - [14/Sep/2017:23:44:01 +0800] "GET / HTTP/1.1" 200 2381 "-" "curl/7.29.0" 127.0.0.1 - - [14/Sep/2017:23:44:07 +0800] "GET / HTTP/1.1" 200 244182 "-" "curl/7.29.0"
3. resolver使用说明
resolver的语法如下:Syntax: resolver address ... [valid=time] [ipv6=on|off]; Default: — Context: http, server, location
可以配置多个dns服务,nginx会采用轮询的方式去访问dns服务,nginx会缓存dns对域名解析的结果,缓存的时间由
valid指定,ipv6用于显示开启或者关闭ipv6。
Syntax: resolver_timeout time; Default: resolver_timeout 30s; Context: http, server, location
resolver_timeout用于指定dns解析的超时时间。
4. ref
http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver相关文章推荐
- 利用nginx的upstream实现负载均衡(带安装脚本)
- 利用nginx的proxy_next_upstream实现线路容灾
- 利用nginx的proxy_next_upstream实现线路容灾
- nginx(非openresty) 实现解析uri自动upstream并支持动态新增删除(redisCluster)节点(四种方式)
- android 中利用AChartEngine动态更新折线实现
- 利用配置实现企业网站快速搭建(动态内容生成静态网页)
- 浅谈linux 下,利用Nginx服务器代理实现ajax跨域请求。
- 利用java反射机制实现动态导出excel
- 利用AbstractRoutingDataSource实现动态数据源切换
- 利用C#的动态类型来实现与rails类似的元编程(2)
- nginx利用第三方模块nginx_upstream_check_module来检查后端服务器的健康情况
- 利用nginx+lua+memcache实现灰度发布
- win8退出时清除动态磁贴过期通知(利用组策略实现)
- nginx利用lua实现nginx反向代理proxy_store缓存文件自删除
- 利用oracle动态游标实现动态SQL循环遍历
- 利用反射,实现动态调用winform窗体(转)
- 润乾报表利用动态宏实现根据字符串参数顺序确定多层分组顺序
- 从零开始学 Java - 利用 Nginx 负载均衡实现 Web 服务器更新不影响访问
- 利用SpEL 表达式实现简单的动态分表查询
- JAVAWEB开发之Servlet3.0新特性的使用以及注解的详细使用和自定义注解的方法、动态代理的使用、利用动态代理实现细粒度的权限控制以及类加载和泛型反射