502 Bad Gateway - django + nginx + gunicorn - sock failed (13: Permission denied)

Posted

技术标签:

【中文标题】502 Bad Gateway - django + nginx + gunicorn - sock failed (13: Permission denied)【英文标题】: 【发布时间】:2016-03-26 09:40:51 【问题描述】:

我正在关注本教程: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 [crit] 10850#0: *23 connect() to unix:/home/root/myproject/myproject.sock 失败(13:权限被拒绝) 连接上游时,客户端:[[my 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

【问题讨论】:

【参考方案1】:

似乎有权限问题以root身份启动您的nginx服务,因为root有权访问您的my project.sock

sudo service nginx stop

然后

 sudo service nginx start

但是以 root 身份启动 nginx 并不是一个好主意。您可以尝试更改当前用户的权限

我可以向您推荐一个效果很好的替代方案。 让一个 shell 脚本来处理这一切。 像这样创建一个shell脚本(*表示在cmets中是必需的)

#!/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

【讨论】:

感谢您的建议。这两种解决方案都不适合我:(对于您的第二个解决方案,我不确定的唯一输入是 GROUP。我将其设置为 www-data。当我运行此文件时,当我访问我的 ip 时仍然得到 502。 代替 www-data 试试这个 /etc/group 并查看我的默认组为我工作的组名【参考方案2】:

link to similar question

我刚刚遇到了这个问题。我能够创建 gunicorn 套接字文件,但 nginx 抱怨权限被拒绝。问题是我的套接字文件位于子文件夹中,而根文件夹没有读取或执行权限。因此,即使子文件夹具有正确的权限,根文件夹也会阻止 nginx 进入子文件夹。

解决方案是在根文件夹中添加读取和执行权限:

chmod o+rx /example_root_folder

【讨论】:

【参考方案3】:

我之前也遇到过和你非常相似的问题(也是根据 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 开发服务器,你有两个选择:

    通过命令“ps aux | grep gunicorn”和“kill -9 [PID]”关闭 Gunicorn,然后正常运行命令“python3.4 manage.py runserver” 或者在不同的 IP 和端口上运行 Django 开发服务器,例如“python3.4 manage.py runserver 0.0.0.0:8001”

这个解决方案对我有用。

【讨论】:

您建议使用 django 开发服务器。这不是为了生产。本次讨论是为了建立一个生产环境。

以上是关于502 Bad Gateway - django + nginx + gunicorn - sock failed (13: Permission denied)的主要内容,如果未能解决你的问题,请参考以下文章

Django 在 Google App Engine 上出现“502 Bad Gateway”错误

Django Google App Engine:502 Bad Gateway,已安装的包无法识别

为啥我在使用 Nginx 和 Gunicorn 的 Django 应用程序上得到 502 Bad Gateway?

502 Bad Gateway - django + nginx + gunicorn - sock failed (13: Permission denied)

使用 AWS Elastic Beanstalk 部署 Django 应用程序时出现 502 Bad Gateway nginx/1.20.0 错误

Elastic Beanstalk Django 应用程序部署 502 Bad Gateway Server not running (No module named: 'application')