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.
댓글이 없습니다.