我有一个 Django 网站通过nginx
用户下www-data
和gunicorn
用户myuser
绑定下运行/run/gunicorn.sock
。
nginx
运行良好;它充当 Unix 域套接字的代理gunicorn
。我没有遇到任何问题nginx
。
redis-server
也运行正常。它的域套接字位于/var/run/redis/redis-server.sock
。
当我在 Django 设置文件中启用 CACHES 时,出现以下异常gunicorn
:
Error 13 connecting to unix socket: /run/redis/redis-server.sock. Permission denied.
使用ps aux | grep redis
,我发现 正在用户/usr/bin/redis-server
下运行redis
,我认为这是完全可以预料到的,也是可以接受的。我已将其添加myuser
到redis
组,并重新启动了服务器。我继续收到该异常。
我做错了什么?如何让两个守护进程一起工作:gunicorn
和redis-server
?
答案1
我使用了默认redis.conf
文件,/etc/redis
并且只是取消了与 Unix 套接字相关的示例的注释。
它包含以下信息:
# Unix socket.
#
# Specify the path for the Unix socket that will be used to listen for
# incoming connections. There is no default, so Redis will not listen
# on a unix socket when not specified.
#
unixsocket /var/run/redis/redis-server.sock
unixsocketperm 700
我注释掉了该unixsocketperm
行并添加了这一行:
unixsocketperm 660
它立即就起作用了。我非常兴奋,迫不及待地想看看使用缓存服务器的结果。
它之所以有效是因为权限中的中间数字是 6,它适用于组权限。在我更新之前,该redis
组对套接字文件的权限为 0。在我更新之后,它现在对套接字文件具有读写权限。我读到过某处说套接字文件不需要用户的执行权限,所以为了安全起见我删除了该权限。