car*_*lex 6 sockets django nginx uwsgi
我已经在SO上看到了很多关于这个主题的问题,我尝试了尽可能多的方法,但它仍然没有为我解决问题所以我希望这篇文章可能会有所帮助.
我正在关注本网站的教程,以便在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
Run Code Online (Sandbox Code Playgroud)
等/ nginx的/启用的站点 - /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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是错误代码 /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"
Run Code Online (Sandbox Code Playgroud)
注意: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.通过添加这些新行
chown-socket=ec2-user:nginx
uid=nginx
gid=nginx
然后运行来更改ini文件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的回答,我终于得到了它的工作. 这是有效的:
将我的socket文件保存在/tmp
etc/nginx/sites-enabled/awssite_nginx.conf中
upstream django {
server unix:///tmp/djangosocket/awssite.socket;
}
....
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我将我的ec2-user
(登录用户)添加到了组中nginx
.
我相应地更改了文件权限
chown -R ec2-user:nginx djangosocket
chmod g+rwx djangosocket
如果您的nginx服务器无法访问uWSGI套接字,请尝试执行以下步骤:
不要把你的socked放在你系统中任何用户的主目录中,尤其是root!对于除该目录的所有者和root之外的任何人,某些unix操作系统默认访问主目录.将nginx用户添加到该用户的私有组(对于大多数系统,每个用户都拥有自己的主组)可以提供帮助,但它几乎不会对root用户起作用.
检查您的nginx服务器(或您正在使用的任何其他http服务器)运行的用户和组.有时www-data
,有时候nginx
,有时是其他东西.创建套接字时,请确保用户名将匹配运行uWSGI服务器的用户名和uWSGI运行时的组名匹配组(或者您可以交换它).
检查您的套接字权限是否至少为660.没有必要为任何人授予权限,所以不要这样做.
检查您的nginx和uWSGI是否都有权访问放置套接字的目录以及所有父目录.
套接字文件的好地方是/var/run
目录(对于某些系统,它是/run
或两者兼而有之).它通常作为ramdisk(tmpfs)安装,并且对于系统中的任何人都是可写的,因此每个用户都可以在这里创建套接字(并访问它们).如果由于某种原因在您的系统中无法访问,您也可以尝试使用/tmp
目录.
如果您还要从主目录中直接从nginx提供静态文件,请考虑将nginx添加到您的个人组,这样它就可以对您的主目录和静态文件具有读取权限.