什么是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 是可用于同一主机内进程间通信的套接字,在路径套接字(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 的入口,而不是“单纯的文件”。

文档信息

文章??
什么是Unix套接字? —— 通过临时创建 .sock 文件来观察它与TCP端口的区别
?布日期
更新日期
来源
https://papanda925.com/?p=17061&lang=zh

?可: ?于本站?有相??利的正文及原??表,除非?有?明,可依据 CC BY 4.0 使用。本文可能包含使用生成式AI?建或??的内容。若代??有?可声明,或?接的GitHub???定了?可,?代?以??可?准。引用内容、第三方?料、?片及商?不在本?可范?内。 使用政策

标题和URL已复制