wsgi nginx错误:连接到上游时权限被拒绝

时间:2015-04-26 00:08:55

标签: sockets ubuntu nginx wsgi uwsgi

StackOverflow似乎有很多关于此的问题,但遗憾的是没有任何对我有用。

我在nginx上获得了一个502坏网关,以及日志中的以下内容:connect() to ...myproject.sock failed (13: Permission denied) while connecting to upstream

我在wsgi上正在运行nginxubuntu,我一直关注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-socketuid和{{ 1}}参数(也尝试设置前两个,或者,以及几个不同的权限设置 - 甚至最宽松的也不起作用。)

This one seemed promising,但我不认为我的Ubuntu上安装了gid(正在运行selinux赠送“未安装包'selinux',因此未删除”和{{1没有显示任何东西)。不过,为了以防万一,我也尝试了this post推荐的内容。卸载sudo apt-get remove selinuxfind / -name "selinux")也无效。

每次进行更改时,我都会运行apparmor,但我只看到502网关错误(以及读取日志时出现权限被拒绝错误)。

这是我的sudo apt-get install apparmor配置文件:

sudo service nginx restart

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

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

11 个答案:

答案 0 :(得分:7)

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

希望这有帮助!

答案 1 :(得分:6)

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

答案 2 :(得分:5)

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

# old: user  nginx;
user  www-data;

答案 3 :(得分:4)

(13:许可被拒绝)

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

如果根目录(/)与套接字文件之间的任何位置的权限有限,则会发生这种情况。我们可以通过将socket文件的绝对路径传递给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

我知道现在已经很晚了,但为了帮助其他人更快地克服这个问题,我已经发布了这个答案。希望它有所帮助,祝你好运。

答案 4 :(得分:1)

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

运行getenforce,如果结果为Enforcing,则无效。

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

答案 5 :(得分:1)

总结其他人为解决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就可以解决问题。

答案 6 :(得分:0)

如果用户www-data可能没有创建新的权限,则可能会发生这种情况   套接字在给定路径中,所以使用root用户。   将用户www-data重新用于nginx.conf中的用户root;

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

两件事帮助了我

我在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端点提供服务的地方

答案 9 :(得分:0)

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

答案 10 :(得分:0)

很多原因都可能导致此特定错误,就我而言,是导致我的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就可以了。