首页 > 其他分享 >openresty动态解析域名

openresty动态解析域名

时间:2023-12-12 17:59:31浏览次数:31  
标签:end log openresty local 域名 dns upstream 解析 ngx

废话不多说直接上代码

user  nobody;
worker_processes  auto;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections 100000 ;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;
    include nginx_status.conf;
}

stream {
    lua_shared_dict dns_cache 1m;
    
    init_worker_by_lua_block {
        local function update_dns()
            local resolver = require "resty.dns.resolver"
            local r, err = resolver:new{
			    -- 这里使用阿里云内网dns 请合理更换
                nameservers = {"100.100.2.138", {"100.100.2.136", 53}},
                retrans = 5,  -- 5 retransmissions on receive timeout
            }
    
            if not r then
                ngx.log(ngx.ERR, "failed to instantiate the resolver: ", err)
                return
            end
    
            local answers, err, tries = r:query("testcluster.redis.rds.aliyuncs.com", nil, {})
            if not answers then
                ngx.log(ngx.ERR, "failed to query the DNS server: ", err)
                return
            end
    
            if answers.errcode then
                ngx.log(ngx.ERR, "server returned error code: ", answers.errcode, ": ", answers.errstr)
                return
            end
    
            for i, ans in ipairs(answers) do
                if ans.address then
                    ngx.shared.dns_cache:set("myupstream", ans.address)
                    break
                end
            end
        end
    
        local ok, err = ngx.timer.at(0, update_dns)
        if not ok then
            ngx.log(ngx.ERR, "failed to create timer: ", err)
            return
        end
    
        local ok2, err2 = ngx.timer.every(30, update_dns)
        if not ok2 then
            ngx.log(ngx.ERR, "failed to create timer: ", err2)
            return
        end
    }

    log_format basic '$remote_addr [$time_local] '
                 '$protocol $status $bytes_sent $bytes_received '
                 '$session_time';

    access_log /data/logs/nginx-access.log basic buffer=32k; 


    log_format proxy '$remote_addr [$time_local] '
                 '$protocol $status $bytes_sent $bytes_received '
                 '$session_time "$upstream_addr" '
                 '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';


upstream linshibackend {
      server 0.0.0.1:1;  # just an invalid address placeholder
      balancer_by_lua_block {
          local balancer = require "ngx.balancer"
          local upstream = ngx.shared.dns_cache:get("myupstream")
          if not upstream then
              ngx.log(ngx.ERR, "failed to get upstream from dns_cache")
              return
          end

          local ok, err = balancer.set_current_peer(upstream, 19000)
          if not ok then
              ngx.log(ngx.ERR, "failed to set the current peer: ", err)
              return
          end
      }
}
server {
    listen 39000 so_keepalive=30m::10;
    proxy_pass linshibackend;
    access_log /logs/new.log proxy buffer=32k;
}
}

需要注意的几点

  1. lua_shared_dict 在 http 和 stream 上下文中都是独立的。也就是说,在 http 上下文中定义的 lua_shared_dict 在 stream 上下文中是不可见的,反之亦然。如果你在 stream 上下文中需要使用 dns_cache,你需要在 stream 上下文中重新定义它。所以本次我们是在stream中使用动态upstream,所以dict 初始化和 init work流程我们全部在stream 模块中执行。
  2. init 过程中不允许调用api阻塞初始化流程。所以dns请求过程要全部封装成函数update_dns。并使用ngx.timer.at 和 ngx.timer.every 后台执行。

标签:end,log,openresty,local,域名,dns,upstream,解析,ngx
From: https://www.cnblogs.com/leleyao/p/17897457.html

相关文章

  • Python爬取网站内容时,出现返回200和403状态码的原因解析
    在使用Python进行网页爬取时,我们有时会遇到返回200状态码表示成功,而有时会遇到返回403状态码表示访问被拒绝的情况。本文将解析造成这种情况的可能原因,并提供一些解决方法,以确保爬取网站内容的顺利进行。在使用Python进行网页爬取时,经常会遇到一种情况:有时成功返回200状态码,表示请......
  • 多模态AI:技术深掘与应用实景解析
     在当今人工智能技术的快速发展中,多模态AI凭借其独特的数据处理能力,成为了科技创新的前沿。这项技术结合了视觉、听觉、文本等多种感知模式,开辟了人工智能处理和理解复杂信息的新纪元。本文旨在深入探讨多模态AI的核心技术和其在现实世界中的应用场景,揭示这项技术如何推动科技前......
  • Hadoop NameNode(SecondaryNameNode) Fsimage和Edits解析
    NameNode被格式化之后,将在NameNode目录下产生一些文件1.Fsimage文件Fsimage文件是HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息1.查看Fsimage文件1.oiv命令hdfsoiv-p文件类型-i镜像文件-o转换后文件的输出路径hdfs......
  • 设计模式之单例模式:不同实现方式的深度解析
    什么是单例模式单例模式是一种常用的软件设计模式,其主要作用是保证某一个类只能有一个实例,并提供对该实例的全局访问点。单例模式有三个要点:1.某个类只能有一个实例。2.它必须自行创建这个实例。3.它必须自行向整个系统提供这个实例。单例模式的分类单例设计模式在具体实现......
  • 容器中域名解析流程以及不同dnsPolicy对域名解析影响
    本文分享自华为云社区《容器中域名解析流程以及不同dnsPolicy对域名解析影响》,作者:可以交个朋友。一、coreDNS背景部署在kubernetes集群中的容器业务通过coreDNS服务解析域名,Coredns基于caddy框架,将整个CoreDNS服务都建立在一个使用Go编写的HTTP/2Web服务器Caddy上。通过插件......
  • 高效的 Json 解析框架 kotlinx.serialization
    一、引出问题你是否有在使用Gson序列化对象时,见到如下异常:Abstractclassescan'tbeinstantiated!RegisteranInstanceCreatororaTypeAdapterforthistype.什么时候会出现如此异常。下面举个栗子:importcom.google.gson.Gsonimportcom.google.gson.reflect.Type......
  • 机器学习-线性回归-模型解析解-02
    1.解析解解析解的公式importnumpyasnpimportmatplotlib.pyplotasplt#有监督机器学习#XyX=2*np.random.rand(100,1)#np.random.rand#100行1列的[0,1)之间均匀分布*2之后则变成[0,2)之间均匀分布e=np.random.randn(100,1)#误差均值0......
  • ClickHouse(17)ClickHouse集成JDBC表引擎详细解析
    目录JDBC建表用法示例JDBC表函数资料分享参考文章JDBC允许CH通过JDBC连接到外部数据库。要实现JDBC连接,CH需要使用以后台进程运行的程序clickhouse-jdbc-bridge。该引擎支持Nullable数据类型。建表CREATETABLE[IFNOTEXISTS][db.]table_name(columnslist...)E......
  • isRef()、unRef()、toRef()、toRefs()深度解析,为啥解构会失去响应式?
    前言isRef()、unRef()、toRef()、toRefs()这几个函数他们各自都有什么功能,在什么场景下应用以及有哪些细节是我们没有注意到的,我们一起来看一下,为了方便大家理解和对照,这里以官方文档说明+解析的方式讲解。isRef()检查某个值是否为ref。类型tsfunctionisRef<T>(r:Ref......
  • stp生成树解析及其命令配置
    STP生成树协议概念:stp是为了解决网络中的环路问题的一个协议,当网络中有多余通信路径的时候,会选择一条主要路径阻塞备用端口(BP),因此网络拓扑类似树枝,所以叫做生成树协议stp运行原理://选举根交换机:选举根交换机是通过比较网桥ID(BID)来选举的,网桥ID(BID)的组成如下:优......