[nginx][socket][relay] socatコマンドを使ってUDPをunix socketに変換できないか試してみた。

AIX、UNIX、LinuxNetwork
20181208_dns_proxy.png

先日、以下のような記事を書きました。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に接続するから、違うよなぁという認識なのですが違うのかな・・・

この辺り、こうなんじゃないかなーという情報をお持ちの方、ご教授いただければ幸いです。

この記事を書いた人

kometchtech

うつ病を患いながら、IT業界の末席にいるおっさんエンジニア。科学計算をしたことがないのに、HPC分野にお邪魔している。興味のある分野で学習したことをblogにまとめつつ、うつ病の経過症状のメモも置いておく日々。じつはRouterboard User Group JPの中の人でもある。 Amazon欲しいものリスト / Arm板を恵んでくれる人募集中

kometchtechをフォローする
タイトルとURLをコピーしました