Unixソケットって何? ― 一時 .sock を作ってTCPポートとの違いを観察する

Linux・CLI・DevOpsカテゴリを表すパンダのイラスト Linux・CLI・DevOps

この記事について
この記事は、生成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の入口として理解できます。

文書情報

記事タイトル
Unixソケットって何? ― 一時 .sock を作ってTCPポートとの違いを観察する
作成日
更新日
Source URL
https://papanda925.com/?p=15366

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

タイトルとURLをコピーしました