⛩️

DockerでnginxのstreamプロキシのDNS解決設定

2022/06/18に公開

nginxのupstreamのDNSによる名前解決は起動時のみでキャッシュされる。
そのためDNSを利用したフェールオーバーや負荷分散に課題があります。
※商用版ではupstreamの機能で解決可能です。

nginxのstreamの設定

次のような設定で対処した。
確認用に接続先はwww.yahoo.co.jpで実施している。

stream {
    resolver 127.0.0.11 valid=1s;
    error_log /log/nginx/stream.log info;

    map "" $backend_server {
        default www.yahoo.co.jp:80;
    }
    
    server {
        listen       0.0.0.0:8888;
        proxy_pass $backend_server;
    }
}

実行時のログ

実際に接続されるIPが変化することを確認

[info] 9#9: *14 proxy 172.18.0.22:45222 connected to 182.22.16.251:80
[info] 9#9: *16 proxy 172.18.0.22:45228 connected to 182.22.16.251:80
[info] 9#9: *18 proxy 172.18.0.22:48756 connected to 183.79.219.252:80
[info] 9#9: *20 proxy 172.18.0.22:48824 connected to 183.79.219.252:80
[info] 9#9: *22 proxy 172.18.0.22:50624 connected to 183.79.250.251:80
[info] 9#9: *42 proxy 172.18.0.22:42474 connected to 183.79.250.123:80
[info] 9#9: *60 proxy 172.18.0.22:44254 connected to 182.22.25.124:80 

参考ページ

調べるといくつか対応方法がでてくる。

https://qiita.com/minamijoyo/items/183e51a28a3a9d79182f
https://serverfault.com/questions/1010342/nginx-using-resolver-in-a-stream
https://dev.classmethod.jp/articles/docker-service-discovery/
https://www.ponkotsu-log.com/entry/2017/07/02/002353
https://blog.kkty.jp/entry/2019/04/08/083113

Discussion