Conda, Django, Gunicorn y Supervisor mal intérprete: no existe tal archivo o directorio

Conda, Django, Gunicorn y Supervisor mal intérprete: no existe tal archivo o directorio

estoy siguiendo estotutorialpara implementar mi aplicación Django, pero modifiqué mi ejecutable /var/www/my_django_project/bin/gunicorn_startpara usar mi conda env en lugar de virtualenv.

CONDA_SRC=/home/justin/anaconda3/etc/profile.d/conda.sh
GUNICORN=/home/justin/anaconda3/pkgs/gunicorn-20.0.4-py38_0/bin/gunicorn
...
source $CONDA_SRC
conda activate myenv

Al ejecutar sudo bin/gunicorn_start, obtuve:

“starting backend”
bin/gunicorn_start: /home/justin/anaconda3/pkgs/gunicorn-20.0.4-py38_0/bin/gunicorn: /opt/anaconda1anaconda2anaconda3/bin/python: bad interpreter: No such file or directory
bin/gunicorn_start: line 25: /home/justin/anaconda3/pkgs/gunicorn-20.0.4-py38_0/bin/gunicorn: Success

y mi supervisor.log muestra:

supervisor: couldn't exec /var/www/my_django_project/bin/gunicorn_start: EACCES
supervisor: child process was not spawned

Respuesta1

Solucioné este problema cambiando la base de mi GUNICORNruta al directorio que contiene los archivos binarios de mi entorno Conda. Esto se puede encontrar which pythonmientras su conda env está activado, lo que proporciona: /home/justin/anaconda3/envs/production/bin/python. Usar /home/justin/anaconda3/envs/production/bin/gunicorn.

bin/gunicorn_startejecutable:

#!/bin/bash

NAME=”backend”
DJANGODIR=/var/www/my_django_project/backend
SOCKFILE=/var/www/my_django_project/run/gunicorn.sock
USER=django
GROUP=my_django_project
NUM_WORKERS=3
DJANGO_SETTINGS_MODULE=backend.settings
DJANGO_WSGI_MODULE=backend.wsgi
CONDA_SRC=/home/justin/anaconda3/etc/profile.d/conda.sh
GUNICORN=/home/justin/anaconda3/envs/production/bin/gunicorn

echo “starting backend”

cd $DJANGODIR
    source $CONDA_SRC
conda activate myenv
    export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
    export PYTHONPATH=$DJANGODIR:$PYTHONPATH
    
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

exec $GUNICORN
 ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --user=$USER --group=$GROUP \
  --bind=unix:$SOCKFILE \
  --log-level=debug \
  --log-file=-

La configuración de mi supervisor también faltaba shen el commandargumento y mi configuración de supervisor usó la extensión incorrecta. Asegúrate de que la extensión sea .conf. Aquí está mi actualización django.conf:

[program:django]
command =sh /var/www/my_django_project/bin/gunicorn_start
user = django
stdout_logfile = /var/www/my_django_project/backend/logs/supervisor.log
redirect_stderr = true
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8

Espero que esto ayude a cualquiera que tenga este problema.

información relacionada