![](/img/trans.png)
[英]nginx connet to .sock failed (13:Permission denied) - 502 bad gateway
[英]502 Bad Gateway - django + nginx + gunicorn - sock failed (13: Permission denied)
我正在关注本教程: https ://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-14-04
我相信我的设置中的其他所有内容都是正确的。 文件 /var/log/nginx/error.log 有很多如下错误:
2015/12/19 18:41:58 [暴击] 10850#0: *23 connect() 到 unix:/home/root/myproject/myproject.sock 连接到上游时失败(13:权限被拒绝) ,客户端:[ [我的 ip]],服务器:[[服务器 ip]],请求:“GET/HTTP/1.1”,上游:“ http://unix:/home/root/myproject/myproject.sock:/ ”,主机: “[[服务器 IP]]”
命令:
/home/root/myproject ls -l /home/root/classNote/classNote.sock
输出:
srwxrwxrwx 1 root www-data 0 Dec 19 18:17 /home/root/myproject/myproject.sock
编辑:安德烈的评论回应:
命令:
ps ax | grep gunicorn
输出:
847 ? Ss 0:00 /home/root/myproject/myprojectEnv/bin/python myprojectEnv/bin/gunicorn --workers 3 --bind unix:/home/root/myproject/myproject.sock myproject.wsgi:application
921 ? S 0:00 /home/root/myproject/myprojectEnv/bin/python myprojectEnv/bin/gunicorn --workers 3 --bind unix:/home/root/myproject/myproject.sock myproject.wsgi:application
923 ? S 0:00 /home/root/myproject/myprojectEnv/bin/python myprojectEnv/bin/gunicorn --workers 3 --bind unix:/home/root/myproject/myproject.sock myproject.wsgi:application
928 ? S 0:00 /home/root/myproject/myprojectEnv/bin/python myprojectEnv/bin/gunicorn --workers 3 --bind unix:/home/root/myproject/myproject.sock myproject.wsgi:application
1136 pts/0 S+ 0:00 grep gunicorn
我刚遇到这个问题。 我能够创建 gunicorn 套接字文件,但 nginx 抱怨权限被拒绝。 问题是我的套接字文件位于子文件夹中,而根文件夹没有读取或执行权限。 因此,即使子文件夹具有正确的权限,根文件夹也会阻止 nginx 进入子文件夹。
解决方案是为根文件夹添加读取和执行权限:
chmod o+rx /example_root_folder
似乎有权限问题以 root 身份启动你的 nginx 服务,因为 root 有权访问你的 my project.sock
sudo service nginx stop
然后
sudo service nginx start
但是以 root 身份启动 nginx 并不是一个好主意。 您可以尝试更改当前用户的权限
我可以向您推荐一个效果很好的替代方案。 让 shell 脚本处理所有这些。 像这样创建一个shell脚本(*表示注释中需要)
#!/bin/bash
NAME="" #Name of the application (*)
DJANGODIR=/path/to/django/project # Django project directory (*)
SOCKFILE=/path/to/socket/file/myproject.sock # we will communicate using this unix socket (*)
USER= # the user to run as (*)
GROUP= # the group to run as (*)
NUM_WORKERS=1 # how many worker processes should Gunicorn spawn (*)
DJANGO_SETTINGS_MODULE=yourproject.settings # which settings file should Django use (*)
DJANGO_WSGI_MODULE=yourproject.wsgi # WSGI module name (*)
echo "Starting $NAME as `whoami`"
# Activate the virtual environment
cd $DJANGODIR
source /path/to/virtualenv/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH
# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR
# Start your Django Unicorn
# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)
exec /path/to/virtualenv/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user $USER \
--bind=unix:$SOCKFILE
我以前遇到过与您非常相似的问题(也是根据 digitalocean.com 上提到的教程进行的),我的意思是套接字无法正常工作,而且我收到了 502 错误。
我的解决方案是从套接字绑定转变为绑定普通 IP 地址。
在 virtualenv 中(在“manage.py”旁边)我有一个 gunicorn.py 文件:(注意:我使用的是 3.4 版本)
#!/usr/bin/python3.4
"""
Run Gunicorn (Django) on a specific IP addr
"""
import os
# Change directory to the virtualenv folder
os.chdir("/home/your_path/name_of_env/")
# Run Gunicorn
os.system("bin/gunicorn -w 3 -b 127.0.0.1:8000 your_project.wsgi:application &")
该脚本在不激活 virtualenv(命令“bin/gunicorn”)和后台(“&”)的情况下运行 Gunicorn。
注意:如果您不使用 virtualenv,请从上面的脚本中删除“bin/”。
要在启动 PC 和登录后调用该脚本,请将此行添加到末尾的“.profile”文件中。 (它在你的主目录中)
python3.4 path/to/the/file/gunicorn.py
在 nginx 文件中你应该有这部分代码:
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
}
请记住,IP 地址 127.0.0.1:8000 是保留的。 所以如果你想运行 Django 开发服务器,你有两个选择:
这个解决方案对我有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.