【问题标题】:nginx permission denied while reading upstream - even when run as root读取上游时 nginx 权限被拒绝 - 即使以 root 身份运行
【发布时间】:2015-03-14 04:25:54
【问题描述】:

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

*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 相同的用户),事实上,即使我以 root 运行 nginx 仍然会出现这个错误。

flask 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

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

【问题讨论】:

    标签: python nginx flask uwsgi


    【解决方案1】:

    好的!所以我认为问题与this bug 有关。似乎即使 apparmor 没有配置为阻止访问容器内的套接字,它实际上也在做一些事情来阻止从它们中读取(尽管不是创建......)所以关闭容器的 apparmor(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 日志中。

    【讨论】:

    • 能否请您添加有关此修复的更多详细信息?在我的情况下似乎不起作用。
    • 我已将两个相关行添加到我的答案中。但是,如果这些不能为您解决问题,那么您可能会遇到不相关的问题:(
    • 不幸的是,我的系统上没有 usr.bin.lxc-start 文件,只有 /etc/apparmor.d/docker。当我使用 docker 文件执行所述过程时,docker 服务不再以 Error response from daemon: Cannot start container database: set apparmor profile docker-default: no such file or directory FATA[0000] Error: failed to start one or more containers 启动
    • @aychedee 我可以知道配置文件在哪里吗?我们应该手动编辑配置文件还是运行某些 lxc cmd 来编辑?我怀疑我遇到了同样的错误:stackoverflow.com/questions/27969166/…
    • 我刚刚手动编辑了容器的配置文件。它在容器目录中:linuxcontainers.org/lxc/manpages/man5/lxc.conf.5.html
    【解决方案2】:

    这个问题可能是在内核 3.16 中引入的,因为它不会在 3.13 内核的 14.04 上重现。确实是奇怪的 apparmor bug 造成的。

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

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

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

    【讨论】:

    • 主要区别在于您使用的是 docker,而我使用的是 linux 容器。同样的问题,但不同的容器技术,所以配置在不同的地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 2020-09-10
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多