nginx(13:权限被拒绝)在套接字上

nginx(13:权限被拒绝)在套接字上

我正在尝试使用 uwsgi 和 nginx 设置一个 Django 应用程序,但我一直遇到一个非常恼人的问题。
我使用了uwsgi 文档作为参考指南。

当通过 uwsgi () 为应用程序提供服务时,uwsgi --http :8000 --module myproject.wsgi一切正常,但是当我尝试通过 nginx ( uwsgi --ini myproject.ini) 的套接字连接并myproject.com:8000/<django-app>在浏览器中打开时,出现 502 错误,并且

2018/02/07 08:25:26 [crit] 30339#30339: *1 connect() 到 unix:///var/www/[myproject]/[myproject].sock 失败(13:权限被拒绝)同时连接到上游,客户端:[client-ip],服务器:[server-ip],请求:“GET /[django-app]/HTTP/1.1”,上游:“unix:///var/www/[myproject]/[myproject].sock:”,主机:“[fqdn]:8000”

这 ^ 在/var/log/nginx/error.log

我的项目文件夹位于 之下/var/www/,归 拥有<me>:www-data,并具有764as 权限。每个子文件夹和文件(当前)都属于此所有权和这些权限。

我在 Ubuntu 16.04 虚拟机(由我的管理员管理)上运行所有内容,并且我的用户可以sudo访问。


我是否遗漏了一些显而易见的东西?


更新:
目前,当对套接字other有权限,对项目其余部分有权限时,一切都正常。 因此,nginx 未被正确识别...我仔细检查了一下,nginx 以用户身份运行,该用户是整个项目的组所有者,并且具有权限,就像现在一样。read-writeread-execute
www-dataread-executeother


myproject_nginx.conf
(除了此文件中的设置之外,我还输入了user www-data www-data;/etc/nginx/nginx.conf

# myproject_nginx.conf

# the upstream component nginx needs to connect to
upstream django {
    server unix:///var/www/myproject/myproject.sock;
}

# configuration of the server
server {
    # the port your site will be served on
    listen      8000;
    # the domain name it will serve for
    server_name my.ip.goes.here; # substitute your machine's IP address or FQDN
    charset     utf-8;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    # Django media
    location /media  {
        alias /var/www/myproject/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /var/www/myproject/static; # your Django project's static files - amend as required

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     /var/www/myproject/uwsgi_params; # the uwsgi_params file you installed
    }
}

myproject_uwsgi.ini

# myproject_uwsgi.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir          = /var/www/myproject
# Django's wsgi file
module         = myproject.wsgi
# the virtualenv (full path)
home           = /var/www/myenv

# process-related settings
master         = true
# maximum number of worker processes
processes      = 10
# the socket (full path)
socket         = /var/www/myproject/myproject.sock
# ... with appropriate permissions - may be needed
chmod-socket   = 666
uid            = me
gid            = www-data
# clear environment on exit
vacuum         = true

答案1

经过几个小时的痛苦尝试后,我找到了解决该问题的方法。

问题有两个:1)文件夹的权限 2)虚拟环境

虚拟环境会干扰您的权限并阻止 uwsgi 正确创建套接字 - 只需停用 venv 并在系统范围内使用 pip install django 和 uwsgi 即可。可能有办法在 venv 中解决这个问题,但我不知道。

然后,将您的 django 项目文件夹的权限设置为 777(或将其所有者更改为 root)。

cd 进入文件夹并以 root 身份运行 wsgi 命令:

sudo uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=664 --uid www-data --gid www-data

这将创建所有者为 www-data 的 mysite.sock,并且我不再收到权限被拒绝的错误。

我希望这有帮助。

-编辑-经过进一步调查后,我教程并使其作为 systemd 服务运行而没有任何这些问题 - 我猜官方教程认为有些事情是理所当然的。

答案2

基于类似的数字海洋教程,我遇到了类似的问题。

https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uwsgi-and-nginx-on-ubuntu-16-04#

我的 hack 操作是chmod a+rw mysite.sock在启动 uwsgi 之后进行的。

不过,我想改变--chmod-socket = 666 也应该可行。

答案3

在进行部署开发和/或测试时,我总是通过运行以下命令开始:

uwsgi --socket /tmp/mysite.sock --module mysite.wsgi --chmod-socket=777

然后,一旦您看到您的网站正常运行,您就可以使用 INI 文件方法。这很好,因为启动应用服务器的命令简化为:

uwsgi --ini mysite.ini

Giorgio Ghisotti 已经提到了这一切,因此应该接受这个答案。

答案4

在本教程中使用 Unix 套接字代替端口,此命令有效:

uwsgi --socket mysite_nginx.sock --wsgi-file test.py --chmod-socket=666

相关内容