先日、以下のような記事を書きました。dnsdistとNginxは、ネットワークセッションを使用して接続していますが、Nginxはunix socketでもlistenできることを思い出し、udpからunix socketに変換する方法はないか探していました。
単純にunix socketで接続したらパフォーマンスがスケールするのではないかなという思い付きだけです。
この手の定番ではsocatコマンドを使うのが良いみたいですが、情けない話今まで使ったこともありませんでした。
ちなみにこの手の記事についてはWebでも多くの記事が見受けられます。
socat(1): Multipurpose relay – Linux man page
socat – ソケットリレーツール (proxy) – Tomorrow is always fresh with no mistake in it.@備忘録 – アットウィキ
socat を使うと各種ソケットの操作が捗りまくる件 | CUBE SUGAR STORAGE
socat を使った簡易プロキシと、自作シェルスクリプトの自動起動 – Qiita
socatで仮想シリアルポートを作る – Qiita
53/udp
でlistenして、unix socket domainに接続すればよいのかと思い、以下のようにコマンドを実行しました。
Nginx側はunix socketで待ち受けるように変更します。
server {
#listen 127.0.0.1:1053 udp reuseport rcvbuf=4m sndbuf=4m;
#listen [::1]:1053 udp reuseport rcvbuf=4m sndbuf=4m;
#listen 127.0.0.1:1053 reuseport rcvbuf=4m sndbuf=4m;
#listen [::1]:1053 reuseport rcvbuf=4m sndbuf=4m;
listen unix:/var/run/1053.sock;
include /etc/nginx/proxy.conf;
proxy_pass recursor_backends;
}
socatは以下のようなコマンドで、53/udp
で待ち受けて、Nginx側でlistenしているunix socketに接続するというイメージです。
socat UDP-LISTEN:53,fork,reuseaddr UNIX-CONNECT:/var/run/1053.sock
で、待ち受けポートがあることを確認します。
$ sudo netstat -anup | grep :53
udp 0 0 0.0.0.0:53 0.0.0.0:* 8845/socat
しかし、digしても名前解決できず・・・
socatのデバッグ出力とかしてみたんですが、あまりよく分かっておらず。もうちょっとこの辺りも勉強が必要そうです。
unix-connect以外にもunix-listenとかありますが、今回の場合はnginxのunix socketに接続するから、違うよなぁという認識なのですが違うのかな・・・
この辺り、こうなんじゃないかなーという情報をお持ちの方、ご教授いただければ幸いです。