读取上游时 nginx 权限被拒绝 - 即使 运行 作为 root

nginx permission denied while reading upstream - even when run as root

我在 nginx 后面的 uWSGI 下有一个烧瓶应用 运行ning。

*1 readv() failed (13: Permission denied) while reading upstream, client: 10.0.3.1, server: , request: "GET /some/path/constants.js HTTP/1.1", upstream: "uwsgi://unix:/var/uwsgi.sock:", host: "dev.myhost.com"

socket 的权限没问题(666,并且设置为与 nginx 相同的用户),事实上,即使我 运行 nginx 作为 root 我仍然得到这个错误。

flask app/uwsgi 正在正确发送请求。但它只是不被 Nginx 读取。这是在 Ubuntu Utopic Unicorn 上。

知道哪里 如果 nginx 进程对套接字具有完全访问权限,权限可能会被拒绝吗?

作为一个复杂因素,此服务器 运行 安装在安装了 Ubuntu 14.04 的容器中。这个设置曾经有效......但我最近将主机升级到 14.10......我完全理解这可能是问题的原因。但在降级主机或升级容器之前,我想了解原因。

当我 运行 跟踪生成此错误的工作人员时,我看到它发出的调用是这样的:

readv(14, 0x7fffb3d16a80, 1)            = -1 EACCES (Permission denied)

14好像是这个系统调用创建的文件描述符

socket(PF_LOCAL, SOCK_STREAM, 0)        = 14

所以它无法从刚刚创建的本地套接字中读取?

好的!所以我认为问题是与 this bug. It seems that even though apparmor wasn't configured to prevent access to sockets inside the containers it was actually doing something to prevent reading from them (though not creation...) so turning off apparmor for the container (following these instructions) 相关的工作来修复它。

两个相关的行是:

sudo apparmor_parser -R /etc/apparmor.d/usr.bin.lxc-start

sudo ln -s /etc/apparmor.d/usr.bin.lxc-start /etc/apparmor.d/disabled/

并添加

lxc.aa_profile = unconfined 

到容器配置文件。

注意:这些错误未记录在任何 apparmor 日志中。

这个问题可能是在内核 3.16 中引入的,因为它不会在具有 3.13 内核的 14.04 上重现。奇怪的 apparmor 错误确实是造成这种情况的原因。

不幸的是@aychedee 的解决方案对我不起作用。在我的例子中,我必须将以下参数添加到 docker run 命令以解决问题:

docker run --security-opt apparmor:unconfined ...

如果有人知道问题的当前状态,请考虑在此答案下添加评论:)