502错误网关 - django + nginx + gunicorn - sock失败(13:权限被拒绝)

6
我正在按照这篇教程进行操作: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 连接到unix:/home/root/myproject/myproject.sock失败(13: Permission denied),在连接上游时,客户端:[[my ip]],服务器:[[server ip]],请求:"GET / HTTP/1.1",上游:"http://unix:/home/root/myproject/myproject.sock:/",主机:"[[server 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

编辑:Andrei的评论回复:

命令:

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
3个回答

5

类似问题的链接

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

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

chmod o+rx /example_root_folder

对于在这里感到困惑的人。进入您的根目录,在终端中您会看到~。运行以下命令:chmod o+rx . - undefined

3

看起来您启动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

谢谢您的建议。对我来说,两种解决方案都不起作用 :( 对于您的第二个解决方案,我唯一不确定的输入是GROUP。我将其设置为www-data。当我运行此文件时,当我访问我的IP时仍然会出现502错误。 - David
不要使用 www-data,尝试使用 /etc/group 并查看组名称。我的默认组对我有用。 - Yugandhar Chaudhari

-3

我之前也遇到了和你非常相似的问题(同样是按照digitalocean.com上提供的教程进行操作),我的意思是socket无法工作,同时我也一直收到502错误。

对我来说解决方案是从socket绑定转换为绑定普通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 &")

该脚本在后台运行Gunicorn(命令“bin/gunicorn”),而不激活virtualenv。

注意:如果您不使用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开发服务器,您有两个选择:

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

这个解决方案对我起作用。


1
你建议使用Django开发服务器,但那不适用于生产环境。我们正在讨论如何设置生产环境。 - max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接