我已经看到很多关于这个主题的问题,并且我已经尝试了尽可能多的方法,但它仍然没有为我解决问题,所以我希望这篇文章可能会有所帮助。
我正在按照此站点的教程使用 uWSGI 在 Nginx 上设置 Django:http://www.oliverelliott.org/article/computing/tut_setup_nginx_django/
uwsgi.ini文件
[uwsgi]
chdir=/home/ec2-user/project/awssite
module=awssite.wsgi
home=/home/ec2-user/project
master=true
processes=2
socket=/home/ec2-user/project/awssite/awssite.socket
chmod-socket=666
vacuum=true
etc/nginx/sites-enabled/awssite_nginx.conf
upstream django {
server unix:///home/ec2-user/project/awssite/awssite.socket;
}
server {
listen 8080;
server_name localhost;
charset utf-8;
#max upload size
client_max_body_size 75M;
#Django media
location /media {
alias /home/ec2-user/project/awssite/awssite/media;
}
location /static {
alias /home/ec2-user/project/awssite/awssite/static;
}
location /favicon.ico {
log_not_found off;
}
location / {
uwsgi_pass django;
include /home/ec2-user/project/awssite/uwsgi_params;
}
}
这是 /var/log/nginx/error.log
中的错误代码
2016/02/15 01:21:22 [crit] 22159#0: *3 connect() to unix:///home/ec2-user/project/awssite/awssite.socket failed (13: Permission denied) while connecting to upstream, client: CLIENT_IP, server: localhost, request: "GET /menu/ HTTP/1.1", upstream: "uwsgi://unix:///home/ec2-user/project/awssite/awssite.socket:", host: "HOST_IP:8080"
注意:CLIENT_IP 和 HOST_IP 是 IP 地址值。
这些是我尝试过但无效的方法:
1.chmod 755
主目录并运行uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=666
2. 将用户 nginx 添加到我的用户组并运行 uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=664
3. 通过添加这些新行来更改 ini 文件
chown-socket=ec2-user:nginx
uid=nginx
gid=nginx
然后运行uwsgi --ini uwsgi.ini
这会返回“权限被 chown 拒绝”,但是当我使用 sudo
运行命令时,我得到sudo: uwsgi: command not found
(uWSGI在系统范围内安装)
4. 将所有文件放在不同的目录中(在用户 ec2-user
之外),但这不允许我访问它们,除非我以 root
身份运行即使这样它也不起作用
5.运行uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=664/666
带参数--uid nginx
--gid nginx
--chown-socket=nginx:nginx
注:664/666
这意味着我尝试了这两种权限
6. 重命名 nginx.conf.default 和 nginx.conf.rpmnew 文件(这样 nginx 读取的唯一conf文件是 nginx.conf
)
有人可以告诉我如何解决这个问题吗?在解决这个问题时,我将继续添加我尝试过但未解决过的方法。谢谢:)
编辑:感谢@GwynBleidD的回答,我终于让它工作了。 这是有效的:
将我的套接字文件保存在/tmp
中
等/nginx/sites-enabled/awssite_nginx.conf
upstream django {
server unix:///tmp/djangosocket/awssite.socket;
}
....
uwsgi.ini文件
[uwsgi]
chdir=/home/ec2-user/project/awssite
module=awssite.wsgi
home=/home/ec2-user/project
master=true
processes=2
socket=/tmp/djangosocket/awssite.socket
chmod-socket=666
vacuum=true
我添加了我的 ec2-user
(登录用户)加入群组nginx
.
我相应地更改了文件权限
chown -R ec2-user:nginx djangosocket
chmod g+rwx djangosocket
最佳答案
如果您的 nginx 服务器无法访问 uWSGI 套接字,请尝试执行以下步骤:
不要将您的 socked 放在系统中任何用户的主目录中,尤其是 root!某些 UNIX 操作系统默认阻止除所有者之外的任何人访问主目录该目录和根目录。将 nginx 用户添加到该用户的私有(private)组(对于大多数系统,每个用户都有自己的主组)可以帮助解决此问题,但它几乎永远不会对 root 起作用。
检查您的 nginx 服务器(或您正在使用的任何其他 http 服务器)运行的用户和组。有时是
www-data
,有时是nginx
,有时是其他东西。创建套接字时,请确保用户名与运行 uWSGI 服务器的用户名匹配,并且组名与运行 uWSGI 的组匹配(或者您可以交换它)。检查您的套接字的权限是否至少为 660。没有必要向任何人授予权限,所以不要这样做。
检查您的 nginx 和 uWSGI 是否有权访问套接字所在的目录以及所有父目录。
存放套接字文件的好地方是 /var/run
目录(对于某些系统,它是 /run
或两者)。它通常被安装为 ramdisk (tmpfs),并且系统中的任何人都可以写入,因此每个用户都可以在此处创建套接字(并访问它们)。如果由于某种原因无法在您的系统中访问它,您也可以尝试 /tmp
目录。
如果您还直接从您的主目录中的 nginx 提供静态文件,请考虑将 nginx 添加到您的个人组,这样它将具有对您的主目录和静态文件的读取权限。
关于django - Nginx+uWsgi+Django 'Permission denied while connecting to upstream'(套接字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35400393/