最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nginx中動態(tài)upstream域名解析失效問題解決的幾種方法

 更新時間:2026年04月19日 11:26:41   作者:舞夢輝影  
本文主要介紹了Nginx中實(shí)現(xiàn)動態(tài)解析upstream域名的方法,強(qiáng)調(diào)了使用resolver指令與變量觸發(fā)、作用域正確、配置兼容三要素的重要性,并提供了四種解決方案,下面就來詳細(xì)的介紹一下

要讓 Nginx 對 upstream 中的域名做運(yùn)行時動態(tài)解析(而非僅啟動時靜態(tài)解析),關(guān)鍵不是簡單加個 resolver,而是必須滿足“變量觸發(fā) + 作用域正確 + 配置兼容”三要素。直接寫 proxy_pass http://api.example.com; 或在 upstream 塊里寫 server api.example.com;,無論有沒有 resolver,都只會解析一次。、

問題根源

# ? 錯誤示例:僅在啟動時解析一次
upstream backend {
    server api.example.com:8080;  # 啟動時解析,之后永遠(yuǎn)不變
}
location / {
    proxy_pass http://backend;
}

當(dāng)后端 IP 變化時,Nginx 仍指向舊 IP,導(dǎo)致請求失敗。

解決方案一:使用 resolver 指令(推薦)

基礎(chǔ)配置

http {
    # 1. 配置 DNS 解析器(必須放在 http/server/location 層級)
    resolver 8.8.8.8 8.8.4.4 valid=10s;  # Google DNS,TTL 10秒
    resolver_timeout 5s;
    server {
        listen 80;
        location /api/ {
            # 2. 使用變量強(qiáng)制動態(tài)解析
            set $backend "api.example.com";
            proxy_pass http://$backend:8080;
            # 3. 關(guān)鍵:配合 resolver 實(shí)現(xiàn)每次請求都解析(或按 TTL 緩存)
            proxy_http_version 1.1;
            proxy_set_header Host $host;
        }
    }
}

進(jìn)階:Consul/內(nèi)部 DNS 服務(wù)發(fā)現(xiàn)

http {
    # 針對 Consul 或 Kubernetes CoreDNS 優(yōu)化
    resolver 127.0.0.1:8600 valid=5s;  # Consul DNS 端口
    resolver_timeout 2s;
    # 可選:指定 DNS 搜索域
    resolver 10.96.0.10 valid=5s ipv6=off;  # K8s CoreDNS,禁用 IPv6 避免延遲
    server {
        location / {
            set $svc "user-service.service.consul";
            proxy_pass http://$svc:8080;
            # 連接池優(yōu)化:避免頻繁 DNS 查詢影響性能
            proxy_connect_timeout 2s;
            proxy_send_timeout 5s;
            proxy_read_timeout 10s;
        }
    }
}

解決方案二:upstream + resolver 組合(高可用)

需要負(fù)載均衡時,結(jié)合 upstream 動態(tài)解析:

http {
    resolver 10.0.0.2 valid=10s;
    # 定義 upstream 但使用域名變量
    upstream dynamic_backend {
        server 0.0.0.0;  # 占位,實(shí)際在 location 中解析
        # 健康檢查(需要 nginx_upstream_check_module 或商業(yè)版)
        check interval=3000 rise=2 fall=3 timeout=1000 type=http;
        check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
    }
    server {
        location / {
            # 關(guān)鍵:使用變量觸發(fā) resolver
            set $backend_nodes "app.service.consul";
            # 通過 Lua 或 split_clients 實(shí)現(xiàn)動態(tài)選擇(見方案三)
            proxy_pass http://$backend_nodes;
        }
    }
}

解決方案三:Lua 動態(tài)解析(OpenResty)

最靈活的方式,完全控制解析邏輯:

http {
    resolver 127.0.0.1:8600;
    server {
        location / {
            access_by_lua_block {
                local resolver = require "resty.dns.resolver"
                -- 1. 創(chuàng)建 DNS 客戶端
                local dns, err = resolver:new{
                    nameservers = {"127.0.0.1", {"127.0.0.1", 8600}},
                    retrans = 2,
                    timeout = 1000,
                }
                -- 2. 查詢 SRV 記錄(Consul 推薦)
                local answers, err = dns:query("user-service.service.consul", 
                                               {qtype = dns.TYPE_SRV})
                -- 3. 動態(tài)選擇節(jié)點(diǎn)(加權(quán)隨機(jī))
                if answers then
                    local target = answers[math.random(1, #answers)]
                    ngx.var.target_host = target.target
                    ngx.var.target_port = target.port
                else
                    -- 降級到靜態(tài)配置
                    ngx.var.target_host = "127.0.0.1"
                    ngx.var.target_port = "8080"
                end
            }
            set $target_host "";
            set $target_port "";
            proxy_pass http://$target_host:$target_port;
        }
    }
}

解決方案四:Nginx Plus(商業(yè)版)

如果預(yù)算允許,Nginx Plus 提供原生動態(tài)解析:

upstream backend {
    zone upstream_backend 64k;
    # 關(guān)鍵:resolve 參數(shù)啟用動態(tài) DNS
    server api.example.com:8080 resolve;
    # 健康檢查
    health_check interval=5s fails=3 passes=2;
}
server {
    location / {
        proxy_pass http://backend;
        health_check;
    }
}

關(guān)鍵配置參數(shù)詳解

參數(shù)說明推薦值
valid=10sDNS 緩存 TTL微服務(wù)環(huán)境 5-10s,穩(wěn)定服務(wù) 60s
ipv6=off禁用 IPv6 解析純 IPv4 環(huán)境建議關(guān)閉,避免延遲
resolver_timeout單次 DNS 查詢超時2-5s
resolver 位置必須在 http{}、server{} 或 location{}通常放 http{} 全局

常見問題排查

1. 解析不生效(仍使用舊 IP)

# ? 錯誤:直接寫死域名,不會觸發(fā) resolver
proxy_pass http://api.example.com:8080;
# ? 正確:使用變量強(qiáng)制動態(tài)解析
set $backend "api.example.com";
proxy_pass http://$backend:8080;

2. 日志中出現(xiàn) no resolver defined

# 錯誤原因:location 中使用了變量,但上級未定義 resolver
# 解決:確保 resolver 在 http 或 server 層級定義
http {
    resolver 8.8.8.8;  # 必須在這里定義,不能只在 location
}

3. DNS 查詢延遲高

# 優(yōu)化:本地 DNS 緩存 + 連接池
resolver 127.0.0.1 valid=5s;  # 指向本地 dnsmasq/unbound
upstream backend {
    keepalive 100;  # 連接池,避免每次新建連接
    keepalive_timeout 60s;
    keepalive_requests 1000;
}

生產(chǎn)環(huán)境完整配置模板

http {
    # DNS 配置(多可用區(qū)冗余)
    resolver 10.0.0.2 10.0.0.3 valid=10s ipv6=off;
    resolver_timeout 3s;
    # 日志記錄解析詳情(調(diào)試用)
    log_format dns_log '$remote_addr - $upstream_addr [$time_local] '
                      '"$request" $status $body_bytes_sent '
                      'upstream: "$upstream_addr" '
                      'resolve: "$upstream_http_host"';
    upstream app_servers {
        zone app_zone 64k;
        keepalive 100;
        # 占位 server,實(shí)際在 location 中動態(tài)解析
        server 127.0.0.1:1 backup;  # 備用,防止啟動失敗
    }
    server {
        listen 80;
        access_log /var/log/nginx/access.log dns_log;
        location / {
            # 動態(tài)解析核心配置
            set $backend_host "app.service.consul";
            set $backend_port "8080";
            proxy_pass http://$backend_host:$backend_port;
            # 錯誤降級
            proxy_intercept_errors on;
            error_page 502 503 504 = @fallback;
            # 連接優(yōu)化
            proxy_connect_timeout 3s;
            proxy_next_upstream error timeout http_502 http_503 http_504;
            proxy_next_upstream_tries 2;
        }
        location @fallback {
            internal;
            return 503 '{"error":"Service Unavailable","retry_after":10}';
        }
    }
}

核心要點(diǎn):resolver + 變量 是實(shí)現(xiàn)動態(tài) DNS 的黃金組合,務(wù)必確保使用 $variable 形式編寫 proxy_pass,否則 Nginx 會優(yōu)化為啟動時靜態(tài)解析。

到此這篇關(guān)于Nginx resolver指令解決動態(tài)upstream域名解析失效問題的文章就介紹到這了,更多相關(guān)Nginx upstream域名解析失效問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Nginx配置同時支持http和https的兩種方式

    Nginx配置同時支持http和https的兩種方式

    現(xiàn)在的網(wǎng)站支持Https幾乎是標(biāo)配功能,Nginx能很好的支持Https功能,本文主要介紹了Nginx配置同時支持http和https的兩種方式,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • centos6.4下nginx1.12.1安裝教程

    centos6.4下nginx1.12.1安裝教程

    這篇文章主要為大家詳細(xì)介紹了centos6.4下nginx1.12.1安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 國外著名論壇程序IPB(Invision Power Board)在nginx下的配置示例

    國外著名論壇程序IPB(Invision Power Board)在nginx下的配置示例

    這篇文章主要介紹了國外著名論壇程序IPB(Invision Power Board)在nginx下的配置示例,使用fastcgi配置模式,需要的朋友可以參考下
    2014-07-07
  • Nginx日志文件在哪及如何從中提取時間信息

    Nginx日志文件在哪及如何從中提取時間信息

    Nginx提供了一個非常靈活的日志記錄功能,它可以使每個塊的配置擁有各自獨(dú)立的日志進(jìn)行記錄,并且根據(jù)記錄內(nèi)容的不同又分為訪問日志和錯誤日志,這篇文章主要介紹了Nginx日志文件在哪及如何從中提取時間信息的相關(guān)資料,需要的朋友可以參考下
    2025-10-10
  • Nginx啟動常見錯誤及解決方法

    Nginx啟動常見錯誤及解決方法

    重新啟動服務(wù)器發(fā)現(xiàn)報nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)錯誤,怎么回事如何解決呢,下面腳本之家小編給大家解答下
    2016-08-08
  • nginx請求時找路徑問題解決

    nginx請求時找路徑問題解決

    當(dāng)你安裝了nginx的時候,為nginx配置了如下的location,想要去訪問路徑下面的內(nèi)容,可是總是出現(xiàn)404,找不到文件,這是什么原因呢,今天我們就來解決這個問題,感興趣的朋友一起看看吧
    2023-10-10
  • filebeat收集json格式的tomcat日志詳解

    filebeat收集json格式的tomcat日志詳解

    這篇文章主要為大家介紹了filebeat收集json格式的tomcat日志詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • nginx查看配置文件的操作方法

    nginx查看配置文件的操作方法

    nginx的配置放在nginx.conf文件中,一般我們可以使用以下命令查看服務(wù)器中存在的nginx.conf文件,這篇文章主要介紹了nginx查看配置文件,需要的朋友可以參考下
    2024-02-02
  • Nginx服務(wù)器上安裝SSL證書方式

    Nginx服務(wù)器上安裝SSL證書方式

    該文詳細(xì)介紹了在Nginx服務(wù)器上搭建HTTPS的過程,包括檢查和安裝http_ssl_module模塊、下載并配置SSL證書、修改nginx.conf文件及設(shè)置自動跳轉(zhuǎn)HTTPS等步驟
    2026-04-04
  • 由于Nginx配置文件問題導(dǎo)致打不開網(wǎng)站unknown directive的解決

    由于Nginx配置文件問題導(dǎo)致打不開網(wǎng)站unknown directive的解決

    這篇文章主要介紹了由于Nginx配置文件問題導(dǎo)致打不開網(wǎng)站unknown directive,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06

最新評論

和龙市| 六安市| 历史| 张家川| 孟村| 华安县| 望江县| 马边| 隆德县| 肇庆市| 通州市| 德清县| 肇东市| 大方县| 吉安市| 鲁甸县| 辽阳市| 桑植县| 且末县| 隆昌县| 宜兰县| 伊金霍洛旗| 区。| 象山县| 泸水县| 堆龙德庆县| 察雅县| 上饶市| 定安县| 隆安县| 梁平县| 从化市| 南靖县| 苍梧县| 武平县| 新沂市| 于都县| 寿阳县| 炉霍县| 三台县| 克什克腾旗|