nginx动态解析的实现

1 nginx 的upstream的解析,默认在nginx 启动后,缓存将永久,除非 -s reload。

如:
upstrem web_backend {
server web1:80;
}

在启动的时候web1的地址为1.1.1.1 (dns控制),后来架构调整 web1的地址变为2.2.2.2。然后这个时候nginx并不会自动感应到dns的变化,而是一直缓存着。 除非使用一下手段

  1. -s reload (但是是手动的或者脚本,在一定场合如 docker容器里面,是有局限性的,并且不至智能 )
  2. 使用第三方模块ngx_upstream_jdomain 模块 或者 nginx-upstream-dynamic-servers。但是这两个模块还有略有却别的。 以下文章将对这两个第三方模块做详细的介绍。

参考:
https://github.com/GUI/nginx-upstream-dynamic-servers/blob/master/README.md

https://github.com/wdaike/ngx_upstream_jdomain

介绍:
nginx-upstream-dynamic-servers 模块

使用方法: (resolver指令和 upstream要配套使用,否则报错,动态缓存时间vaild可设置,依赖知道那个的域名地址)


http {
...
      resolver 10.59.72.3 valid=30s;
....
}
upstream rpm {
    zone upstream_dynamic 64k;
    server ops-rpmbuild001.a.pa.com:8001 resolve;
}

特点

  1. 即使 指定的server不可被解析,nginx 也能被启动,不影响-t 检查只是有告警提示。
  2. 只依赖resolver指定的dns。

介绍2: jdomain模块

特点:

  1. 如果指定的server不可解析,nginx -t 检查将不通过,nginx是不能被启动的。
  2. 表明上不依赖http中 resolver指定的dns(即使没有启动也没问题),但是nginx的解析工作需要依赖,没有指定的话,会jdomian的动态工作特性将不生效,有可能会读取本地的/etc/hosts文件,但是后面也一直不会动态更新。

upstream rpm {
#server 1ops-rpmbuild001.a.pa.com:8001 resolve;
jdomain ops-rpmbuild001.a.pa.com port=8001 interval=5;
}

综合上述,其实使用 nginx-upstream-dynamic-servers 模块 是更好的。

原文地址:http://blog.51cto.com/cuidehua/2164546

时间: 2024-08-28 20:11:33

nginx动态解析的实现的相关文章

nginx源码分析--nginx模块解析

nginx的模块非常之多,可以认为所有代码都是以模块的形式组织,这包括核心模块和功能模块,针对不同的应用场合,并非所有的功能模块都要被用到,附录A给出的是默认configure(即简单的http服务器应用)下被连接的模块,这里虽说是模块连接,但nginx不会像apache或lighttpd那样在编译时生成so动态库而在程序执行时再进行动态加载,nginx模块源文件会在生成nginx时就直接被编译到其二进制执行文件中,所以如果要选用不同的功能模块,必须对nginx做重新配置和编译.对于功能模块的选

Protobuf动态解析在Java中的应用 包含例子程序

最近在做ProtoBuf相关的项目,其中用到了动态解析,网上看了下相关资料和博文都比较少,自己来写一个记录一下学习过程. Protocol Buffers是结构化数据格式标准,提供序列化和反序列方法,用于存储和交换.语言中立,平台无关.可扩展.目前官方提供了C++.Java.Python API,也有其他语言的开源api(比如php).可通过 .proto文件生成对应语言的类代码 如果已知protobuf内容对应的是哪个类对象,则可以直接使用反序列化方法搞定(Xxx.parseFrom(inpu

shell动态解析sql的binlog

#!/usr/bin #设置数据库连接 conn='mysql -hhost -Pport -uusername -ppassword' #获取最新的binlog文件 logfile=$($conn -e "show master logs" | tail -n 1 | awk -F" " '{print $1}') #设置a为1,用户下边的判断 a=1 #while循环 while true do #获取起始datetime fromDate=$(date &qu

使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)

在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象),在这篇文章中我将通过JToken.JObject和JArray来动态解析JSON对象,使它很容易创建和检索的JSON内容而无需基础类型.通过JObject和JArray创建JSON对象我们先用非常简单的方法来动态创建一些JSON,可通过JToken派生的JSON.NET对象来进行,最常见的JTo

Android 动态解析布局,实现制作多套主题

之前做过一个项目(随心壁纸),主要展示过去每期的壁纸主题以及相应的壁纸,而且策划要求,最好可以动态变换主题呈现方式,这样用户体验会比较好.嗯,好吧,策划的话,咱们也没法反驳,毕竟这样搞,确实很不错.于是开始去研究这方面的东西. 首先,我想到的是照片墙效果,改变图片就能有不同的呈现方式.可是这样的话,文字以及更深层的自定义效果,就无法实现了.然后,思考了下,决定仿照android原生布局文件解析方式,自己去动态解析布局. 先来看下android 原生布局文件解析流程: 第一步:调用LayoutIn

Nginx 配置解析

概述 在上一篇文章< Nginx 启动初始化过程>简单介绍了 Nginx 启动的过程,并分析了其启动过程的源码.在启动过程中有一个步骤非常重要,就是调用函数 ngx_init_cycle(),该函数的调用为配置解析提供了接口.配置解析接口大概可分为两个阶段:准备数据阶段 和 配置解析阶段: 准备数据阶段包括: 准备内存: 准备错误日志: 准备所需数据结构: 配置解析阶段是调用函数: /* 配置文件解析 */ if (ngx_conf_param(&conf) != NGX_CONF_O

在MVC中使用dotless后台动态解析LESSCSS的学习笔记

通过学习LessCSS,我们知道,Less是需要通过编译才能生成 .css 文件,主要使用三种方式进行编译: 1)使用第三方编译工具,在项目发布前编译好放在项目中. 2)在浏览器端解析执行,需要引用 less.js . 3)使用第三方程序集在后台动态解析,例如:在.net平台下的dotless. 这篇随笔记录了如何在.net MVC项目中使用dotless动态解析less. 具体实现 1.创建MVC4 Web的基本项目 在 Content 文件夹中添加 lesses 文件夹,并在该文件夹下添加自

nginx学习三 nginx配置项解析详解及代码实现

nginx配置项解析详解及代码实现 0回顾 在上一节,用nginx简单实现了一个hello world程序:当我们在浏览器中输入lochost/hello ,浏览器就返回:hello world.为什么会这样呢,简单一点说就是当我们请求访问hello这个服务,nginx就会看配置文件中是否有,如果有,根据具体的handler处理后把处理的结果返回给用户,没有就返回not found. location /hello { test_hello ;//无参数的配置 这其实是一个简单的配置.这节我们来

Nginx 动态添加模块

Nginx动态添加模块 1.首先查看现在已经编译的模块 /usr/local/nginx/sbin/nginx -V 2.下载需要编译的模块 wget https://github.com/yaoweibin/nginx_tcp_proxy_module/archive/master.zip 新模块:--add-module=/data/package/nginx_tcp_proxy_module-master/ #模块存放路径 3.进入nginx安装目录 进行重新编译,需要加上之前已经编译过的