Bei der Entwicklung von Servern mit Django wird häufig eine Verbindung zu entfernten Servern über SSH hergestellt, im Gegensatz zur lokalen Umgebung. Aufgrund der Natur von SSH-Sitzungen kommt es jedoch häufig vor, dass die Verbindung nach einer bestimmten Zeit automatisch getrennt wird. In solchen Fällen entsteht der Aufwand, den Entwicklungsserver neu zu starten und die Verbindung wiederherzustellen. Hier möchte ich meine Erfahrungen teilen, wie ich das Problem der Unterbrechung von Django-Entwicklungsservern gelöst habe, während ich die SSH-Sitzung aufrechterhalte.
Problem: Automatische Beendigung der SSH-Sitzung
Wenn Sie an einem Remote-Server über SSH arbeiten, wird die Sitzung automatisch beendet, wenn längere Zeit keine Aktivitäten stattfinden. Dies ist aus Sicherheitsgründen nützlich, da die SSH-Einstellungen die Verbindung nach einer bestimmten Zeit ohne Netzwerkverkehr trennen, aber für Entwickler kann es recht unbequem werden.
Lösungsmethoden: Nutzung von SSH-Einstellungen, tmux und systemd
Um dieses Problem zu lösen, habe ich drei Methoden angewendet.
1. Änderung der SSH-Einstellungen
Ich habe die Datei ~/.ssh/config
im SSH-Client so konfiguriert, dass sie regelmäßig keep-alive-Pakete sendet. Mit dieser Einstellung bleibt die SSH-Verbindung aktiv, indem sie in regelmäßigen Abständen Pakete sendet.
Host *
ServerAliveInterval 60
ServerAliveCountMax 5
Hier steht ServerAliveInterval
für das Intervall (in Sekunden), in dem der Client Pakete an den Server sendet, und ServerAliveCountMax
beschreibt die Anzahl der Versuche bei einem Fehlschlag. Diese Einstellungen helfen, die Sitzung aufrechtzuerhalten und zu verhindern, dass sie getrennt wird.
2. Verwendung von tmux oder screen
Um sicherzustellen, dass der Django-Entwicklungsserver auch bei einer Unterbrechung der SSH-Sitzung nicht gestoppt wird, habe ich Terminal-Multiplexer-Programme wie tmux
oder screen
verwendet. Wenn Sie den Django-Server mit tmux
starten, bleibt der Server selbst bei einem SSH-Sitzungsabbruch aktiv. Zum Beispiel verläuft der Prozess, um den Django-Server über tmux
zu starten, folgendermaßen.
# tmux Sitzung erstellen
tmux new -s django_session
# Django Entwicklungsserver starten
python manage.py runserver
Nachdem der Django-Server so gestartet wurde, bleibt der Server in der tmux
-Sitzung aktiv, selbst wenn die SSH-Sitzung beendet wird. Bei einer Wiederverbindung können Sie mit tmux attach -t django_session
erneut Zugang zur Sitzung erhalten.
3. Einstellung als Hintergrunddienst mit systemd
Die befriedigendste Methode der drei beschriebenen ist, den Django-Server als Dienst mit systemd zu verwalten. Mit systemd können Sie Ihre Anwendung während der Entwicklung immer im Hintergrund ausführen, was eine stabile Betriebsumgebung unabhängig von der SSH-Sitzung bietet. Außerdem können Sie Tests und Entwicklungen nahezu im gleichen Zustand wie in der Produktionsumgebung durchführen. So richten Sie die Django-Anwendung als Dienst mit systemd ein.
Zunächst erstellen Sie die Datei /etc/systemd/system/my_django_app.service
und fügen den folgenden Inhalt ein.
[Unit]
Description=Meine Django-Anwendung
After=network.target
[Service]
User=myuser
Group=mygroup
WorkingDirectory=/path/to/my/django/project
ExecStart=/path/to/my/venv/bin/python manage.py runserver 0.0.0.0:8000
Restart=always
[Install]
WantedBy=multi-user.target
Nach dieser Konfiguration können Sie den Dienst mit dem Befehl systemctl start my_django_app
starten und ihn mit systemctl enable my_django_app
so einrichten, dass er beim Serverneustart automatisch ausgeführt wird. Nach Veränderungen im Code können Sie den Dienst mit systemctl restart my_django_app
neu starten, um die Änderungen zu übernehmen. Der größte Vorteil besteht darin, dass einmal eingerichtet, der Server in der Regel nicht manuell gestartet werden muss, es sei denn, es tritt ein außergewöhnliches Ereignis ein.
Sie können das Gefühl haben, so zu testen, als wären Sie in einer echten Produktionsumgebung, und nach der Einrichtung ist es effizient, da Sie nicht ständig den Server verwalten müssen. Wenn Sie diese Methode noch nie ausprobiert haben, empfehle ich Ihnen dringend, es zu versuchen.
Fazit
Durch die oben beschriebenen Methoden konnte ich das Problem der SSH-Sitzungsunterbrechung lösen und den Django-Entwicklungsserver stabil betreiben. Besonders die Ausführung als Dienst im Hintergrund über systemd hat die Effizienz meiner Arbeit erheblich gesteigert, da ich näher an der tatsächlichen Produktionsumgebung entwickle und diese überprüfe. Dies wird eine nützliche Empfehlung für die Arbeit in einer Remote-Entwicklungsumgebung sein.
Add a New Comment