unixドメインソケット
Nginxとアプリケーションサーバーの接続でunixドメインソケットが使われていた。
実務でこれまでこの辺のミドルウェアは触れることがなかったのでいい勉強になったということで軽くまとめておく。
unixドメインソケットとは
通常のソケット通信はネットワークを介してプロセス間通信を行うのに対し、unixドメインソケットはファイルシステムを介してプロセス間通信を行うもの。
カーネル内部で完結するため、ネットワーク経由の場合と比較して非常に高速であるが、外部インターフェースへの接続はできない。
そのため、接続するものは同一ホスト上に存在する必要がある。
複数コンテナ間で通信する際もdockerのContainer link使うよりunixドメインソケット使った方が高速らしい。
GoサーバーとNginxとの接続
今回はGoのサーバーとNginxをunixドメインソケットを使って接続した
詳細は省くが、nginxの設定ファイルで以下のように記述することで、接続用のファイルを/tmp/go.sock
に配置する。
go側の記述でこの/tmp/go.sock
をlistenするように記述する。
今回はフレームワークとしてechoを使った。
net.Listen
でunix
としてソケットファイルを渡してやればよい。
それをlistenerとして登録して起動させるのみ。
ファイルの実行権限を与える必要があるので744
を設定している。
開発時はポートで接続する
本番環境ではnginxを使って接続をするが、開発環境では直接ポートを使って接続したい。
なので環境変数を使ってこれらを振り分けるようにした。
先程のソケット通信の処理の前に以下の処理を追加するだけ。
あとは開発時はGO_ENV
にdevelopmentを渡してサーバーを起動させるだけでok
実際の起動の様子がこちら。
ログでもちゃんと立ち上げ方が変わっているのがわかる。
まとめ
unixドメインソケット名前しか知らなかった。
使い方とその利点がわかって満足。