この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。LinuxのUnix domain socket資料とTCPの仕様を基準に、本番のPHP-FPM socketを触らず、一時ディレクトリだけで.sockの正体を観察する手順にしています。
検証ステータス:📘 公式情報確認済み・ローカル実行未確認
NginxやPHP-FPMの設定に出てくる .sock は、普通の設定ファイルとは限りません。Unix domain socketは同じホスト内のプロセス間通信に使えるSocketで、pathname socketではIPアドレスとポートの代わりにファイルシステム上のパスを名前として使います。
まず動かす
本番の /run/php/*.sock は触りません。/tmp の専用一時ディレクトリでPython標準ライブラリだけを使います。
ターミナル1:
TMPDIR="$(mktemp -d)"
SOCK="$TMPDIR/demo.sock"
export SOCK
echo "[START] socket path=$SOCK"
python3 - <<'PY'
import os, socket
path = os.environ['SOCK']
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
server.bind(path)
server.listen(1)
print('[LISTEN]', path, flush=True)
conn, _ = server.accept()
data = conn.recv(1024)
print('[RESULT] recv =', data.decode(), flush=True)
conn.sendall(b'ACK_UNIX')
conn.close()
server.close()
print('[SUCCESS] server finished', flush=True)
PY
[LISTEN] が出たらターミナル2から接続します。ターミナル1で表示されたpathを SOCK に入れてください。
export SOCK='/tmp/表示されたディレクトリ/demo.sock'
python3 - <<'PY'
import os, socket
client = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
client.connect(os.environ['SOCK'])
client.sendall(b'HELLO_UNIX')
print('[RESULT]', client.recv(1024).decode())
client.close()
PY
LinuxのUnix domain socketは unix(7) で説明されています。
ここを見る
サーバー待機中に別ターミナルから確認します。
ls -l "$SOCK"
先頭のファイル種別が通常ファイルとは異なることを観察できます。pathはファイルシステム上に見えますが、中身を保存する普通のテキストファイルとして扱うものではありません。
flowchart LR
C[Client process] --> U[Unix domain socket path]
U --> S[Server process]
C -. IP/portを使わない .-> S
TCP localhostと何が違う?
TCPなら通常は 127.0.0.1:9000 や [::1]:9000 のようにIPアドレスとポートで通信相手を表します。pathname型Unix socketでは /run/php/php-fpm.sock のようなpathが通信口になります。
TCPそのものの現行仕様はRFC 9293です。
同一ホスト内だけで通信する構成ではUnix socketが使われることがありますが、「常にTCPより速い」「常にUnix socketが正解」と単純化しません。運用・権限・コンテナ境界なども設計要素です。
1か所変えてみる
socket pathの名前だけ demo.sock から app.sock へ変えます。IP/portではなくpathが名前になっていることを再確認できます。
SOCK="$TMPDIR/app.sock"
後始末
サーバー終了後に一時socketとディレクトリを削除します。
rm -f "$SOCK" rmdir "$TMPDIR" 2>/dev/null || true echo '[CLEANUP] temporary socket removed'
プロセスが異常終了するとsocket pathだけ残る場合があるため、実用品では起動前・終了時のcleanupを設計します。
PHP-FPMでは何を見ればよい?
PHP-FPMの listen がpathname socketを指し、Nginx側のFastCGI設定が同じsocketを指す構成があります。障害調査では次を分けて見ます。
socket pathが存在するか
所有者・group・mode
PHP-FPM processがlistenしているか
Nginx側が同じpathを参照しているか
本番socketをテスト目的で削除しない
今回のデモは本番設定を変更せず、「.sock が通信口になる」という部分だけを再現しています。
仕事で使うなら
/runの本番socketを勝手に削除しないsocketの権限を安易に777へしない
service user/groupを確認する
コンテナや別ホスト間通信ではpath共有の前提を確認する
stale socketのcleanupを設計する
公式情報・一次情報
まとめ
pathname型Unix domain socketは、同じホスト内の通信相手をファイルシステム上のpathで表せます。一時 .sock を自分で作り、ls と送受信結果を見れば、PHP-FPM設定に出てくるsocketを「ただのファイル」ではなくIPCの入口として理解できます。
