我正在尝试使用 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
,并具有764
as 权限。每个子文件夹和文件(当前)都属于此所有权和这些权限。
我在 Ubuntu 16.04 虚拟机(由我的管理员管理)上运行所有内容,并且我的用户可以sudo
访问。
我是否遗漏了一些显而易见的东西?
更新:
目前,当对套接字other
有权限,对项目其余部分有权限时,一切都正常。 因此,nginx 未被正确识别...我仔细检查了一下,nginx 以用户身份运行,该用户是整个项目的组所有者,并且具有权限,就像现在一样。read-write
read-execute
www-data
read-execute
other
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
基于类似的数字海洋教程,我遇到了类似的问题。
我的 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