ayc*_*dee 6 python nginx flask uwsgi
我在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"
Run Code Online (Sandbox Code Playgroud)
套接字上的权限是可以的(666,并设置为与nginx相同的用户),事实上,即使我以root身份运行nginx,我仍然会收到此错误.
烧瓶app/uwsgi正在发送请求.但它只是不被Nginx读取.这是在Ubuntu Utopic Unicorn上.
如果nginx进程具有对套接字的完全访问权限,那么知道哪些权限可能被拒绝?
作为一个复杂的因素,该服务器在一个安装了Ubuntu 14.04的容器中运行.这个设置过去常常工作......但我最近将主机升级到14.10 ......我完全明白这可能是导致问题的原因.但在我降级主机或升级容器之前,我想了解原因.
当我对生成此错误的工作人员运行strace时,我看到它正在进行的调用是这样的:
readv(14, 0x7fffb3d16a80, 1)            = -1 EACCES (Permission denied)
Run Code Online (Sandbox Code Playgroud)
14 似乎是这个系统调用创建的文件描述符
socket(PF_LOCAL, SOCK_STREAM, 0)        = 14
Run Code Online (Sandbox Code Playgroud)
所以它无法读取它刚刚创建的本地套接字?
好的!所以我认为问题与这个错误有关。看来,即使 apparmor 没有配置为阻止访问容器内的套接字,它实际上正在做一些事情来阻止从它们读取(尽管不是创建......),因此关闭容器的 apparmor (遵循这些说明)可以解决修理它。
两条相关的行是:
sudo apparmor_parser -R /etc/apparmor.d/usr.bin.lxc-start
Run Code Online (Sandbox Code Playgroud)
sudo ln -s /etc/apparmor.d/usr.bin.lxc-start /etc/apparmor.d/disabled/
并添加
lxc.aa_profile = unconfined 
Run Code Online (Sandbox Code Playgroud)
到容器配置文件。
注意:这些错误未记录在任何 apparmor 日志中。