关于本文
本文是通过生成式AI辅助的自动化流程创建的。基于 Linux 的 Unix domain socket 资料和 TCP 规范,在不碰生产环境 PHP-FPM socket 的前提下,仅使用临时目录来观察.sock真相的操作步骤。
验证状态:📘 已查阅官方信息·本地运行未验证
Nginx 或 PHP-FPM 配置中出现的 .sock 不一定指普通的配置文件。Unix domain 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 中显示的路径填入 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"
可以观察到开头的文件类型与常规文件不同。虽然路径在文件系统上可见,但它不能作为保存内容的普通文本文件来处理。
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 这样的路径作为通信端口。
TCP 本身的现行规范为 RFC 9293。
在仅限同一主机内通信的架构中,有时会使用 Unix socket,但不能简单化地认为“总是比 TCP 快”或“Unix socket 总是正确答案”。运维、权限、容器边界等也是设计考量要素。
修改一个地方试试
仅将 socket 路径的名称从 demo.sock 改为 app.sock。可以再次确认起作用的是路径而非 IP/端口。
SOCK="$TMPDIR/app.sock"
善后清理
服务器停止后,删除临时的 socket 和目录。
rm -f "$SOCK" rmdir "$TMPDIR" 2>/dev/null || true echo '[CLEANUP] temporary socket removed'
如果进程异常退出,可能会残留 socket 路径,因此在实际应用中需要设计启动前和退出时的清理机制。
在 PHP-FPM 中应该检查什么?
在某些架构中,PHP-FPM 的 listen 指向一个 pathname socket,而 Nginx 侧的 FastCGI 配置也指向同一个 socket。在排查故障时,可以分步检查以下内容:
socket 路径是否存在
所有者、所属组以及权限模式(mode)
PHP-FPM 进程是否正在监听
Nginx 侧是否引用了相同的路径
请勿出于测试目的删除生产环境的 socket
本次演示并未修改生产配置,只是重现了“.sock 成为通信端口”这一部分。
如果在工作中实际使用
/run切勿擅自删除生产环境的 socket切勿轻率地将 socket 权限设为 777
确认服务用户和用户组(user/group)
在容器或跨主机通信场景中,确认路径共享的前提条件
设计陈旧 socket(stale socket)的清理机制
官方信息与第一手资料
总结
Pathname 类型的 Unix domain socket 可以用文件系统上的路径来表示同一主机内的通信对象。通过亲手创建一个临时的 .sock 并观察其 ls 收发结果,你就能把 PHP-FPM 配置中出现的 socket 理解为 IPC 的入口,而不是“单纯的文件”。

