【问题标题】:wsgi nginx error: permission denied while connecting to upstreamwsgi nginx错误:连接到上游时权限被拒绝
【发布时间】:2015-07-04 12:21:35
【问题描述】:

在 StackOverflow 上似乎有很多关于此的问题,但不幸的是,对我没有任何帮助。

我在 nginx 上收到 502 错误网关,日志中显示以下内容:connect() to ...myproject.sock failed (13: Permission denied) while connecting to upstream

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

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

This one seemed promising,但我不相信 selinux 已安装在我的 Ubuntu 上(运行 sudo apt-get remove selinux 会给出“未安装包‘selinux’,因此未删除”和 find / -name "selinux" 不显示任何内容) .不过,以防万一,我也尝试了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

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

【问题讨论】:

  • 尝试将套接字放在 /tmp 中。如果 nginx 用户无权列出套接字路径中的任何目录,您可能会被拒绝访问。它需要 /home/user、/home/user/myproject 等权限
  • 感谢您的回答!不幸的是,同样的错误:connect() to unix:/tmp/coaster.sock failed (13: Permission denied) while connecting to upstream
  • 相当肯定 nginx 在 Ubuntu 上作为 www-data 运行,但值得一试... /etc/nginx.conf 说 nginx 以什么方式运行?另外,如果您将 php-fpm 更改为使用 tcp 套接字(如 127.0.0.1:9000)会发生什么?
  • 是的,我认为它以www-data 运行。我认为可能是权限有问题,所以我通过调用sudo chown www-data:www-data DIRNAMEuser/下目录的所有者更改为www-data用户,但是即使重新启动服务器和nginx,我仍然得到相同的结果错误。我还以 root 身份运行 nginx,因为我在使用 root 帐户时调用了 sudo service nginx restart。而且我用的不是PHP,而是Flask + WSGI,所以不知道是否适用……
  • 尝试使用 TCP 而不是 unix 套接字,在您的情况下,它是 --socket 127.0.0.1:3031 参数和 uwsgi_pass 127.0.0.1:3031; 在 nginx 配置中。 It's working better anyway.

标签: sockets ubuntu nginx wsgi uwsgi


【解决方案1】:

我也遵循了该教程并遇到了同样的问题。经过相当多的反复试验,以下步骤让我成功运行了 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

【讨论】:

  • 在生产环境中会发生什么?
  • --chmod-socket=666 是我所需要的!我什至把chmod-socket=660 放在我的情况下。
【解决方案2】:

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

【讨论】:

【解决方案3】:

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

# old: user  nginx;
user  www-data;

【讨论】:

  • 仅供参考 ubuntu trusty64 用户,nginx 已经配置为以www-data 运行。希望您阅读了这篇文章,我为您节省了 30 秒的检查时间。
  • 值得指定此参数超出http、服务器等(即靠近或顶部)
【解决方案4】:

(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

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

    • 那是蛮力的方法,很少是好主意。我对类似问题的解决方法是将这一行 add 到 nginx.conf 文件中:user www-data www-data;
    【解决方案6】:

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

    运行getenforce,如果结果是Enforcing,那就无济于事了。

    快速解决方法是禁用它,setenforce 0 但需要重新启动。

    【讨论】:

      【解决方案7】:

      总结一下其他人所说的解决nginx中的权限被拒绝错误(您可以查看/var/log/nginx/error.log通常是由于以下原因:

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

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

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

      sudo usermod -a -G $USER nginx
      

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

      chmod 710 /path/to/project/dir

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

      【讨论】:

      • sudo setenforce 0 确实是黑客。
      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

        有两件事帮助了我

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

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

        2. 运行命令setenforce 0

        奖励材料:

        /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 端点提供服务

        【讨论】:

        • 我忘了怎么做,然后找到了自己的答案。谢谢我
        【解决方案10】:

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

        【讨论】:

          【解决方案11】:

          有很多因素会导致此特定错误,在我的情况下,是我的 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 即可。

          【讨论】:

            猜你喜欢
            • 2016-05-12
            • 2014-03-16
            • 2018-09-13
            • 2014-07-19
            • 2022-01-03
            • 2016-05-25
            • 2015-07-14
            • 1970-01-01
            • 2014-10-31
            相关资源
            最近更新 更多