<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 使用動態DNS來完成HTTP請求 其實針對大多應用場景,DNS是不會頻繁變更的,使用nginx默認的resolver配置方式就能解決。 在奇虎360企業版的應用場景下,需要支持的系統眾多:win、centos、ubuntu等,不同的操作系統獲取dns的方法都不太一樣。再加上我們使用docker,導致我們在容器內部獲取dns變得更加難以準確。 如何能夠讓Nginx使用隨時可以變化的DNS源,成為我們急待解決的問題。 當我們需要在某一個請求內部發起這樣一個http查詢,采用proxy_pass是不行的(依賴resolver的dns,如果dns有變化,必須要重新加載配置),并且由于proxy_pass不能直接設置keepconn,導致每次請求都是短鏈接,性能損失嚴重。 使用resty.http,目前這個庫只支持ip:port的方式定義url,其內部實現并沒有支持domain解析。resty.http是支持set_keepalive完成長連接,這樣我們只需要讓他支持dns解析就能有完美解決方案了。 ~~~ local resolver = require "resty.dns.resolver" local http = require "resty.http" function get_domain_ip_by_dns( domain ) -- 這里寫死了google的域名服務ip,要根據實際情況做調整(例如放到指定配置或數據庫中) local dns = "8.8.8.8" local r, err = resolver:new{ nameservers = {dns, {dns, 53} }, retrans = 5, -- 5 retransmissions on receive timeout timeout = 2000, -- 2 sec } if not r then return nil, "failed to instantiate the resolver: " .. err end local answers, err = r:query(domain) if not answers then return nil, "failed to query the DNS server: " .. err end if answers.errcode then return nil, "server returned error code: " .. answers.errcode .. ": " .. answers.errstr end for i, ans in ipairs(answers) do if ans.address then return ans.address end end return nil, "not founded" end function http_request_with_dns( url, param ) -- get domain local domain = ngx.re.match(url, [[//([\S]+?)/]]) domain = (domain and 1 == #domain and domain[1]) or nil if not domain then ngx.log(ngx.ERR, "get the domain fail from url:", url) return {status=ngx.HTTP_BAD_REQUEST} end -- add param if not param.headers then param.headers = {} end param.headers.Host = domain -- get domain's ip local domain_ip, err = get_domain_ip_by_dns(domain) if not domain_ip then ngx.log(ngx.ERR, "get the domain[", domain ,"] ip by dns failed:", err) return {status=ngx.HTTP_SERVICE_UNAVAILABLE} end -- http request local httpc = http.new() local temp_url = ngx.re.gsub(url, "//"..domain.."/", string.format("//%s/", domain_ip)) local res, err = httpc:request_uri(temp_url, param) if err then return {status=ngx.HTTP_SERVICE_UNAVAILABLE} end -- httpc:request_uri 內部已經調用了keepalive,默認支持長連接 -- httpc:set_keepalive(1000, 100) return res end ~~~ 動態DNS,域名訪問,長連接,這些都具備了,貌似可以安穩一下。在壓力測試中發現這里面有個機制不太好,就是對于指定域名解析,每次都要和DNS服務回話詢問IP地址,實際上這是不需要的。普通的瀏覽器,都會對DNS的結果進行一定的緩存,那么這里也必須要使用了。 對于緩存實現代碼,請參考ngx_lua相關章節,肯定會有驚喜等著你挖掘碰撞。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看