J'ai un ansible approvisionné VM sur la base de celui-ci https://github.com/jcalazan/ansible-Django-stack mais pour une raison quelconque, le fait de démarrer Gunicorn donne l'erreur suivante:
Impossible de se connecter à /path/to/my/gunicorn.sock
et dans le fichier journal nginx:
connect () à unix: /path/to/my/gunicorn.sock a échoué (2: aucun fichier ou répertoire de ce type) lors de la connexion à l'amont
Et en fait, le fichier de socket est manquant dans le répertoire spécifié. J'ai vérifié les permissions du répertoire et elles vont bien.
Voici mon script gunicorn_start:
NAME="{{ application_name }}"
DJANGODIR={{ application_path }}
SOCKFILE={{ virtualenv_path }}/run/gunicorn.sock
USER={{ gunicorn_user }}
GROUP={{ gunicorn_group }}
NUM_WORKERS={{ gunicorn_num_workers }}
# Set this to 0 for unlimited requests. During development, you might want to
# set this to 1 to automatically restart the process on each request (i.e. your
# code will be reloaded on every request).
MAX_REQUESTS={{ gunicorn_max_requests }}
echo "Starting $NAME as `whoami`"
# Activate the virtual environment.
cd $DJANGODIR
. ../../bin/activate
# Set additional environment variables.
. ../../bin/postactivate
# Create the run directory if it doesn't exist.
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR
# Programs meant to be run under supervisor should not daemonize themselves
# (do not use --daemon).
exec gunicorn \
--name $NAME \
--workers $NUM_WORKERS \
--max-requests $MAX_REQUESTS \
--user $USER --group $GROUP \
--log-level debug \
--bind unix:$SOCKFILE \
{{ application_name }}.wsgi
Quelqu'un peut-il suggérer quoi d'autre pourrait causer le fichier de socket manquant?
Merci
Eh bien, comme je n'ai pas assez de représentants pour commenter, je mentionnerai ici qu'il n'y a pas beaucoup de spécificité suggérée par le socket manquant, mais je peux vous en dire un peu plus sur la façon dont j'ai commencé à vous mettre à la place des choses. travail.
En résumé, gunicorn a rencontré un problème lorsqu'il a été exécuté par le débutant et qu'il n'a jamais été mis en service ou arrêté. Voici quelques étapes qui peuvent vous aider à obtenir plus d'informations pour identifier votre problème:
ps auxf | grep gunicorn
pour voir si vous avez des travailleurs. Je n'ai pas.grep init: /var/log/syslog
, m’a montré que mon service de tireurs de fusils avait été arrêté parce qu’il revenait trop vite, bien que je doute que ce soit votre problème, car vous n’avez pas de délai de réapparition. Peu importe, vous pourriez y trouver quelque chose.Après avoir constaté que gunicorn ne parvenait pas à exécuter ou à enregistrer les erreurs, j'ai décidé de l'exécuter à partir de la ligne de commande. Accédez au répertoire où réside le fichier manage.py et exécutez la version développée de votre commande upstart sur votre instance gunicorn. Quelque chose comme (remplacez tous les vars par les littéraux appropriés au lieu des ordures que j'utilise):
/path/to/your/virtualenv/bin/gunicorn --name myapp --workers 4 --max-requests 10 --user appuser --group webusers --log-level debug --error-logfile /somewhere/I/can/find/error.log --bind unix:/tmp/myapp.socket myapp.wsgi
Si vous êtes chanceux, vous pouvez obtenir une trace python ou trouver quelque chose dans votre journal des erreurs gunicorn après avoir exécuté la commande manuellement. Certaines choses qui peuvent mal se passer:
J'espère que cela pourra aider. Cela fait deux ou trois longues journées à la recherche de ces choses.
J'ai rencontré le même problème après avoir suivi le grand guide de Michal Karzynski ' Configuration de Django avec Nginx, Gunicorn, Virtualenv, superviseur et PostgreSQL '.
Et voici comment je l'ai résolu.
J'avais cette variable dans le script bash utilisée pour démarrer gunicorn via Supervisor (myapp/bin/gunicorn_start):
SOCKFILE={{ myapp absolute path }}/run/gunicorn.sock
Qui, lorsque vous exécutez le script bash pour la première fois, crée un dossier 'run' et un fichier de chaussettes utilisant les privilèges root. J'ai donc supprimé le dossier d'exécution, puis je l'ai recréé sans privilèges Sudo et le tour est joué! Maintenant, si vous relancez Gunicorn ou Supervisor, vous n'aurez plus le message d'erreur du fichier chaussette manquant!
TL; DR
J'ai eu le même problème et j'ai découvert que j'avais défini Django_SETTINGS_MODULE sur les paramètres de production du script gunicorn et que les paramètres wsgi utilisaient dev.
J'ai pointé Django_SETTINGS_MODULE sur dev et tout a fonctionné.
Eh bien, j'ai travaillé sur cette question pendant plus d'une semaine et j'ai finalement été capable de comprendre. Veuillez suivre les liens de Digital Ocean , mais ils n’ont pas identifié les problèmes importants qui incluent
* 1 connect () à unix: /tmp/myproject.sock a échoué (2: aucun fichier ou répertoire de ce type)
etc.
Il s’agit essentiellement de problème d’autorisation pour la connexion entre Nginx et Gunicorn . Pour simplifier les choses, je recommandepour donner la même autorisation nginxà chaque fichier/projet/programme Python que vous créez.
Pour résoudre tout le problème, suivez cette approche: La première chose à faire est:
Allez maintenant dans le fichier /etc/nginx/nginx.conf. Allez au module serveur et ajoutez:
location/{include proxy_params; proxy_pass http <>: <> // unix: /home/nginx/myproject.sock; } REMOVE <> Ne suivez pas l'aricle digitalocean à partir d'ici