python - Gunicorn-Django : django project not found

标签 python django nginx gunicorn

我一直在尝试通过 Django、Gunicorn、nginx 设置我的生产服务器(Linode 512),我在 nginx 和 Gunicorn 中遇到错误。由于 nginx 部分纯粹与服务器问题相关,因此我必须将其发布在 serverfault 中。但是对于Gunicorn错误,这与我的项目结构有关

Django Project/
  apps/
  confs/
    development/
    production/gunicorn.conf
  settings/
    custom.py
    database.py
    development.py
    production.py
    default.py
  static/
    js/
    css/
    admin/
  templates/
  manage.py
  urls.py

这个结构在 Django 开发服务器中工作正常,但是当我尝试使用 Gunicorn 时,它显示 RuntimeError("django project not found") 完整的错误详细信息是 here

Gunicorn 设置:

import os

def numCPUs():
    if not hasattr(os, "sysconf"):
        raise RuntimeError("No sysconf detected.")
    return os.sysconf("SC_NPROCESSORS_ONLN")

bind = "unix:/opt/Project1432/shared/gunicorn.sock"
workers = numCPUs() * 2 + 1
pidfile = "/opt/Project1432/shared/Project1432.pid"
logfile = "/opt/Project1432/shared/Project1432.log"
daemon = True

项目路径:

/opt/Project1432/releases/current/Project1432/...

有人可以指导我解决这个问题吗?

谢谢!

更新:

Gunicorn运行命令: 我在上面给出的项目路径中运行此命令。

gunicorn_django --config /opt/Project1432/releases/current/Project1432/confs/production/gunicorn.conf

最佳答案

在我看来,该项目不在gunicorn的路径中。

就我个人而言,我使用manage.py run_gunicorn并通过命令行传递所有配置参数 对于路径,我使用 virtualenv 并在 shell 脚本中获取 bin/activate

这是我的 bash 脚本:

#!/bin/sh

### BEGIN INIT INFO
# Provides:             myProject.exemple.com
# Required-Start:       $syslog $nginx
# Required-Stop:        $syslog $nginx
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description:    the django fast_cgi portal for myProject.exemple.com
### END INIT INFO

# with this config :
#  the project is in /home/web/prod/myProject.exemple.com/src/myProject/
#  the socket is in /var/run/django/myProject.sock   
#  the log files is /val/log/nginx/myProject.exemple.com/gunicorn.log
#  the pid file is /var/run/django/myProject.pid      

# note, for debuging purpose, you can set a DEBUG env variable to prevent gunicorn to fork and to see all the output.
# ie :  sudo DEBUG=True /etc/init.d/django_myProject start                                                                                                                                                                                              

if [ -f  "/lib/lsb/init-functions-color"] ;
then
  .  /lib/lsb/init-functions-color
else
  . /lib/lsb/init-functions
fi

# not exactly used by workon, but used to source the activate
WORKON_HOME=/home/web/prod/Envs                                                                                                                                                                                                              

# change on eveny new project                                                                                                                                                                                                                
PROJECT_NAME=myProject                                                                                                                                                                            
DOMAINE=$PROJECT_NAME.exemple.com                                                                                                                                                                                                         

# fixed                                                                                                                                                                                                                                                                                                                                                                                                                                                  
PIDFILE=/var/run/django/$PROJECT_NAME.pid                                                                                                                                                                                                    
LOGFILE=/var/log/nginx/$DOMAINE/gunicorn.log                                                                                                                                                                                                 
SOCKFILE=/var/run/django/$PROJECT_NAME.sock                                                                                                                                                                                                  
SOCKET=unix:$SOCKFILE                                                                                                                                                                                                                        
#SOCKET=192.9.201.3:8050                                                                                                                                                                                                                     
#This is the command to be run, give the full pathname                                                                                                                                                                                       
PROJECT_DIR=/home/web/prod/$DOMAINE/src/$PROJECT_NAME/                                                                                                                                                                                       
DAEMON="$PROJECT_DIR/manage.py run_gunicorn"                                                                                                                                                                                                 
USER=www-data                                                                                                                                                                                                                                
GROUP=www-data                                                                                                                                                                                                                               
WORKERS=2                                                                                                                                                                                                                                    

# could be changed                                                                                                                                                                                                                           

#DAEMON_OPTS="run_gunicorn --workers 1 \
#                          --worker-connections 5 \
#                          --daemon\
#                          --user www-data\
#                          --group www-data\
#                          -t 30\
#                          --bind unix:$SOCKET \
#                          --pid $PIDFILE \
#                          --error-logfile /var/log/nginx/$DOMAINE/gunicorn.log"
#                    --daemon \


DEBUG_ARGS="        --user=$USER \
                    --group=$GROUP \
                    --workers=$WORKERS \
                    --bind $SOCKET \
                    -t 90 \
                    --settings=$PROJECT_NAME.settings.prod \
                    --name=$DOMAINE"

DAEMON_OPTS="       $DEBUG_ARGS \
                    --pid=$PIDFILE \
                    --daemon \
                    --log-file=$LOGFILE \
                    --log-level=info"


start()
{

  cd "$PROJECT_DIR"
  log_begin_msg "starting django website" "$PROJECT_NAME"
  mkdir -p `dirname $SOCKFILE`
  chown www-data:www-data  `dirname $SOCKFILE`
#  echo "$SOCKET" |  grep '^unix:' > /dev/null 2> /dev/null
#  if [ ! -e "$SOCKFILE" -a "$?" -eq "0" ] 
#  then
#    log_warning_msg "creation du socket $SOCKFILE"
#    
#    mkfifo $SOCKFILE
#    
#  fi
  if [ -f "$PIDFILE" ]
  then
    ps faux | grep -v grep | grep "$DAEMON" | grep `cat $PIDFILE` > /dev/null
    if [ $? -eq 0 ]
    then
      log_failure_msg "fichier pid deja present avec un pid existant"
      log_end_msg 1
      return 1
    fi
    rm "$PIDFILE"
    log_warning_msg "pid file deja existant"
  fi
  if [ -f "$WORKON_HOME/$PROJECT_NAME/bin/activate" ];
  then
    . $WORKON_HOME/$PROJECT_NAME/bin/activate 
  else
    echo "impossible d'activer l'environement $WORKON_HOME/$PROJECT_NAME/bin/activate"
    exit 1
  fi
  if [ ! -z  "$DEBUG" ] ;
  then
    echo "sourcing $WORKON_HOME/$PROJECT_NAME/bin/activate"
    echo $DAEMON $DEBUG_ARGS
    $DAEMON $DEBUG_ARGS
  else
    $DAEMON $DAEMON_OPTS
  fi
  if [ $? -eq 0 ]
  then
    log_end_msg 0
  else
    log_end_msg 1
  fi


}

stop()
{
  log_begin_msg "stoping django website" "$PROJECT_NAME"
  if [ -f  "$PIDFILE" ]
  then
    start-stop-daemon --oknodo --stop --quiet --pidfile $PIDFILE 2> /dev/null
    rm "$PIDFILE"
    log_end_msg 0
  else
    log_failure_msg "pid file absent for $PROJECT_NAME django website"
    #log_end_msg 1
  fi

}

status()
{
  if [ -f "$PIDFILE" ]
  then
    # fichier pid existant
    ps faux | grep -v grep | grep $DAEMON | grep `cat $PIDFILE` > /dev/null
    if [ $? -eq 0 ]
    then
      echo "$PROJECT_NAME django website running"
    else
      echo "WARN !! pid file present but $PROJECT_NAME django website stopped"
    fi
  else
    ps faux | grep -v grep | grep $DAEMON > /dev/null
    if [ $? -eq 0 ]
    then
      echo "WARN !! $PROJECT_NAME django website apear to be running but don't have a PID FILE"
    else
      echo "$PROJECT_NAME django website stopped"
    fi
  fi
}

case "$1" in
  start)
    start
  ;;
  stop)
    stop
  ;;
  restart)
    stop
    sleep 2
    start
  ;;
  status)
    status
  ;;

  *)
  echo "Usage: "$1" {start|stop|restart|status}"
  exit 1
esac

exit 0

关于python - Gunicorn-Django : django project not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15610189/

相关文章:

Python静默打印PDF到特定打印机

django - 在 wagtailadmin 中的 limit_choices_to 中使用或 Q() 对象

python - 使用多数据库的 Django 事务

linux - Nginx被log-rotate杀死后如何重启?

javascript - 为什么登录后所有 XHR 请求中都会显示基本身份验证凭据

docker - 使用Nginx作为使用Docker的Jenkins代理

python - 导入错误 : cannot import name normalize

python - 如何在 Django 中处理数据校正(但这不是 Django 特有的!)

使用 Pdb 进行 Python 调试

python - Django 两个内连接