首页 文章

502 Bad Gateway - django nginx gunicorn - 袜子失败(13:许可被拒绝)

提问于
浏览
4

我正在学习本教程: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连接()到unix:/home/root/myproject/myproject.sock失败 (13: Permission denied) 连接上游时,客户端:[[my ip]] ,server:[[server ip]],request:"GET / HTTP/1.1",upstream:“_ http://unix:/home/root/myproject/myproject.sock:/ ", host: " [[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

2 回答

  • 2

    似乎存在权限问题以root身份启动nginx服务,因为root有权访问我的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
    
  • -2

    我之前有一个非常类似的问题(也是根据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 &")
    

    该脚本运行Gunicorn而不激活virtualenv(命令“bin / 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"

    这个解决方案适合我 .

相关问题