web-dev-qa-db-fra.com

uWSGI ne rechargera pas, ne redémarrera pas ou ne me laissera pas exécuter le service

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.

  • J'ai déjà eu des sites travaillant sur cette configuration et soudain, cela ne fonctionne pas.
  • J'utilise le mode Empereur.
  • Mes fichiers ini sont corrects lorsque j'utilise la ligne de commande pour les exécuter, mais il semble qu'ils ne démarrent pas automatiquement

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.

24
Daniel Tate

Utilisez uwsgi de la bonne façon

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.

installer

Vous avez deux façons d'installer uwsgi sur ubuntu: apt-get ou pip

apt-get

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

pépin

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.

démoniser uwsgi

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.

apt-get

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

pépin

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.

config uwsgi pour votre site

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 :)

config nginx pour votre site

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!

répondre à votre question

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!

74
guoqiao