kasei_sanのブログ

かせいさんのIT系のおぼえがきです。胡乱の方はnoteとtwitterへ

UnicornとNginxの接続方法は、UNIXドメインソケットとリバースプロキシの2つの方法がある

UNIXドメインソケット

単一マシン上の高効率なプロセス間通信に用いられる機能・インターフェースの一種である

UNIXドメインソケット - Wikipedia

  • ファイルシステムを介してプロセス同士の通信を行う仕組み
  • 普通にリバースプロキシするより高速だが、ファイルシステムを介するので単一マシン上でしか動作できない
  • UnicornとNginxが同一マシン上にある場合は、これ一択

Railsの場合の設定方法

config/unicorn-config.rb

# Nginxとはソケット通信
listen "/tmp/unicorn.sock"
  • listen + ソケットのPATH でリスナーを設定する

nginx側の設定

http {
  upstream unicorn {
    server unix:/tmp/unicorn-cms.sock
  }
  location / {
     proxy_pass http://unicorn;
  }
}
  • serverunix:${path} で、unicornで設定したUNIXドメインソケットのpathを設定する
  • proxy_pass でリクエストをUNIXドメインソケットに渡す

リバースプロキシ

普通にTCP通信で、unicornにリクエストを投げる方法

  • UNIXドメインソケットより低速
  • UnicornとNginxが別マシンの場合はこちら

Railsの場合の設定方法

config/unicorn-config.rb

listen 3000
  • listen + ポート番号 でリスナーを設定する

nginx側の設定

http {
  upstream unicorn {
    server exsample.com:3000
  }
  location / {
     proxy_pass http://unicorn;
  }
}
  • serverドメイン:ポート番号 で、Unicornがある転送先を設定
  • proxy_pass でリクエストを転送先に渡す

DockerでUnicornとNginxが別コンテナの場合

別コンテナでもボリューム経由でファイルを共有できるので、UNIXドメインソケットを使える

やっぱりコンテナ間で通信より、早いらしいので、UNIXドメインソケットを使ったほうが良い

qiita.com

参考

qiita.com

www.honeybadger.io