unixsocket 是什么
Redis 除了 TCP 端口,还能监听 Unix 域套接字:同机客户端通过文件路径连接,省掉网络栈与握手开销,延迟更低,而且不占端口、不受对外网络策略影响。套接字文件只在本机命名空间可见,权限由 unixsocketperm 控制;它与 TCP 端口可以同时开启,常见做法是对外走端口、对内走套接字。
基本信息
| 服务端配置 | unixsocket /path/to/redis.sock |
|---|---|
| 权限配置 | unixsocketperm,生产建议显式设为 700 |
| 客户端用法 | redis-cli -s /path/to/redis.sock |
| 与 TCP 关系 | 可同时监听,互不影响 |
| 可见范围 | 仅本机同一命名空间,跨机必须用 TCP |
| 识别方式 | CLIENT LIST 的 addr 会显示套接字路径 |
典型使用场景
- 同机应用访问:延迟敏感且不跨机的业务走套接字,避开网络栈
- 攻击面收敛:不对外开放端口,仅保留本机套接字
- 容器混部:共享挂载目录让容器内的应用连上宿主实例
- 延迟对比:对延迟敏感的服务做 TCP 与套接字的对比测试
- 容器化排障:连接失败时先查挂载路径与文件属主
最小示例
最小示例
# redis.conf 中的相关配置
unixsocket /run/redis/redis.sock
unixsocketperm 700
redis-cli -s /run/redis/redis.sock PING # 用套接字连接
redis-cli -s /run/redis/redis.sock INFO clients # 连接统计
ls -l /run/redis/redis.sock # 确认属主与权限位
sudo -u appuser redis-cli -s /run/redis/redis.sock PING # 以业务身份验证权限常见现象与处理
| 现象 | 常见原因 | 处理 |
|---|---|---|
| 连接报权限不足 | 权限位或文件属主不匹配 | 调整 unixsocketperm 与运行用户 |
| 找不到套接字文件 | 路径被清理或未挂载进容器 | 换到持久目录,确认挂载与路径一致 |
| 重启后客户端连不上 | 套接字文件被重建,客户端仍持旧连接 | 让客户端重连,并确认路径未变 |
| 日志无异常但偶发失败 | 安全模块拦截访问 | 检查 SELinux 或 AppArmor 策略是否放行 |
套接字文件只在同一命名空间可见:容器要共享同一路径的挂载卷,且容器内运行用户的 uid 要与文件属主匹配,否则会收到权限错误。
套接字与 TCP 端口并存时,排障要区分连接来源:CLIENT LIST 里 addr 显示为套接字路径的是本机连接,显示 IP 与端口的是网络连接。