webentwicklung-frage-antwort-db.com.de

uWSGI lädt nicht neu, startet nicht neu oder lässt mich den Dienst ausführen

Ich habe ein ziemlich großes Problem.

Ich bin sehr neu in uwsgi und nicht 100% sicher, wie ich dieses Problem beheben soll, aber ich gebe Ihnen Informationen darüber, wo ich mich gerade befinde.

  • Ich hatte zuvor Sites, die an dieser Konfiguration arbeiteten, und plötzlich funktioniert sie nicht mehr.
  • Ich arbeite im Kaisermodus.
  • Meine INI-Dateien sind in Ordnung, wenn ich sie über die Befehlszeile starte, aber sie werden anscheinend nicht automatisch gestartet

Wenn ich uwsgi reload

Sudo service uwsgi reload

Ich bekomme diesen Fehler

* Reloading app server(s) uwsgi
...fail!

Das ist es. Ich bekomme sonst nichts.

Ich habe stundenlang nach einem Stapelüberlauf gesucht und nichts gefunden, was dieses Problem genau umreißt. Ich habe eine Menge mit INI-Dateien der Leute zu tun, aber ich weiß, dass dies NICHT mein Problem ist, da meine Site manuell über uwsgi --ini MYINI.ini Wenn Sie dann darauf zugreifen, funktioniert es einwandfrei. Das Problem liegt in uWSGI, und ich weiß nicht, wie ich die Lösung für dieses Problem finden kann. Ich habe in den Dokumenten nachgesehen und kann zu diesem bestimmten Fehler nichts finden.

Wenn dies jemanden interessiert, ist hier meine Datei 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

Jede Einsicht wäre dankbar. Ich habe das Gefühl, dass mir etwas fehlt, aber ich bin so neu bei uWSGI, dass ich nicht einmal erraten kann, was es sein könnte. Für mich sieht das alles gemäß der Dokumentation in Ordnung aus.

Wenn Sie weitere Informationen zu meinem Setup benötigen, fragen Sie einfach.

24
Daniel Tate

Nutze uwsgi richtig

Die Verwendung von uwsgi, um Django site auf dem Ubuntu-Server abzubilden, ist recht einfach, aber es gibt noch etwas, das Sie wissen müssen, bevor Sie Fehler machen.

installieren

Sie haben zwei Möglichkeiten, um uwsgi auf Ubuntu zu installieren: apt-get oder pip

apt-get

wenn Sie apt-get verwenden, müssen Sie das python plugin installieren:

Sudo apt-get install uwsgi-plugin-python
Sudo apt-get install uwsgi

Und in Ihrer UWSGI INI-Datei für Ihre Site müssen Sie Folgendes hinzufügen:

plugins=python

pip

wenn Sie pip verwenden, müssen Sie zuerst python-dev installieren:

Sudo apt-get install python-dev
Sudo pip install uwsgi

Und Sie brauchen den plugins=python In der INI-Datei nicht mehr.

Sehen Sie das Sudo vor dem Pip? Ja, uwsgi sollte im globalen System installiert sein. Wenn Sie das Sudo hier vermissen, können Sie es in Ihrer virtuellen Umgebung installieren. Es ist bedeutungslos und Sie haben möglicherweise Probleme, es auszuführen.

uwsgi dämonisieren

Daemonize bedeutet, dass uwsgi beim Systemstart und im Hintergrund ausgeführt wird. Je nachdem, wie Sie uwsgi installieren, haben Sie zwei Möglichkeiten.

apt-get

Wenn Sie apt-get install uwsgi Auf Ubuntu ausführen, wird es automatisch als Dienst installiert. Die Magie liegt in dieser Datei:

/etc/init.d/uwsgi

Dateien in /etc/init.d Werden von sysvinit geladen. Dann können Sie Ihren uwsgi-Dienst wie folgt verwalten:

Sudo /etc/init.d/uwsgi start|stop|restart|reload

oder:

Sudo service uwsgi start|stop|restart|reload

der service befehl kann den von sysvinit verwalteten service finden

pip

Wenn Sie uwsgi von pip installiert haben, haben Sie nur die ausführbare Datei in /usr/local/bin/uwsgi, Sie müssen sie selbst dämonisieren.

Wenn Sie einige der Dateien in /etc/init.d/ Öffnen, sind Sie möglicherweise traurig: Ich möchte uwsgi nur als Dienst registrieren. Warum muss ich so lange ein Skript schreiben, das den anderen ähnlich sieht? Das ergibt keinen Sinn.

Die gute Nachricht ist, dass dies mit Hilfe von Upstart, einer Alternative zu Sysvinit, ganz einfach ist. Es wird /etc/init/ Anstelle von /etc/init.d/ Verwendet.

Erstellen Sie einfach eine Datei /etc/init/uwsgi.conf Mit folgendem Inhalt:

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

und dann können Sie Ihren uwsgi-Prozess wie folgt verwalten:

Sudo initctl start|stop|restart|reload| uwsgi

oder noch dies:

Sudo service uwsgi start|stop|restart|reload

Ja, wie Sie sehen, ist der Befehl service intelligent. Er kann den Dienst sowohl von sysvinit als auch von Upstart mit demselben Befehl verwalten.

Und wenn Sie sowohl /etc/init.d/uwsgi Als auch /etc/init/uwsgi.conf Haben, wenn Sie sagen:

Sudo service uwsgi restart

Die Upstart-Datei /etc/init/uwsgi.conf Wird neu gestartet. Das sysvinit wird ignoriert oder ähnliches.

uwsgi config für deine seite

Ich empfehle jedem, die Pip- und Upstart-Methode zu verwenden. Es ist viel besser als die Apt-Get-Methode.

In diesem Fall verwenden Sie den Kaisermodus von uwsgi, der sehr praktisch und leistungsstark ist.

Jetzt können Sie eine INI-Datei in /etc/uwsgi/vassals/ Wie folgt erstellen:

[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

Das %n Bedeutet Ihren Dateinamen. Zum Beispiel ist mein Projektname 'Beispiel', ich erstelle eine example.ini - Datei dafür. Dann bedeutet das %n "Beispiel". Sie müssen es nicht durch einen echten Namen ersetzen. uwsgi erledigt das für Sie.

Und dann starte uwsgi neu oder lade es neu:

Sudo service uwsgi restart

Überprüfen Sie Ihre Socket-Datei:

ll /tmp/*.sock

Wenn es da ist, bist du jetzt mit uwsgi erfolgreich :)

nginx-Konfiguration für Ihre Website

Nehmen Sie zum Beispiel die Domain example.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;
    }
}

starte nginx neu, du siehst deine Seite!

antworte auf deine frage

Ihre Konfigurationsdatei für uwsgi ist /etc/init/uwsgi-server.conf Der Name, den Sie verwenden sollten, ist also uwsgi-server, Nicht uwsgi

sie müssen Ihre UWSGI-Kaiser-Instanz wie folgt neu starten:

Sudo initctl restart uwsgi-server

oder:

Sudo service uwsgi-server restart

Das ist alles!

74
guoqiao