J'ai un gros problème.
Je suis très nouveau sur uwsgi et je ne suis pas sûr à 100% de la façon de déboguer ce problème, mais je vais vous donner des informations sur ma situation.
Quand je lance uwsgi reload
Sudo service uwsgi reload
Je reçois cette erreur
* Reloading app server(s) uwsgi
...fail!
C'est ça. Je ne reçois rien d'autre.
Je cherche depuis des heures sur le débordement de la pile et je n'ai rien trouvé qui résout exactement ce problème, j'ai trouvé beaucoup à voir avec les fichiers .ini des peuples mais je sais que ce n'est PAS mon problème parce que lorsque j'exécute mon site manuellement via uwsgi --ini MYINI.ini
puis y accéder il fonctionne parfaitement bien, le problème est dans uWSGI et je ne sais pas comment trouver la solution à celui-ci. J'ai regardé dans les documents et je ne trouve rien sur cette erreur particulière.
Si cela intéresse quelqu'un, voici mon fichier uwsgi-server.conf
description "uWSGI Emperor"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
env LOGTO=/var/log/uwsgi.log
env BINPATH=/usr/local/bin/uwsgi
exec $BINPATH --emperor /etc/uwsgi/vassals --logto $LOGTO
Toute idée serait appréciée. Je sens que je manque quelque chose mais étant si nouveau avec uWSGI, je ne peux même pas deviner ce que cela peut être, pour moi, tout semble ok selon la documentation.
Si vous avez besoin de plus d'informations sur ma configuration, veuillez simplement demander.
Utiliser uwsgi pour approfondir Django site sur le serveur ubuntu est assez facile, mais il y a encore quelque chose que vous devez savoir avant de faire des erreurs.
Vous avez deux façons d'installer uwsgi sur ubuntu: apt-get ou pip
si vous utilisez apt-get, vous devez installer le plugin python:
Sudo apt-get install uwsgi-plugin-python
Sudo apt-get install uwsgi
Et, dans votre fichier uwsgi ini pour votre site, vous devez ajouter ceci:
plugins=python
si vous utilisez pip, vous devez d'abord installer python-dev:
Sudo apt-get install python-dev
Sudo pip install uwsgi
Et vous n'avez pas besoin du plugins=python
dans le fichier ini.
Voir le Sudo avant pip? Oui, uwsgi doit être installé dans le système global. Si vous manquez le Sudo ici, vous pouvez l'installer dans votre virtualenv. Cela n'a aucun sens et vous pourriez avoir du mal à le faire fonctionner.
Daemonize signifie que uwsgi s'exécute au démarrage du système et en arrière-plan. Selon la façon dont vous installez uwsgi, vous avez deux façons.
Quand vous apt-get install uwsgi
sur ubuntu, il est installé en tant que service automatiquement. La magie réside dans ce fichier:
/etc/init.d/uwsgi
Fichiers dans /etc/init.d
sera chargé par sysvinit. Ensuite, vous pouvez gérer votre service uwsgi comme ceci:
Sudo /etc/init.d/uwsgi start|stop|restart|reload
ou:
Sudo service uwsgi start|stop|restart|reload
la commande de service peut trouver le service géré par sysvinit
Si vous uwsgi est installé par pip, vous n'avez que le fichier exécutable dans /usr/local/bin/uwsgi
, vous devez démonifier vous-même.
Lorsque vous ouvrez certains fichiers dans /etc/init.d/
, vous pouvez être triste: je veux juste enregistrer uwsgi en tant que service, pourquoi dois-je écrire un script aussi long qui ressemble aux autres? Ça n'a pas de sens.
La bonne nouvelle est que c'est assez simple avec l'aide d'Upstart, qui est une alternative à sysvinit. Il utilise /etc/init/
au lieu de /etc/init.d/
.
Créez simplement un fichier /etc/init/uwsgi.conf
avec le contenu suivant:
description "uWSGI Emperor"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec /usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals/ --logto /var/log/uwsgi.log
et ensuite, vous pouvez gérer votre processus uwsgi comme ceci:
Sudo initctl start|stop|restart|reload| uwsgi
ou encore:
Sudo service uwsgi start|stop|restart|reload
Oui, comme vous pouvez le voir, la commande de service est intelligente, elle peut gérer le service à la fois de sysvinit et d'Upstart, avec la même commande.
Et, si vous avez les deux /etc/init.d/uwsgi
et /etc/init/uwsgi.conf
, quand tu dis:
Sudo service uwsgi restart
Il redémarrera le fichier Upstart /etc/init/uwsgi.conf
. Le sysvinit sera ignoré, ou quelque chose de similaire.
Je recommande à tout le monde d'utiliser la méthode pip et Upstart, c'est beaucoup mieux que la méthode apt-get.
Si c'est le cas, vous utilisez le mode empereur d'uwsgi, qui est très pratique et puissant.
Maintenant, vous pouvez créer un fichier ini dans /etc/uwsgi/vassals/
comme ça:
[uwsgi]
virtualenv=/path/to/venv/
chdir=/path/to/proj/root
module=wsgi:application
env=Django_SETTINGS_MODULE=settings
master=True
vacuum=True
socket=/tmp/%n.sock
pidfile=/tmp/%n.pid
daemonize=/var/log/uwsgi/%n.log
Le %n
signifie votre nom de fichier. Par exemple, mon nom de projet est 'exemple', je crée un example.ini
fichier pour cela. Puis le %n
signifie 'exemple'. Vous n'avez pas besoin de le remplacer par son vrai nom. uwsgi le fera pour vous.
Et puis redémarrez ou rechargez uwsgi:
Sudo service uwsgi restart
Vérifiez votre fichier socket:
ll /tmp/*.sock
Si c'est le cas, vous réussissez avec uwsgi maintenant :)
Prenons l'exemple de domaine.com:
server {
listen 80;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
listen 80;
charset utf-8;
server_name example.com;
location /static/ {
alias /path/to/static/;
}
location /media/ {
alias /path/to/media/;
}
location / {
try_files $uri @Django;
}
location @Django {
uwsgi_pass unix:///tmp/example.sock;
include uwsgi_params;
}
}
redémarrez nginx, vous verrez votre site!
Votre fichier de configuration pour uwsgi est/etc/init/uwsgi-server.conf
Donc, le nom que vous devez utiliser est uwsgi-server
, pas uwsgi
vous devez redémarrer votre instance d'empereur uwsgi comme ceci:
Sudo initctl restart uwsgi-server
ou:
Sudo service uwsgi-server restart
C'est tout!