108:Unixドメインソケットによるリバースプロキシ接続

コラム: 謎のファイル .sock

  • 後輩W:Nginxから unix:/var/run/gunicorn.sock と指定する手順だったので指定したけれど、 No such file or directory というエラーが出ました。 ls /var/run/ してみたらファイルがなかったので別の環境から gunicorn.sock をコピーしてきたけど、動きません。

  • 先輩T:おっと、 gunicorn.sock はファイルじゃないからコピーで持ってきてもだめだぞ。

  • 後輩W:ファイルじゃない??

  • 先輩T:たぶん、Gunicornが gunicorn.sock を用意する構成だと思うけど、Gunicornの起動コマンドオプションはどうなってる?

  • 後輩W:systemdで gunicorn -b 0.0.0.0:8000 apps.wsgi:application になってます。

  • 先輩T:なるほど、それだとGunicornはTCP 8000で待ち受けしてるのにNginxがUnixドメインソケットでリバースプロキシ接続しようとしてエラーになってるんだね。

cover

(中略)詳細は書籍 自走プログラマー をご参照ください

ベストプラクティス

WebサーバーとWebアプリケーションサーバーの通信方式を合わせましょう。 可能なら、TCPよりも高速なUnixドメインソケットによるリバースプロキシ接続を使用しましょう。

Unixドメインソケット は ソケット 1 の一種で、ネットワーク通信で使います。 ソケットには、Unixドメインソケットの他に、 TCP/IPUDP などがあります。 ソケット通信を行うには、TCP/IP通信であれば <IP>:<PORT> を使用しますが、Unixドメインソケットによる通信では、ファイルパスを使用します 2 。 待ち受け側と接続側の両方でこのファイルパスを使うことで、ソケット通信ができるようになっています。

1

https://docs.python.org/ja/3/howto/sockets.html

2

他に、無名ソケットや、抽象名前空間を使ったソケットをバインドできます。詳しくは次のページを参照してください: https://linuxjm.osdn.jp/html/LDP_man-pages/man7/unix.7.html

cover

(中略)詳細は書籍 自走プログラマー をご参照ください