Unix Domain Socketって何?

Unix Domain Socketは同一マシン上でプロセス間通信するための仕組みです。ソケットとは受け口、バケツみたいなイメージですがまさにその通りで受け口をつくっておいて通信が来るのをまっています。PHPでもPythonでもfast cgiでWEBアプリケーションみたいなシーンでは知っておく必要があります。

だいたいプロセスって何?

わかりやすくざっくりいうと、OS上で動いているプログラムでひとつひとつのプログラムをプロセスといいます。それぞれのプロセスは独立して動いていまして、OSがそれぞれのプロセスのCPUやメモリなどを割り当てたり引っ剥がしたり監視したりしてるわけです。

それぞれのプロセスは独立していますので、プロセス間でデータのやりとりをするときに困ります。やりかたはいくつか存在はしているのですが、やはりまどろっこしいのが実情です。

パイプ処理

たとえばパイプ処理。こんなシェルコマンド見たことないでしょうか。

ps ax | grep php

これは何をやっているかというと、psコマンドの結果をパイプして次のgrepコマンドに送っています。これも立派なプロセス間通信です。が、まどろっこしい・・・。

TCP通信

TCP通信でもプロセス間通信は可能です。ところがTCP通信の場合は、双方向通信のため大げさなんですよね。

プロセスA「よっこらしょ、TCPの準備するぜ・・・」
プロセスB「はぁ、TCPの準備するか・・・」
プロセスA「おーいBさん生きてるかー」
プロセスB「いきてるでー」
プロセスA「ほなおくるでー」
プロセスB「はいよー」

というようなやり取りを延々とやることになります。ですので、なかなか処理が重い。重いといっても今のコンピュータなら大した処理ではないですけれどやはり効率が良くないんですよね。メリットは同一ホストじゃなくても通信できることですかね。これは覚えておいてください。

よりシンプルなUnix Domain Socket

そこでもっと手軽に通信する仕組みとして、unix domain socketがあります。極端な事をいうと、口を開いてデータが来るのを待ってるだけです。

php-fpmの場合

ソケットファイルを書くように設定ファイルを指定してあげます。

# /etc/php/[some version]/pool.d/www.conf
listen = /var/run/php/php-fpm.sock

として上げてreloadすると /var/run/php/php-fpm.sock にソケットファイルが出来上がります。ls -l でファイルを見てみると先頭にsがついてると思います。

あとはnginxなりapacheなりでそのファイルを指定してあげると、お互いのプロセスで通信ができるようになるという寸法です。