原理實際行就是stream模式,因為nginx 支持基於stream 模式的lb同時支持(tcp.udp)以下是一個簡單的配置
環境准備
- docker-compose 文件
version: "3"
services:
lb:
image: openresty/openresty:alpine
volumes:
- "./nginx-lb.conf:/usr/local/openresty/nginx/conf/nginx.conf"
- "./dns.log:/var/log/nginx/dns.log"
ports:
- "53:53/udp"
- "53:53/tcp"
- nginx 配置
worker_processes 1;
user root;
events {
worker_connections 1024;
}
stream {
upstream dns_servers {
server 114.114.114.114:53;
server 8.8.8.8:53;
server 8.8.8.4:53;
}
server {
listen 53 udp;
listen 53; #tcp
proxy_pass dns_servers;
error_log /var/log/nginx/dns.log info;
}
}
- 啟動
docker-compose up -d
測試
- dig 測試
dig @127.0.0.1 baidu.com
效果 
說明
有點不太好的,默認的不支持health check,當然我們可以基於openresty 的stream 模塊進行擴展,這樣就可以更好的利用dns 做一些比較
強大的功能(比如coredns,consul)
參考資料
https://www.nginx.com/blog/load-balancing-dns-traffic-nginx-plus/
https://github.com/StalkR/dns-reverse-proxy
