Bij het ontwikkelen van een server met Django maak je vaak verbinding met een externe server via SSH, in tegenstelling tot je lokale omgeving. Echter, vanwege de aard van SSH-sessies worden verbindingen vaak automatisch verbroken na een bepaalde tijd, wat leidt tot de ongemakken van een onderbroken ontwikkelserver die opnieuw moet worden opgestart. In dit artikel deel ik mijn ervaringen over hoe je een SSH-sessie kunt behouden zonder de Django-ontwikkelserver te onderbreken.

Probleem: Automatische beëindiging van de SSH-sessie

Wanneer je aan een externe server werkt via SSH, wordt de sessie automatisch beëindigd als er lange tijd geen activiteit is. Hoewel dit een nuttige beveiligingsfunctie is, kan het voor ontwikkelaars zeer ongebruikelijk zijn.

Oplossingen: SSH-instellingen, tmux, gebruik van systemd

Ik heb drie methoden toegepast om dit probleem op te lossen.

1. SSH-instellingen aanpassen

Ik heb het ~/.ssh/config bestand van de SSH-client zo ingesteld dat er om de paar minuten keep-alive pakketten worden verzonden. Met deze instelling kan de SSH-verbinding de sessie behouden door regelmatig pakketten te verzenden.

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 5

Hierbij staat ServerAliveInterval voor het interval (in seconden) waarin de client pakketten naar de server verzendt, en ServerAliveCountMax geeft het aantal pogingen aan bij een mislukking. Deze instellingen zorgen ervoor dat de sessieverbinding niet wordt verbroken.

2. Gebruik tmux of screen

Om ervoor te zorgen dat de Django-ontwikkelserver niet stopt wanneer de SSH-sessie wordt verbroken, heb ik terminal multiplexerprogramma's zoals tmux of screen gebruikt. Wanneer je de Django-server start met tmux, blijft de server draaien, zelfs als de SSH-sessie is beëindigd. Bijvoorbeeld, het proces om de Django-server via tmux te starten is als volgt:

# Creëer een tmux sessie
tmux new -s django_session

# Start de Django-ontwikkelserver
python manage.py runserver

Na het starten van de Django-server, kun je weer verbinden met de sessie met tmux attach -t django_session, zelfs als de SSH-sessie is beëindigd.

3. Instellen als achtergrondservice met systemd

De meest bevredigende methode van de drie bleek het beheren van de Django-server als een service met systemd. Met systemd kan de ontwikkelingsapplicatie altijd op de achtergrond draaien, onafhankelijk van de SSH-sessie, wat zorgt voor een betrouwbare werking van de server. Bovendien is er een groot voordeel in het kunnen ontwikkelen en testen in een omgeving die bijna identiek is aan de productieomgeving. De stappen om de Django-applicatie als service in te stellen met systemd zijn als volgt:

Eerst maak je het bestand /etc/systemd/system/my_django_app.service en voeg je de volgende inhoud in:

[Unit]
Description=Mijn Django-applicatie
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

Na deze instellingen kan de service worden gestart met het commando systemctl start my_django_app en kan deze worden ingesteld om automatisch op te starten bij het opnieuw opstarten van de server met systemctl enable my_django_app. Na codewijzigingen kan de service opnieuw worden opgestart met systemctl restart my_django_app om de wijzigingen door te voeren. Het belangrijkste voordeel is dat na één keer instellen de server niet handmatig hoeft te worden opgestart, behalve in bijzondere gevallen.

Je kunt de testomgeving opbouwen alsof het een echte productieomgeving is, en na de installatie is er geen constante noodzaak om de server te beheren, wat het efficiënt maakt. Als je deze methode nog nooit hebt geprobeerd, raad ik je ten zeerste aan om het een keer te doen.

Conclusie

Met de bovengenoemde methoden heb ik het probleem van het beëindigen van de SSH-sessie opgelost en de Django-ontwikkelserver stabiel kunnen draaien. Vooral door de server als een achtergrondservice via systemd te voeren, kan de ontwikkeling en controle plaatsvinden in een omgeving die dicht bij de productieomgeving ligt, wat de operationele efficiëntie aanzienlijk heeft verbeterd. Dit zal een nuttige tip zijn voor iedereen die in een externe ontwikkelomgeving werkt.

SSH, tmux, en systemd illustratie