2015-01-15 15 views
6

我有一个在uWSGI后面运行的应用程序,在nginx后面。nginx权限在读取上游时被拒绝 - 即使以根用户身份运行

*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" 

在插座上的权限是好的(666,并设置为相同的用户nginx的),事实上,即使当我运行的nginx作为root我仍然得到这个错误。

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

任何想法其中如果nginx进程可以完全访问套接字,那么权限可能会被拒绝?

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

当我正在生成这个错误我看到它使调用一个工人跑strace的是这样的:

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

14似乎文件描述符由这个系统调用创建

socket(PF_LOCAL, SOCK_STREAM, 0)  = 14 

因此,它不能从它刚创建的本地套接字读取?

回答

4

好吧!所以问题是,我认为与this bug有关。看起来,虽然apparmor没有配置为阻止访问容器内的套接字,但它实际上正在做一些事情来防止读取它们(尽管不是创建...),因此关闭容器的附件(following these instructions)可以解决它。

两个相关线路分别为:

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

须藤LN -s /etc/apparmor.d/usr.bin.lxc-start /etc/apparmor.d/disabled/

和添加

lxc.aa_profile = unconfined 

到容器配置文件。

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

+0

请问您能否添加更多关于修复的细节?似乎没有在我的情况下工作。 – 2015-10-21 15:44:18

+0

我已将两条相关的行添加到我的答案中。但是,如果这些不能解决你的问题,那么你可能有一个无关的问题:( – aychedee 2015-10-21 15:49:56

+0

不幸的是,我的系统上没有usr.bin.lxc-start文件,只有/etc/apparmor.d/docker。使用docker文件执行所描述的过程docker服务不再启动了'来自守护程序的错误响应:无法启动容器数据库:设置apparmor配置文件docker-default:没有这样的文件或目录 FATA错误:未能启动一个或更多容器' – 2015-10-21 15:52:06

1

这个问题可能是在内核3.16中引入的,因为它在14.04上没有用3.13内核重现。奇怪的apparmor错误确实对此负责。

不幸的是,@ aychedee的解决方案对我无效。在我来说,我有以下参数添加到docker run命令来摆脱这个问题:

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

如果有人知道什么是问题的当前状态,请考虑这个答案:)

下添加评论
+0

很高兴你解决了它 – aychedee 2015-10-21 20:03:10

+1

主要区别在于你使用的是docker,而我使用的是linux容器。同样的问题,但不同的容器技术,所以配置在不同的地方。 – aychedee 2015-10-22 12:25:43

相关问题