wsgi nginx error: permission denied while connecting to upstream

wsgi nginx error: permission denied while connecting to upstream

Whosebug 上似乎有很多关于此的问题,但不幸的是,没有任何问题对我有用。

我在 nginx 上收到一个 502 错误的网关,并且在日志中出现以下内容:connect() to ...myproject.sock failed (13: Permission denied) while connecting to upstream

我 运行宁 wsginginx ubuntu,我一直在关注 this guide from Digital Ocean。我显然正确配置了 wsgi,因为 uwsgi -s myproject.sock --http 0.0.0.0:8000 --module app --callable app 起作用了,但我一直收到 nginx 权限被拒绝的错误,我不知道为什么:

遇到this question and this other one后,我更改了.ini文件并添加了chown-socketchmod-socketuidgid参数(也尝试只设置前两个,要么,要么,以及几个不同的权限设置——即使是最宽松的也不起作用)。

This one seemed promising, but I don't believe selinux is installed on my Ubuntu (running sudo apt-get remove selinux gives "Package 'selinux' is not installed, so not removed" and find / -name "selinux" doesn't show anything). Just in case, though, I tried what this post也推荐。卸载 apparmor (sudo apt-get install apparmor) 也没有用。

每次我进行更改时,我 运行 sudo service nginx restart,但我只看到 502 网关错误(以及读取日志时的权限被拒绝错误)。

这是我的 nginx 配置文件:

server {
    listen 80;
    server_name 104.131.110.156;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/user/myproject/web_server/myproject.sock;
    }
}

.conf 文件:

description "uWSGI server instance configured to serve myproject"

start on runlevel [2345]
stop on runlevel [!2345]

setuid user
setgid www-data

env PATH=/root/.virtualenvs/my-env/bin
chdir /home/user/myproject/web_server
exec uwsgi --ini /home/user/myproject/web_server/myproject.ini

.ini 文件:

[uwsgi]
module = wsgi

master = true
processes = 5

socket = /home/user/myproject/web_server/myproject.sock
chown-socket=www-data:www-data
chmod-socket = 664
uid = www-data
gid = www-data

vacuum = true
die-on-term = true

(如果有帮助,这些是我的 Digital Ocean 机器的规格:Linux 3.13.0-43-generic #72-Ubuntu SMP Mon Dec 8 19:35:06 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

如果有什么我能做的,请告诉我,非常感谢。

我也跟着那个教程 运行 进入了同样的问题。经过大量的试验和错误后,以下步骤让我成功 运行 uWSGI 和 nginx:

我的 nginx.config 文件:

server {
    listen 80;
    server_name localhost;

    location / { try_files @yourapplication; }
    location @yourapplication; {
        include uwsgi_params;
        uwsgi_pass unix:/PATH_TO_PROJECT/PROJECT.sock;
    }
}

我的 .ini 文件工作得不是很好,所以我决定利用 uWSGI 广泛可用的参数。这是我使用的:

uwsgi -s /PATH_TO_PROJECT/PROJECT.sock -w wsgi:app -H /PATH_TO_PROJECT/venv --http-processes=4 --chmod-socket=666 --master &

其中:

-s /PATH_TO_PROJECT/PROJECT.sock = 我的 .sock 文件的位置

-w wsgi:app = 我的 wsgi.py 文件的位置,app 是我的 Flask 对象的名称

-H /PATH_TO_PROJECT/venv = 我的虚拟环境的位置

--http-processes=4 = uWSGI创建的http进程数

--chmod-socket=666 = 在套接字上设置的权限

--master = 允许 uWSGI 运行 与其主进程管理器

& = 运行 uWSGI 在后台

路径:unix:/PATH_TO_PROJECT/PROJECT.sock 应该放在 /tmp 这解决了我的问题。

在遵循了该线程中的所有建议后,我仍然遇到权限错误。最后遗漏的部分是更正 /etc/nginx/nginx.conf 文件中的 nginx user

# old: user  nginx;
user  www-data;

(13: 权限被拒绝)

这表明由于权限问题,Nginx 无法连接到 uWSGI 套接字。通常,当在受限环境中创建套接字或权限错误时,会发生这种情况。虽然 uWSGI 进程能够创建套接字文件,但 Nginx 无法访问它。

如果根目录 (/) 和套接字文件之间的任何位置的权限都有限,就会发生这种情况。我们可以通过将套接字文件的绝对路径传递给 namei 命令来查看套接字文件及其每个父目录的权限和所有权值:

namei -nom /PATH_TO_YOUR_SOCKET_FILE/YOUR_SOCKET.sock

输出应该与此类似(您的案例可能有不同的文件夹名称)

f: /run/uwsgi/firstsite.sock
 drwxr-xr-x root  root     /
 drwxr-xr-x root  root     run
 drwxr-xr-x sammy www-data uwsgi
 srw-rw---- sammy www-data firstsite.sock

输出显示每个目录组件的权限。通过查看权限(第一列)、所有者(第二列)和组所有者(第三列),我们可以确定允许对套接字文件进行何种类型的访问。

在上面的示例中,通向套接字文件的每个目录都具有全局读取和执行权限(目录的权限列以 r-x 而不是 --- 结尾)。 www-data 组对套接字本身拥有组所有权。通过这些设置,Nginx 进程应该能够成功访问套接字。

如果通向套接字的任何目录不属于 www-data 组或没有世界读取和执行权限,Nginx 将无法访问套接字。通常,这意味着配置文件有错误。

所以你解决了这个问题,但是使用这个命令给所有上层文件夹权限:

chmod 755 directory_name

我知道来晚了,但为了帮助其他人更快地解决问题,我发布了这个答案。希望对你有帮助,祝你好运。

如果用户 www-data 可能没有创建新文件的权限,则可能会发生这种情况 给定路径中的套接字,因此使用 root 用户。 将用户 www-data 更改为 nginx.conf 中的用户 root;

ex: #nginx.conf
#user www-data;
user root;
worker_processes auto;
pid /var/run/nginx.pid;
.............

如果您已经测试了所有权限但它仍然无法正常工作,则可能启用了 SELinux,这将导致相同的行为。

运行 getenforce 如果结果是 Enforcing 那也无济于事。

快速修复是禁用它,setenforce 0但需要重新启动。

总结一下其他人说的解决 nginx permission denied 错误的方法(你可以看看 /var/log/nginx/error.log 通常是由于以下原因:

  1. 你在 nginx 没有权限的地方写入 .sock 文件
  2. SELinux 导致了问题

解决1:首先,不要按照这里server fault answer的建议在/tmp写入.sock文件,因为不同的服务在fedora中看到不同的/tmp。你可以写在一些地方,比如~/myproject/mysocket.sock。 nginx 用户必须有权访问我们的应用程序目录才能访问那里的套接字文件。默认情况下,CentOS 非常严格地锁定每个用户的主目录,因此我们将 nginx 用户添加到我们的用户组中,这样我们就可以打开授予访问权限所需的最小权限。

您可以使用以下命令将nginx 用户添加到您的用户组。将命令中的用户替换为您自己的用户名:

sudo usermod -a -G $USER nginx

现在,我们可以授予我们的用户组对我们的主目录的执行权限。这将允许 Nginx 进程在以下范围内输入和访问内容:

chmod 710 /path/to/project/dir

如果 permission denied 错误仍然存​​在: 那么 hack sudo setenforce 0 就可以了。

检查 nginx.conf 文件第一行的用户字段。默认情况下它是 www 数据。如果您以 root 身份登录,请在 nginx.conf 文件中将名称更改为用户 root。

2 件事帮助了我

我在 nginx 中的配置是正确的我也在文件夹中用我的两只眼睛看到了 /tmp/wsgi.sock,但仍然存在权限被拒绝或目录不存在的问题:

  1. 在文件/lib/systemd/system/nginx.service中设置PrivateTmp=false并重启nginx(不要忘记systemctl daemon reload刷新配置)

  2. 运行命令setenforce 0

奖金material:

/usr/local/bin/uwsgi --chdir /home/biohazard/myproject -s /tmp/wsgi.sock -w api:app --chmod-socket=777 --master --thunder-lock --http-processes=2 其中 api:app api 代表 /home/biohazard/myproject/api.py

location = /api { rewrite ^ /api/; }
location /api { try_files $uri @api; }
location @api {
  include uwsgi_params;
  uwsgi_pass unix:/tmp/wsgi.sock;
}

nginx 仅在我的 http://example.org/api 端点提供服务

我在使用 Nginx 和 Gunicorn 部署 Flask 时也遇到了同样的问题。 我通过将 .Sock 文件放在 /temp 文件夹中解决了这个问题。

有很多因素会导致此特定错误,在我的例子中,是我的 PROJECT.socket 文件的所有权导致了它。

而不是: srwxr-xr-x 1 yourusername yourusername 0 Nov 4 22:32 PROJECT.sock

应该是:srwxr-xr-x 1 www-data www-data 0 Nov 4 22:32 PROJECT.sock

只是 运行 sudo chown www-data:www-data PROJECT.sock 就是这样。