Laravel安装Redis后未生成redis.sock套接字文件报错如何解决
- Redis主配置未开启Unix套接字监听,默认多数发行版源安装的Redis仅监听6379 TCP端口,不会自动生成sock套接字文件。
/var/run/redis目录权限配置错误,Redis运行用户无目录写入权限,无法生成sock文件。- 套接字路径配置不匹配:Redis配置中指定的sock生成路径,和Laravel项目中配置的连接路径不一致。
- Systemd服务沙箱规则限制:Redis服务配置了
ProtectSystem=strict等强隔离参数,未给/var/run/redis目录开放写入权限,sock文件被生成在私有隔离目录内,公共路径无法访问。 - 配置修改后未重启Redis、PHP-FPM相关服务,变更未生效。
/var/run是内存临时文件系统,服务器重启后目录会被清空,未配置tmpfiles规则自动重建目录并赋权,导致Redis启动时找不到写入路径。
调整Redis核心配置
编辑Redis配置文件(默认路径为/etc/redis/redis.conf),找到并修改以下配置项,移除行首的注释符:unixsocket /var/run/redis/redis.sock unixsocketperm 770如果不需要TCP访问,可以将
port配置改为0,需要保留TCP访问则维持默认的6379即可,两种监听方式不冲突。配置目录持久化与权限
先手动创建目录并修正权限:mkdir -p /var/run/redis chown redis:redis /var/run/redis chmod 775 /var/run/redis为了避免服务器重启后临时目录被清空,配置tmpfiles规则保证开机自动创建符合权限要求的目录:
编辑/etc/tmpfiles.d/redis.conf,写入以下内容:d /var/run/redis 0775 redis redis - -处理Systemd沙箱限制(若适用)
编辑Redis的systemd服务文件(默认路径/lib/systemd/system/redis-server.service),在[Service]段落下添加以下配置,给sock目录开放写入权限:ReadWritePaths=-/var/run/redis保存后执行
systemctl daemon-reload重载配置。配置服务访问权限
将PHP运行用户(Debian/Ubuntu系默认是www-data,CentOS/RHEL系默认是nginx/apache)加入redis用户组,保证PHP进程有权限访问sock文件:# Debian/Ubuntu示例 usermod -aG redis www-data重载服务并校验
依次重启相关服务让配置生效:systemctl restart redis-server systemctl restart php-fpm # 替换为实际的PHP版本服务名,如php8.3-fpm systemctl reload nginx执行
ls -l /var/run/redis校验输出,如果能看到redis.sock文件则说明生成正常。最后核对Laravel项目.env文件中Redis连接配置,确认REDIS_SOCKET参数值为/var/run/redis/redis.sock,和Redis配置保持一致即可。
注意:如果是容器化部署的Redis,需要确认容器内sock路径已经正确挂载到宿主机对应目录,否则宿主机PHP进程无法访问容器内生成的套接字文件。
内容的提问来源于stack exchange,提问作者mkrdev

