轉:原文:http://hambut.com/2016/09/09/how-to-resolve-the-domain-name-in-openresty/?utm_source=tuicool&utm_medium=referral
為什么我們的域名不能被解析
最近經常有朋友在使用一個域名地址時發現無法被正確解析
比如在使用Mysql
實例時某些雲會給一個私有的域名搭配自有的nameserver
使用
1 |
local client = mysql:new() |
以上代碼在直接使用時往往會報一個無法解析的錯誤。那么怎么在openresty
中使用域名呢
搭配 resolver 指令
我們可以直接在 nginx
的配置文件中使用 resolver
指令直接設置使用的 nameserver
地址。
官方文檔中是這么描述的
1 |
Syntax: resolver address ... [valid=time] [ipv6=on|off];
Default: —
Context: http, server, location |
一個簡單的例子
1 |
resolver 8.8.8.8 114.114.114.114 valid=3600s; |
不過這樣的問題在於nameserver
被寫死在配置文件中,如果使用場景比較復雜或有內部dns
服務時維護比較麻煩。
進階玩法
我們的代碼常常運行在各種雲上,為了減少維護成本,我采用了動態讀取本機/etc/resolv.conf
的方法來做。
廢話不說,讓我們一睹為快。
1 |
local pcall = pcall |
通過上述代碼我們成功動態拿到了一組nameserver
的地址,下面就可以通過resty.dns.resolver
大殺四方了
1 |
local require = require |
我這邊把解析的結果放入了lrucache
緩存了5分鍾,你們同樣可以把結果放入shared
中來減少worker
查詢次數。
高階玩法
現在我們已經實現了自緩存體系的dns
查詢,如果搭配resty.http就會達到更好的效果。
一個簡單的例子是,通過解析uri
得到hostname
、port
、path
,把hostname
扔給自緩存dns
獲取結果
發起request
請求,addr
+ port
connect 之,設置header
的host
為hostname
, path
等值來實現ip
直接訪問等高階用法。
這里就不過多的闡述了。
最終的演示例子如下
1 |
local client = mysql:new() |
如何使用 /etc/hosts 自定義域名
還有些同學可能會在hosts
文件中自定義域名和ip
,這時候resolve
是無法正常解析的。
這個時候可以借助dnsmasq
這個服務來緩存我們的dns
結果,而且hosts
文件中的定義可以被該服務識別。
需要在nginx
的配置文件中,設置resolver
為dnsmasq
服務的監聽地址即可。